MySQL 단순 백업
MySQL은 일반적으로 /usr/local/mysql 디렉토리에 설치한다. 여기서는 /usr/local/mysql/data 디렉토리를 데이터베이스 파일이 위치한 디렉토리로 설명한다. 이 디렉토리 아래에 MySQL의 각 데이터베이스명과 동일한 디렉토리 이름들이 잇다. 각각의 디렉토리들이 하나의 데이터베이스이다.
가장 간단한 MySQL 백업은 데이터베이스 파일이 위치한 디렉토리를 압축하여 보관하는 것이다.
#!/bin/bash
from_backup_dir="/usr/local/mysql/data"
to_backup_dir="/backup/"
today=`date +%Y%m%d`
tar cvfz ${to_backup_dir}${today}.tar.gz ${from_backup_dir}
위와 같이 하면 각 데이터베이스를 구분하지 않고 하나의 아카이브 압축파일로 보관하게 된다. 그러므로 사용자별로 백업 파일을 복구할 경우에는 불편하다.
이번에는 각 디렉토리별로 백업하는 스크립트를 보도록 하겠다.
#!/bin/bash
from_backup_dir="/usr/local/mysql/data/"
to_dir="/backup/"
today=`date +%Y%m%d`
source_dir=`ls -l "$from_backup_dir" | grep ^d | awk '{print $9}'`
for i in `echo $source_dir`
do
tar cfz ${to_dir}${today}${i}.tar.gz ${from_backup_dir}${i} 2>/dev/null
done
mysqldump를 이용한 백업
위와 같이 데이터베이스 파일을 그래로 압축해서 백업해 놓은 방식은 문제점이 잇다. 파일로 직접 백업본을 만들어 놓을 경우, 복구할 때 리눅스 배포판이나 버전이 다를 경우, 시스템 아키텍처가 다를 경우 복구가 안 되는 경우가 많다.
따라서 MySQL을 백업할 떄는 MySQL 자체적으로 지원되는 mysqldump 유틸리티를 이용하는 경우가 많다. mysqldump 유틸리티는 데이터베이스의 내용을 텍스트 파일에 SQL 문을 이용하여 백업한다. 이렇게 백업된 파일은 vi 편집기로 볼 수 있다.
우선 콘솔에서 현재 데이터베이스가 어던 것들이 있는지 알아보자
echo "show databases;" | mysql -u root -p
명령 중에서 '|' 다음에 있는 'mysql -u root -p'부분은 MySQL에 접속하기 위한 명령이다. 유저가 root이고 패스워드 옵션을 넣었다. 다음 라인에서 패스워드를 물어보게 되고, 알맞게 입력하면 원하는 쿼리문을 볼 수 잇다.
데이터베이스 중에서 damada라는 데이터베이스가 있다고 가정하고 이를 mysqldump 유틸리티를 이용하여 백업해 보겠다.
mysqldump amanda -u root -p > amanda.sql
amanda라는 데이터베이스를 라이디렉션을 통하여 현재 디렉토리에 amanda.sql이라는 파일로 저장했다. amanda.sql 파일은 vi 편집기로 볼 수 있는 텍스트 파일이다.
mysqldump의 '--all-databases'옵션으로 모든 데이터베이스를 한 번에 백업할 수 있다.
mysqldump --all-databases -u root -p > AllMySql.sql
root의 패스워드를 입력하면 AllMySql.sal이라는 파일로 현재의 모든 데이터베이스가 백업된다. 여기서 root는 리눅스이 슈퍼유저 계정인 root와 다르다.
다음은 '--all-databases'옵션을 이용하여 전체를 백업하는 스크립트이다.
#!/bin/bash
to_dir="/backup/"
today=`date +%Y%m%d`
mysqldump --all-databases -u root -pshell > ${to_dir}${today}mysql.sql
마지막 라인에서 '-pshell'은 MySQL 접속 시에 root의 패스워드인 'shell'을 -p 옵션과 같이 붙여서 적은 것이다.
이번에는 각 데이터베이스마다 백업을 하는 스크립트를 만들어보도록 하겟다. 우선 각 데이터베이스의 이름을 가져오는 방법으로 앞에서 사용했던 ls 명령과 awk를 이용했던 방법 대신에 다음과 같은 스크립트를 사용한다.
echo "show databases" | mysql -u root -pshell | grep -v Database
출력화면에서 가장 윗중에 나타나는 'Database'라는 문자를 없애주기 위해서 grep의 '-v' 옵션을 사용하였다.
각 데이터베이스별로 mysqldump를 이용하여 백업한 후에 전체 파일을 하나의 파일로 압축한다. 따라서 각 데이터베이스별 백업파일을 임시 디렉토리에 만든 후에 압축하고, 임시 디렉토리를 삭제하면 된다.
다음은 전체 스크립트 소스이다.
#!/bin/bash
to_dir="/backup/"
today=`date +%Y%m%d`
tmp_dir="${to_dir}${today}/"
A=`echo "show databases" | mysql -u root -pshell | grep -v Database`
mkdir ${tmp_dir}
for i in `echo $A`
do
mysqldump ${i} -u root -pshell > ${tmp_dir}${i}.sql
done
tar cfz ${to_dir}${today}MySQL.tar.gz ${tmp_dir} 2>/dev/null
rm -rf $tmp_dir