반응형

[C / C++]간단한 c 프로그램과 cron으로 mysql 백업을 편하게...

조명진 2007-08-27 23:11:13 주소복사  조회 359 스크랩 0

shellbru

db가 커질수록 행여 db가 깨질 지 않을까 걱정이 커집니다.
다음의 간단한 c소스를 이용해서 db 백업을 편하게 해보세요.

/* mysqldump.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

/*mysql db backup program
cron데몬을 이용하여 mysql db를 정기적으로 백업해 주는 프로그램

##############################################################################
[ 알고리즘 ]
mysql에서 지원하는 mysqldump 명령을 이용하여, 지정된 디렉토리에
dump한 sql 파일을 저장한다.
자동화를 위하여 크론 데몬을 이용하며, 새로 생성되는 디렉토리는
날짜와 시간으로 디렉토리명을 생성하여 디렉토리 중복을 방지한다.
[ usage ]

수정할 부분은 mysqldump 명령어가 존재하는 경로와 백업할 db명을
적어 놓은 list.txt파일이다.
mysqldump.c(본 파일)를 열어서 "sprintf ( sys, "/usr/local/bin/mysqldump....."
부분을 자신의 mysqldump파일이 있는 경로로 바꾸어준다. mysql을 /usr/local에서
소스 컴파일하여 설치하였다면 그대로 두어도 무방하다.
다음으로 list.txt를 열어서 수정하자. 맨 첫줄에는 백업 파일들이 위치할 경로를
적어준다. 이때 그 경로는 이미 존재하고 있어야 한다.
두번째 줄부터 한 줄에 한개씩 백업하고자 하는 db명을 적어나가면 된다. 불필요한
스페이스나 개행은 해서 안된다.

마지막으로 list.txt와 mysqldump.c를 실행하고자 하는 크론 영역에 복사하자.
매시간마다 백업받고자 한다면, /etc/cron.hourly/에 복사하고,
매일(새벽 4시가 기본) 백업받고자 한다면 /etc/cron.daily에 복사한다.
크론에 대해서 잘 아는 사람은 자신이 알아서 crontab파일을 편집해서
원하는 시간에 백업받을 수 있다.

준비가 다 되었으면 컴파일한다. 그냥 make mysqldump라고 해주면 mysqldump라는
실행파일이 생긴다.

이제 설치는 다 된것이다. 시험 삼아 실행해 보자. ./mysqldump 지정된 디렉토리에
현재 시각으로 된 디렉토리가 생성되고, 그 안에 db의 sql 파일이 dump되어 있으면
된것이다.

이제 가만히 두어도 크론 데몬에 의해 자동으로 백업받아질 것이다.
이 방법으로 서버의 하드디스크에 백업을 받아 놓더라도 만약에 사태에 대비해 반드시
원격지의 백업 서버나 자신의 로컬 컴퓨터에 복사본을 정기적으로 받아 놓자. 이것 역시
좀만 머리를 쓰면 되지 않을까?

expect 스크립트를 이용해서 해보려고 계획하고 있음 ^^;

[License]
이 소스는 GPL(Gnu public License)를 따릅니다. 소스의 변형, 재배포는 자유롭습니다.
다만 재배포시 본 License 조항은 삭제하지 말아 주세요

19991213 Shellbru
shellbru95@hanmail.net

소스는 넘 간단한데 서실이 넘 길었나? 초보분들을 위한 것이니 양해 해 주세요 ^^;

아참 파일들이 저장되는 디렉토리는 다른 user가 접근하지 못하도록

퍼미션을 맞춰 놓으세요.

chmod 700 ....
##############################################################################
*/


char name[100][50];

main ( void )
{
  FILE *fp;
  char line[128], sys[512], path[128];
  int i, num;
  time_t t;
  struct tm *tt;

  /* list.txt파일의 경로를 맞게 고친다. */
  fp = fopen ( "/etc/cron.daily/list.txt", "r" ); 

  if ( fp == NULL )
  {
     printf ( "list.txt file not foundn" );
     exit (1 );
  }
  fgets ( path, sizeof ( path ), fp );
  strtok ( path, " rn" );
  for ( i = 0; ; i ++ )
  {
     if ( ( fgets ( line, sizeof ( line ), fp ) ) == NULL )
       break;
     strtok ( line, " rn" );
     sprintf ( name[i], "%s", line );
  }

  num = i;
  t = time ( 0 );
  tt = localtime ( &t );
  sprintf ( sys, "mkdir %s%02d%02d%02d", path, tt->tm_mon+1, tt->tm_mday, tt->tm_hour );

  system ( sys );

  for ( i = 0; i < num; i ++ )
  {
     /* 아래의 경로를 맞게 수정하세요 */
     sprintf ( sys, "/usr/local/bin/mysqldump %s > %s%02d%02d%02d/%s.sql", name[i], path, tt->tm_mon+1, tt->tm_mday, tt->tm_hour, name[i] ); 
     system ( sys );
  } 
}


/* list.txt */

/backup/sql/
address
board
cigarett
guestbook
juhlee
mysql
test
user
nclick
shellbru

 

<이상>

반응형

+ Recent posts