database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Devel 16661 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 16661
[C Src] MySQL Optimize 0.1pre10 [소스]
작성자
정재익(advance)
작성일
2002-07-30 00:02
조회수
9,957

[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를 하려니 영 적응이 않되네요

 

빨리 공부해죵,.^^

[Top]
No.
제목
작성자
작성일
조회
20896MySQL CAPI [1]
정재익
2004-01-26
14008
20895MySQL ADO 사용 [1]
정재익
2004-01-26
12598
17897MySQL2006에러(..gone away)
김태훈
2002-11-22
7572
16661[C Src] MySQL Optimize 0.1pre10 [소스]
정재익
2002-07-30
9957
16572MYSQL C++ API를 이용한 QUERY결과 가져오기 소스와 컴파일 [1]
정재익
2002-07-22
12927
16233[프로그램] DB 이용한 컨텐츠 관리 시스템
문태준
2002-06-12
11353
15744MySQL 에러코드별 에러메세지 입니다.
강병권
2002-04-18
23862
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.030초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다