MariaDB 백업/복구 및 자동백업(Crontab)

    DB를 운영하다 보면 예상치 못하게, 데이터베이스나 테이블이 깨지는 경우가 발생할 수 있습니다. MariaDB(Mysql) 자체에 체크(check), 복구(repair) 기능이 있지만, 이것으로도 해결을 못하면 말 그대로 데이터가 날아가게 됩니다. 일반적으로 자동으로 발생하는 경우는 드물며, 정전으로 인해 서버가 갑자기 죽어서 DB를 재시작하거나 데이터를 이전 복구하는 경우에 많이 발생합니다. 때문에 주기적으로 백업을 할 필요가 있습니다. 여기서는 백업/복구 및 자동으로 백업하는 방법을 알아보도록 하겠습니다.

    [테스트 환경]

    □ OS : Rocky Linux release 8.5 (Green Obsidian)

    □ DB : 10.6.7-MariaDB


    ■ 데이터베이스 전체 백업

    [root@localhost ~]# mariadb-dump -u [아이디] -p[패스워드] --all-databases > [백업파일명].sql

    ※ 기존처럼 mysqldump 명령어를 사용해도 됩니다. 전체 백업은 --all-databases 옵션을 사용합니다.

    ※ 특수문자 오른쪽 부등호[ > ] 모양으로 주의해주시기 바랍니다. 저는 자연스럽게 오른쪽 꺾쇠라고 읽고 있는데 검색해보니 꺾쇠라는 말이 인테리어 건축 쇠붙이에서 따온 것 같네요.

     

    ■ 데이터베이스 전체 복구

    [root@localhost ~]# mariadb -u [아이디] -p[패스워드] < [백업파일명].sql

    ※ 기존처럼 mysql 명령어 사용 가능, 반대로 특수문자 왼쪽 부등호[ < ] 모양으로 주의해주시기 바랍니다.

    ※ 데이터를 복구를 할 때 데이터베이스 또는 테이블을 삭제하고 다시 만든 후에 백업한 시점의 값을 넣기 때문에 새로 업데이트된 데이터는 없어지며, 복구 도중에 업데이트되는 것을 방지하기 위해 테이블 LOCK 걸었다가 복구가 되면 다시 UNLOCK을 푸는 작업을 합니다. 


    ■ 특정 데이터베이스 백업

    [root@localhost ~]# mariadb-dump -u [아이디] -p[패스워드] [데이터베이스명][백업파일명].sql

     

    ■ 특정 데이터베이스 복구

    [root@localhost ~]# mariadb -u [아이디] -p[패스워드] [데이터베이스명][백업파일명].sql


    ■ 데이터베이스의 특정 테이블만 백업

    [root@localhost ~]# mariadb-dump -u [아이디] -p[패스워드] [데이터베이스명] [테이블명][백업파일명].sql

     

    ■ 데이터베이스의 특정 테이블만 복구

    [root@localhost ~]# mariadb -u [아이디] -p[패스워드] [데이터베이스명][백업파일명].sql

    ※ 특정 테이블만 복원할 때는 해당 데이터베이스명만 선택하면 됩니다.


    ■ 데이터베이스의 자동 백업 Crontab사용

    ①. 백업을 저장할 폴더를 먼저 생성합니다.

    ※ 데이터가 클수록 파일 시스템 공간 여유가 있는 곳을 잡아주시기 바랍니다. 아래는 예시입니다. 

    [root@localhost ~]# mkdir /home/db_back

     

    ②. 자동 백업 스크립트를 작성합니다.

    ※ 스크립트는 관리자마다 천차만별입니다. 정답은 없으며 아래는 가장 많이 쓰이는 방법입니다.

    [root@localhost ~]# mkdir /root/script  [스크립트 파일을 관리하기 위해 별도 폴더 생성]

    [root@localhost ~]# cd /root/script  [경로 이동 후]

    [root@localhost ~]# vi db_backup.sh  [스크립트 파일 생성하여 아래의 값을 저장]

    #!/bin/bash

    DATE=$(date +%Y%m%d)

    BACKUP_DIR=/home/db_back/
    mariadb-dump -u zabbix -ptest123 zabbix > $BACKUP_DIR"zabbix-backup_"$DATE.sql
    find $BACKUP_DIR -ctime +3 -exec rm -f {} \;

    [참고]

    □ DATE=$(date +%Y%m%d) 시스템의 현재 시간을 표시합니다.

    %y%m%d는 각각 년/월/일 표시입니다. [대소문자 구분할 것]

    zabbix-backup_%y.sql → zabbix-backup_22.sql  [년도 표시, 소문자]

    zabbix-backup_%Y.sql → zabbix-backup_2022.sql  [년도 표시, 대문자]

    zabbix-backup_%Y%m.sql → zabbix-backup_202203.sql

    zabbix-backup_%Y%m%d.sql → zabbix-backup_20220309.sql

     

    %H%M%S 는 각각 시/분/초 표시이다. [좀 더 세부적인 시간을 표시할 경우]

    zabbix-backup_%Y%m%d-%H%M%S.sql → zabbix-backup_20220309-010533.sql

    중간에 하이픈[ - ]을 넣으면 좀더 구분하기 편합니다. 2022년 03월 09일 - 01시 05분 33초

     

    □ BACKUP_DIR = 백업 경로입니다.

    꼭 변수값으로 쓸 필요는 없습니다. $BACKUP_DIR 부분을 사용 안하고 바로 /home/db_back/ 절대 경로로 바로 입력해도 됩니다. 나중에 경로가 바뀔 것을 대비하여 편하게 적용하기 위한 방법

     

    □ mariadb-dump -u [아이디] -p[패스워드] [데이터베이스명] > $BACKUP_DIR"[임의 이름]_"$DATE.sql

    패스워드 부분은 -p 바로 뒤에 띄어쓰기 없이 바로 붙이기 바랍니다.

     

    □ find $BACKUP_DIR -ctime +3 -exec rm -f {} \;

    백업 파일이 지속적으로 늘어나서 시스템 파일 용량이 늘어나는 것을 방지하기 위해 find와 ctime명령어를 이용하여 ctime속성 기준으로 +3의 기간이 지나면 삭제(5일 이상이 지났을 때 백업 파일이 4~5개를 유지하면 됩니다.)

     

    ③. 실행 권한 부여

    [root@localhost ~]# chmod 711 db_backup.sh
    [root@localhost ~]# ll
    -rwx--x--x 1 root root 188 Mar  9 13:46 db_backup.sh

     

    ④. 스크립트 실행(테스트) 및 생성 확인

    [root@localhost ~]# ./db_backup.sh  [실행]

    [root@localhost ~]# ll /home/db_back/  [경로 백업 파일 생성 확인]
    -rw-r--r-- 1 root root 8340298 Mar  9 14:09 zabbix-backup_20220309.sql

     

    ⑤. 자동 백업 실행(Crontab) 등록

    스크립트를 작성한 경로를 입력합니다. 보통 사용시간이 적은 새벽시간에 돌아가도록 합니다.

    예시에는 매일 새벽 2시에 돌아가도록 등록합니다.

    [root@localhost ~]# crontab -e

    00 02 * * * /root/script/db_backup.sh

    [root@localhost ~]# crontab -l  [등록 확인]
    00 02 * * * /root/script/db_backup.sh


    이렇게 백업/복구 및 자동 백업에 대해서 알아보았습니다. 다음에는 좀더 심화적으로 넘어가기 전에 DB 클라이언트 프로그램이 어떤게 있는지 먼저 포스팅 하도록 하겠습니다.

    Designed by JB FACTORY