[C Src] MySQL Optimize 0.1pre10 [소스]
원본출처 : http://www.openphp.com/board/board_center.html?Type=View&tb_name=board_mysql_study&id=13&start=0&id_no=12
/*
======================================================
본 소스의 저작권자 : 조성준
저작권자 홈펭지 : http://www.openphp.com
연락처 : eggtech@orgio.net / openphp@openphp.com
라이센스 : GPL ( GNU Public License)
작성일 : 2001년 06월 30일
P/G명 : 성준이의 MySQL DB Optimize & Check 0.1pre10
테스트 시스템 : Linux , MySQL 3.23.X Or Higher Version
======================================================
컴파일 방법 ( GCC )
// Debug Mode
gcc -O6 -mpentiumpro -Wall -o optdb optdb.c -I/usr/local/mysql/include/mysql -L/usr/local/mysql/lib/mysql -lmysqlclient
// Complie Mode
gcc -O6 -mpentiumpro -o optdb optdb.c -I/usr/local/mysql/include/mysql -L/usr/local/mysql/lib/mysql -lmysqlclient
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql.h>
#include <unistd.h>
#include <time.h>
struct dbmysql
{
char *host;
char *dbid;
char *dbpw;
}a;
int filed,cnt,e,s_cnt,i,counter = 1;
MYSQL_RES* res;
MYSQL_ROW row;
MYSQL mysql;
FILE *inf;
void DBopt(char *dbname[],int sel);
void ErrorMsg(char *msg1);
void closeDB(void);
char *get_date(void);
char *get_time(void);
char *time_to_string(int);
void connectDB(void);
int main()
{
int sel;
char *dblist[40];
mysql_init(&mysql);
system(\clear\);
reloadquestion: ;
// MySQL DB연결
connectDB();
// 현재 연결된 디비의 모든 테이블 쿼리
if(mysql_query(&mysql, \show databases\))
{
ErrorMsg(\디비 리스트를 뽑아 오지 못함\);
}
res = mysql_store_result(&mysql);
filed = mysql_num_fields(res);
// 설명문 추가
printf(\n\);
printf(\/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/\n\);
printf(\/ /\n\);
printf(\/ MySQL Database Optimizer&check /\n\);
printf(\/ /\n\);
printf(\/ 제작자 : 조성준 (Cho Sung Jun) /\n\);
printf(\/ 연락처 : eggtech@orgio.net /\n\);
printf(\/ 연락처 : openphp@openphp.com /\n\);
printf(\/ 홈페이지 : http://www.openphp.com /\n\);
printf(\/ 버전 : 0.1pre10 /\n\);
printf(\/ 수정일 : 2001-06-29 /\n\);
printf(\/ /\n\);
printf(\/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/\n\);
printf(\n\);
printf(\n\);
printf(\0. All Tables Optimize [Testing]\n\);
while(row = mysql_fetch_row(res))
{
for(i = 0 ; i < filed ; ++i)
{
dblist[counter] = row[0];
printf(\%d. %s Tables \n\,counter,row[0]);
counter++;
}
}
printf(\n최적화할 데이타 베이스를 선택 하십시요 ? : \);
scanf(\%d\,&sel);
// 버그 수정용
//printf(\n\n%s\n\n\,dblist[cnt]);
if(sel > counter)
{
system(\clear\);
counter = 1;
goto reloadquestion;
}
DBopt(dblist,sel);
// 디비를 닫는다.,
closeDB();
}
// 디비 최적화만 따로 함수로 만듬.
void DBopt(char *dbname[],int sel)
{
int failcounter = 0;
char *opt = (char *) malloc(200);;
s_cnt = sizeof(dbname);
// 현재 디비로 연결한다
if(mysql_select_db(&mysql,dbname[sel]))
{
ErrorMsg(\데이타 베이스가 없습니다.\);
}
// 현재 연결된 디비의 모든 테이블 쿼리
if(mysql_query(&mysql, \show tables\))
{
ErrorMsg(\디비 리스트를 뽑아 오지 못함\);
}
res = mysql_store_result(&mysql);
filed = mysql_num_fields(res);
counter = 0;
//printf(\n Good Choise Database : %s\n\n\,dbname[sel+1]);
printf(\n\);
// 로그 파일들 이미 만들어 둔당..
inf = fopen(\sungzun-mysql-opt-error.log\,\a\);
// 선택된 디비의 테이블을 읽어 와서 최적화 합니당.
while(row = mysql_fetch_row(res))
{
for(i = 0 ; i < filed ; ++i)
{
// MyISAM 타입의 디비인 경우
stpcpy(opt,\OPTIMIZE TABLE \);
strcat(opt,row[0]);
//printf(\nQuery : %s\,opt);
// 먼저 최적화 한다...Index Sort 등등
if(!mysql_query(&mysql,opt))
{
printf(\[최적화 실패] 테이블에 문제가 발생 하였습니다. %s \n\,row[0]);
//로그 파일을 만든다.
fprintf(inf,\[%s %s] Error Table Name : %s / %s\n\,get_date(),get_time(),row[0]);
++failcounter;
}
// 메모리 활당한걸 푼다...
free(opt);
++counter;
}
}
// 파일을 닫아 부러
fclose(inf);
//system(\clear\);
printf(\n\n\);
printf(\/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/\n\);
printf(\ \n\);
printf(\ \x1b[36m최적화 정보\x1b[37m \n\);
printf(\ \n\);
printf(\ 최적화한 데이타 베이스명 : %s \n\,dbname[sel]);
printf(\ 작업 대상 테이블 갯수 : %d \n\,counter);
printf(\ 최적화 되지 못한 데이블 갯수 : %d \n\,failcounter);
printf(\ 최적화된 테이블 갯수 : %d \n\,counter-failcounter);
printf(\ \n\);
printf(\/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/\n\);
printf(\n\n\);
mysql_free_result(res);
exit(0);
}
// 날짜는 구한다.
char *get_date(void)
{
char *temp = (char *) malloc(sizeof(char) * 20);
time_t tm_t;
struct tm *t;
tm_t = time(NULL);
t = localtime(&tm_t);
sprintf(temp,\%d-%s-%s\ , t->tm_year+1900,time_to_string(t->tm_mon+1) ,time_to_string(t->tm_mday) );
return temp;
free(temp);
}
// 시간 구하기
char *get_time(void)
{
char *temp = (char *) malloc(sizeof(char) * 20);
time_t tm_t;
struct tm *t;
tm_t = time(NULL);
t = localtime(&tm_t);
sprintf(temp,\%s:%s:%s\ , time_to_string(t->tm_hour) ,time_to_string(t->tm_min) ,time_to_string(t->tm_sec) );
return temp;
free(temp);
}
// int 한자리를 char 두자리로
char *time_to_string(int temp_int)
{
char *temp_str = (char *) malloc(sizeof(char) * 2);
if( temp_int < 10 ) sprintf(temp_str,\0%d\,temp_int);
else sprintf(temp_str,\%d\,temp_int);
return temp_str;
free(temp_str);
}
// 디비 연결
void connectDB(void)
{
// 디비 접속 설정 부분 입니다..
a.host = \;// 접속 호스트
a.dbid = \;// 접속 아이디 보통 Root로 하세요
a.dbpw = \;//접속 패스워드 root 패스로 하시면(Mysql DB의 Root) 다른 디비 모두 됩니당.
if(!mysql_real_connect(&mysql, a.host, a.dbid, a.dbpw, NULL ,3306, (char *)NULL, 0)) ErrorMsg(\MySQL 연결이 되지 못했습니다\);
}
// 에러 메세지 출력
void ErrorMsg(char *msg1)
{
//화면 이쁘게 보이기 위해서리....
printf(\/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/\n\);
printf(\t%s\,msg1);
printf(\n\n\tError Meassage : %s\n\, mysql_error(&mysql));
printf(\/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/\n\);
exit(-1);
}
// 디비 연결 해제
void closeDB(void)
{
mysql_free_result(res);
mysql_close(&mysql);
}
================================ 소스 끝 ===========================
이제 이 소스를 컴파일하는 방법에 대한 글입니다.
안녕 하세요? 조성준입니다...
심심해서 만들어 보았습니다. 예전에 PHPschool.com에 온린건
좀 단순 무식 과격해서 조금 고치고 추가 했습니다.
C 를 모르시는 분은
// DB로그인 아이디
dbid = \;
// DB로그인 패스워드
dbpw = \;
// DB 이름...쯕 Name ^^
dbname = \;
위 부분만 바꾸시고 다음의 방법으로 하시면 됩니다.
처음 해야 할것은 당연히 Gcc나 cpp컴파일러가 있어야 하구요
MySQL은 당연히 깔려 있어야 합니당.
먼저 컴파일한 계정의 .bash_profile에 아래의 줄을 삽입 하세요
export LD_LIBRARY_PATH=/www/mysql/lib/mysql:LD_LIBRARY_PATH
추가 하시고 source .bash_profile로 설정한것을 등록 하시고 하시기
바랍니다.
컴파일 옵션은 아래에 있는 것입니다 위의 셋팅과 아래의 컴파일 옵션은
각자의 MySQL설치 위치에 맞게 하시면 됩니다.
gcc -o test test.c -I/www/mysql/include/mysql -L/www/mysql/lib/mysql -lmysqlclient
VI나 에디터로 test.c로 세이브하고 컴파일 하시면
test라고 나옵니다. 그걸 실행 하시면 알게 되구용
아래에 한글로
이것을 Cron Tab에 등록해서 하면 DB Optimize를 따로 할필요 없습니다.
아직 간단한거지만 MySQL C API쪽 다 탐독되면
좀더 고급형으로 만들까 합니다. 옵티마이저와 체크
정도가 아닌 자동복구 등등을용 ^^ 앞으로 쭈욱....
요즘 C를 공부를 다시하다보니 이건 PHP에 쉽움에 적은이
되서 C를 하려니 영 적응이 않되네요
빨리 공부해죵,.^^
|