MySQL ibbackup
from MySQL Enterprise Backup | http://www.innodb.com/products/hot-backup/
1.
ibbackup
ibbackup 은 innodb 사에서 만든 InnoDB용 백업 프로그램이며 InnoDB Hot Backup 에서 MySQL Enterprise
Backup 으로 이름이 변경되었다.
특징으로는 MySQL 의
Process 에 영향 없이 Hot Backup 이 가능하다.
*유료 프로그램으로
따로 구매해야 한다.*
ibbackup 을 사용해 생성한 파일에는 추가적으로 Recover 작업이 필요하다. MySQL 에서 일어나는 작업과 상관없이 파일을 복제하기 때문에 생성된 파일과 파일은 데이터의 시간이 일관되지
않는다. 이를 맞춰주기 위한 작업으로 Recover 를 실시한다.
2.
ibbackup 구문
ibbackup my.cnf backup-my.cnf
위에서 이야기한 cnf 파일은 mysql 기동시 사용하는 configuration file 을 말함이다.
사용구문은 위와 같으며 ibbackup 의 my1.cnf, my2.cnf 사용하는 파라미터는 다음과 같다.
datadir
innodb_data_home_dir
innodb_data_file_path
innodb_log_group_home_dir
innodb_log_files_in_group
innodb_log_file_size
참고로 file path 는 절대경로여야 한다.
3.
ibbackup 도움말
#ibbackup --help 로 도움말을 조회할 수 있다.
Usage:
ibbackup
[--sleep ms] [--suspend-at-end] [--compress [level]]
[--include regexp] my.cnf
backup-my.cnf
or
ibbackup
--apply-log [--use-memory mb] [--uncompress] backup-my.cnf
or
ibbackup
--restore [--use-memory mb] [--uncompress] backup-my.cnf
--apply-log : 백업본에 log records 를 적용하고
backup-my.cnf 에 정의된 경로에 새로운 log file 을 생성한다.
--include regexp : regexp 에 정의된 per-table data files 만을 포함한다. reg_exp 는 db_name.table_name 이 들어간다. regular expression 은 POSIX 1003.2 “extended
form” 을 따른다. 실행예로 ‘sales\.den.* 은 sales database 의 den 으로 시작하는 테이블을 의미한다. (\ 는 메타문자를 비활성화
하는 기호이다.)
--sleep ms : 데이터 1메가 copy 때마다 지정한 miliseconds 만큼 sleep 한다. 백업을 진행하는 장비의 I/O 부하를 조정하기 위해 사용한다. default 값은 0 이다.
--suspend-at-end : 이 옵션을 사용하면 백업이 완료되는 시점에 backup-my.cnf 에
정의한 log group home dir 에
ibbackup-suspended 라는 파일을 생성하고 대기하게 된다. 이 파일을 삭제해야
백업이 완료된다. 이 옵션은 ibbackup 완료 시점에 MyISAM 테이블을 lock / back-up 하기위해 사용한다. 이 방법을 통해 InnoDB 와
MyISAM 테이블의 일관성 있는 스냅샷을 얻을 수 있다.
--use-memory mb : --apply-log 를 사용할 때만 유효하다. 이는 ibbackup 에 recovery 에 정의한 mb 만큼 메모리를 사용할 수 있다는 뜻이다. default 값은 100M 이다.
--compress : 압축된 백업본을 만들 때 사용한다. 파일이름.ibz 로
만들어진다. 압축레벨도 선택적으로 사용할 수 있다(0-9). 1은 가장 빠른 압축이고 9는
가장높은 압축률을 보여준다. default level 은 1이다.
--uncompress : 압축된 백업본에 대해 --apply-log 를 사용할 때 같이 사용되는 옵션이다.
백업 프로그램은 테이블의 .frm 에 대해 백업하지 않는다. 또 MyISAM 테이블에 대해 백업하지 않는다. 때문에 완전한 백업본을 위해 별도로 백업전 / 백업후의 .frm 을 복사해야 한다. 또
.frm 을 copy 하는 동안(위에 언급한
두개) 생성된 binary log 도 마찬가지로 백업해야
한다. 이는
mysqldump -l -d yourdatabasename
를 통해 백업할 수 있다. binlog 를 통해 두개의 .frm 카피본사이 (ibbackup 이 진행되는 기간) 에 일어난 변화를 확인할 수 있다.
4.
ibbackup 예제
my.cnf 와
backup-my.cnf 둘다 아래의 내용을 포함하고 있다. (file path 만 다르다.)
datadir=/home/mysql/mysql/data
innodb_data_home_dir
= /home/mysql/mysql/data
innodb_data_file_path
= ibdata1:18M
innodb_log_group_home_dir
= /home/mysql/mysql/data
innodb_log_file_size
= 5M
innodb_log_files_in_group=2
위 내용은 my.cnf 내용이며 backup-my.cnf 에는 ./data 가 아니라 ./data2 를 사용하였다.
<compress 사용 안하는 경우>
oracle32@/home/mysql/mysql/bin>./ibbackup
/home/mysql/mysql/conf/my.cnf /home/mysql/mysql/conf/my2.cnf
~ (라이선스 정보)~
Type ibbackup --license for detailed license
terms, --help for help
Contents
of /home/mysql/mysql/conf/my.cnf:
innodb_data_home_dir
got value /home/mysql/mysql/data
innodb_data_file_path
got value ibdata1:18M
datadir
got value /home/mysql/mysql/data
innodb_log_group_home_dir
got value /home/mysql/mysql/data
innodb_log_files_in_group
got value 2
innodb_log_file_size
got value 5242880
Contents
of /home/mysql/mysql/conf/my2.cnf:
innodb_data_home_dir
got value /home/mysql/mysql/data2
innodb_data_file_path
got value ibdata1:18M
datadir
got value /home/mysql/mysql/data2
innodb_log_group_home_dir
got value /home/mysql/mysql/data2
innodb_log_files_in_group
got value 2
innodb_log_file_size
got value 5242880
ibbackup: Found checkpoint at lsn 0 1597395
ibbackup: Starting log scan from lsn 0
1596928
110125 11:35:09 ibbackup: Copying log...
110125 11:35:09 ibbackup: Log copied, lsn 0 1597395
ibbackup: We wait 1 second before starting
copying the data files...
110125 11:35:10 ibbackup: Copying
/home/mysql/mysql/data/ibdata1
ibbackup: A copied database page was modified
at 0 1597395
ibbackup: Scanned log up to lsn 0 1597395
ibbackup: Was able to parse the log up to lsn
0 1597395
ibbackup: Maximum page number for a log
record 0
110125 11:35:11 ibbackup: Full backup completed!
위 텍스트를 보면 ibbackup 인자로 사용한 configuration file 의 어떤 파라미터를 사용하였는지 (파란색
파라미터) 그 내용을 확인할 수 있다. 사용되는 파라미터는
문두에 이야기 한 6개 파라미터 임을 확인할 수 있엇다.
백업을 완료한 후 data2 디렉토리에는 다음과 같은 파일들이
있다.
oracle32@/home/mysql/mysql/data2>ls -la
total 18468
drwxr-xr-x
2 mysql mysql 4096 Jan 25
11:35 .
drwxr-xr-x 15 mysql mysql 4096 Jan 24 18:47 ..
-rw-r-----
1 mysql mysql 1024 Jan 25
11:35 ibbackup_logfile
-rw-r-----
1 mysql mysql 18874368 Jan 25 11:35 ibdata1
위 백업본은 Recovery 가 적용되지 않은 미완성본이다. 데이터 파일에 백업받은 로그파일을 적용해야 한다.
oracle32@/home/mysql/mysql/bin>./ibbackup
--apply-log /home/mysql/mysql/conf/my2.cnf
~ (라이선스 정보)~
Type ibbackup --license for detailed license
terms, --help for help
Contents
of /home/mysql/mysql/conf/my2.cnf:
innodb_data_home_dir
got value /home/mysql/mysql/data2
innodb_data_file_path
got value ibdata1:18M
datadir
got value /home/mysql/mysql/data2
innodb_log_group_home_dir
got value /home/mysql/mysql/data2
innodb_log_files_in_group
got value 2
innodb_log_file_size
got value 5242880
110125 12:45:10 ibbackup: ibbackup_logfile's creation
parameters:
ibbackup: start lsn 0 1596928, end lsn 0
1597395,
ibbackup: start checkpoint 0 1597395
InnoDB: Doing recovery: scanned up to log
sequence number 0 1597395
InnoDB: Starting an apply batch of log
records to the database...
InnoDB: Progress in percents: 0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
87 88 89 90 91 92 93 94 95 96 97 98 99 Setting log file size to 0 5242880
Setting log file size to 0 5242880
ibbackup: We were able to parse
ibbackup_logfile up to
ibbackup: lsn 0 1597395
ibbackup: The first data file is
'/home/mysql/mysql/data2/ibdata1'
ibbackup: and the new created log
files are at '/home/mysql/mysql/data2/'
110125 12:45:10 ibbackup: Full backup prepared for recovery
successfully!
log 적용을 완료
후 data2 폴더를 다시 확인하였다.
oracle32@/home/mysql/mysql/data2>ls -la
total 28732
drwxr-xr-x
2 mysql mysql 4096 Jan 25
12:45 .
drwxr-xr-x 15 mysql mysql 4096 Jan 24 18:47 ..
-rw-r-----
1 mysql mysql 1024 Jan 25
11:35 ibbackup_logfile
-rw-r-----
1 mysql mysql 18874368 Jan 25 11:35 ibdata1
-rw-r-----
1 mysql mysql 5242880 Jan 25
12:45 ib_logfile0
-rw-r-----
1 mysql mysql 5242880 Jan 25
12:45 ib_logfile1
적용결과로 ib_logfile0, 1 이라는 파일이 추가 생성되었다. 소스가 되었던 파일은 수정된
시각을
보았을 때 변경사항이 없는 것을 알 수 있다.
<compress 사용하는 경우>
compress 를 사용하는 경우 사용하지 않는 경우의 명령어에 --compress 를 추가하면 된다.
oracle32@/home/mysql/mysql/bin>./ibbackup --compress /home/mysql/mysql/conf/my.cnf /home/mysql/mysql/conf/my2.cnf
~((중략))~
ibbackup: Found checkpoint at lsn 0 1597395
ibbackup: Starting log scan from lsn 0
1596928
110125 12:56:24 ibbackup: Copying log...
110125 12:56:24 ibbackup: Log copied, lsn 0 1597395
ibbackup: We wait 1 second before starting
copying the data files...
110125 12:56:25 ibbackup: Copying
/home/mysql/mysql/data/ibdata1
ibbackup: A copied database page was modified
at 0 1597395
ibbackup: Scanned log up to lsn 0 1597395
ibbackup: Was able to parse the log up to lsn
0 1597395
ibbackup: Maximum page number for a log
record 0
ibbackup: Compressed 18 MB of data
files to 97 kbytes (compression 99%).
110125 12:56:25 ibbackup: Full backup completed!
data2 를 이동하여
생성된 파일을 확인하였다.
oracle32@/home/mysql/mysql/data2>ls -la
total 116
drwxr-xr-x
2 mysql mysql 4096 Jan 25 12:56 .
drwxr-xr-x 15 mysql mysql 4096 Jan 24 18:47 ..
-rw-r-----
1 mysql mysql 1024 Jan 25 12:56
ibbackup_logfile
-rw-r-----
1 mysql mysql 99228 Jan 25 12:56 ibdata1.ibz
compress 하지 않은 연결과 백업본과 비교했을 때 크기 변화는 18M -> 99k 로 줄었다.
또 파일명 끝에 접미어로 .ibz 가 붙었음을 알 수 있다.
압축하지 않은 백업본의 경우와 마찬가지로 위 백업본에도 Recovery
를 적용해야 한다.
이 경우 --apply-log 와 함께 --uncompress 를 사용한다.
oracle32@/home/mysql/mysql/bin>./ibbackup
--apply-log --uncompress /home/mysql/mysql/conf/my2.cnf
~((중략))~
ibbackup: Uncompressing data file
'/home/mysql/mysql/data2/ibdata1.ibz'
110125 13:09:37 ibbackup: ibbackup_logfile's creation
parameters:
ibbackup: start lsn 0 1596928, end lsn 0
1597395,
ibbackup: start checkpoint 0 1597395
InnoDB: Doing recovery: scanned up to log
sequence number 0 1597395
InnoDB: Starting an apply batch of log
records to the database...
InnoDB: Progress in percents: 0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
87 88 89 90 91 92 93 94 95 96 97 98 99 Setting log file size to 0 5242880
Setting log file size to 0 5242880
ibbackup: We were able to parse
ibbackup_logfile up to
ibbackup: lsn 0 1597395
ibbackup: The first data file is
'/home/mysql/mysql/data2/ibdata1'
ibbackup: and the new created log files are
at '/home/mysql/mysql/data2/'
110125 13:09:38 ibbackup: Full backup prepared for recovery
successfully!
위 메시지를 보면 압축본을 압축해제 후 적용하는 것을 알 수 있다. 백업
완료본은 다음과 같다.
oracle32@/home/mysql/mysql/data2>ls -la
total 28836
drwxr-xr-x
2 mysql mysql 4096 Jan 25
13:09 .
drwxr-xr-x 15 mysql mysql 4096 Jan 24 18:47 ..
-rw-r-----
1 mysql mysql 1024 Jan 25
12:56 ibbackup_logfile
-rw-r----- 1 mysql mysql 18874368 Jan 25 13:09 ibdata1
-rw-r-----
1 mysql mysql 99228 Jan 25
12:56 ibdata1.ibz
-rw-r----- 1 mysql mysql
5242880 Jan 25 13:09 ib_logfile0
-rw-r----- 1 mysql mysql
5242880 Jan 25 13:09 ib_logfile1
위 로그를 보면 ib_logfile 외에도 압축이 해제된 ibdata1 이 생성된 것을 볼 수 있다.
5.
ibbackup 본의
이용
백업본의 이용은 간략하게 이야기 하겠다.
- datadir 경로에 백업받은 frm 파일로 수정한다.
- 로그를 적용한
데이터 파일 및 새로 생성된 로그파일을 원래 위치로 이동시킨다.
- mysql 을
실행한다.
- mysql 을
띄운 후 적용할 binary logfile 이 있는 경우 이를 적용한다.
위 과정에 대해서는 추후에 다른 문서를 통해 이야기 하겠다.