본문 바로가기

Dev/linux

Linux에서의 Shell & crontab을 이용한 Mysql 데이터베이스 백업

 

본 포스팅은 리눅스에서 Shell과 crontab 반복 예약 작업 기능을 활용해서 정해진 날짜, 시간에 데이터베이스의 자료를 sql 파일 형태로 백업하는 방법을 기록합니다.

 

테스팅 환경은 Ubuntu Linux, Arch Linux, raspbianOS입니다.

본 예제에서는 백업의 대상이 될 테스트용 데이터베이스와 테이블 생성을 포함하고 있습니다.

그리고 리눅스에는 mysql-server 패키지가 설치되어 있어야 합니다. (mariaDB도 가능합니다.)

 

 

1. 백업할 DB와 TABLE 정의

먼저, mysql에 접속해서 아래의 명령어로 테스트용 데이터베이스와 테이블을 작성합니다.

mysql> create database test;
mysql> use test;
mysql> create table test_db (id int, name char(10));
mysql> insert into test_db(1,'AAA');
mysql> insert into test_db(2,'BBB');

 

 

테이블이 제대로 세팅되었는지 확인합니다.

 

 

이제 exit 명령으로 mysql을 빠져나옵니다.

 

2. 백업 디렉터리 생성 및 shell 스크립트 작성

저는 /home 디렉터리에 db_backup이라는 폴더를 만들어 이곳에서 데이터 베이스 백업과 관련된 자료들을 관리할 것입니다.

아래의 명령어로 디렉터리를 생성하고 이동해 주세요.

$ sudo mkdir /home/db_backup

 

이제, 이곳에 데이터베이스에 접근해서 백업하기 위한 Shell 스크립트를 작성해야 합니다.

여기서 MySQL을 사용하는 환경이라면(mariaDB가 아닙니다.) MySQL 로그인 패스 설정을 추가로 해 주어야 합니다.

mariaDB는 mysql_config_editor 명령이 없기 때문에, 쉘에서 직접 계정과 패스워드를 입력해 주겠습니다.

 

 

쉘을 통해서 데이터 베이스로 접근할 때 유저 정보와 패스워드 정보를 넣게 되는데, 이렇게 할 경우 MySQL 5.6 이상에서는 쉘에 패스워드를 직접 넣지 말라고 경고를 띄워줍니다.

 

이럴 때는 mysql_config_editor를 이용해 로그인 정보를 설정하고, 쉘에서는 그 로그인 정보만 알려주는 방식으로 해결할 수 있습니다.

 

아래의 명령어로 로그인 정보를 설정합니다.

$ mysql_config_editor set --login-path=[path name] --host=[host addr] --user=[account name] --password --port=[port number]

 

여기서 --login-path=[path name]는 아무 이름이나 넣어도 무관합니다.

로컬에서만 사용할 경우 --host=localhost --port=3306으로 설정합니다.

--user는 MySQL 계정을 입력합니다.

 

아래의 명령어로 로그인 정보가 제대로 반영되었는지 확인합니다.

$ mysql_config_editor print --login-path=[path name]

 

위 사진과 유사한 형태라면 정상적으로 로그인 정보가 등록된 것입니다.

이제 /home/db_backup 디렉터리에 db_backup.sh이라는 이름으로 파일을 하나 생성하고 에디터를 이용해 아래의 정보를 작성합니다.

 

$ sudo vim /home/db_backup/db_backup.sh
#!bin/sh

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

# MySQL에 접속해서 특정 DB의 데이터를 db_backup 디렉터리에 저장한다.

# [MySQL의 경우...]
/usr/bin/mysqldump --login-path=[path name] [DB name] > /home/db_backup/mysql_back_${DATE}.sql

# [MariaDB의 경우...]
/usr/bin/mysqldump -u[user] -p[password] [DB name] > /home/db_backup/mysql_back_${DATE}.sql


# 함부로 지울 수 없도록 파일의 소유권을 root로 지정
chown root:root /home/db_backup/mysql_back_${DATE}.sql
  
# root 이외의 계정은 열람만 가능하고 수정은 불가 하도록 권한 설정
chmod 755 /home/db_backup/mysql_back_${DATE}.sql

 

생성한 db_backup.sh 파일에 실행 권한을 부여합니다.

$ $ sudo chmod +x /home/db_backup/db_backup.sh

 

이제 스크립트 준비는 완료되었습니다.

 

3. crontab 등록

작성한 스크립트를 정기적으로 실행하기 위해 crontab에 스캐쥴을 등록해야 합니다.

 

여기서 Arch Linux의 경우 crontab 서비스가 기본적으로는 없습니다.

Arch Linux 사용자인 경우, 아래의 명령어로 cronie 패키지를 설치합니다.

$ sudo pacman -Sy cronie
$ sudo systemctl enable --now cronie.service

 

이제 스케줄을 등록합니다.

$ sudo EDITOR=vim crontab -e

# 아래의 내용을 작성

# Run every hour at 0
0 0 * * * /bin/sh /home/db_backup/db_backup.sh > /dev/null 2>&1

여기서 0 0 * * * 의 의미는 매일 0시 0분마다 home/db_backup/db_backup.sh 스크립트를 실행한다는 의미입니다.

시간 정의에 대해서는 아래의 링크에서 자세한 정보를 확인할 수 있습니다.

 

zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EB%B0%98%EB%B3%B5_%EC%98%88%EC%95%BD%EC%9E%91%EC%97%85_cron,_crond,_crontab

 

리눅스 반복 예약작업 cron, crond, crontab - 제타위키

cron, cronie, crond, cron daemon, crontab, cron job, crontab job 크론, 크론 데몬, 크론탭, 크론작업, 리눅스 작업 스케줄러 /usr/sbin/crond /usr/bin/crontab 프로세스 예약 데몬 리눅스용 작업 스케줄러 특정시각에 명�

zetawiki.com

저는 개인적으로 사용하고 있는 라즈베리파이에서 mariaDB 백업을 위 설정을 이용해 백업 파일을 관리하고 있습니다.

 

이것으로 Shell 스크립트와 crontab 반복 예약 작업을 이용한 DB 백업 포스팅을 마치겠습니다.