XtraBackup을 이용한 InnoDB 증분백업과 복구하기 ( 2 ) 풀백업




Full Backup


기본 풀백업은 아래처럼 간단하게 할 수 있다.


[root@localhost ~]# innobackupex --user root --password mysqlrootpw /Backup

160609 16:46:54 innobackupex: Starting the backup operation


IMPORTANT: Please check that the backup run completes successfully.

           At the end of a successful backup run innobackupex

           prints "completed OK!".


160609 16:46:54  version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;port=3306;mysql_socket=/tmp/mysql.sock' as 'root'  (using password: YES).

160609 16:46:54  version_check Connected to MySQL server

160609 16:46:54  version_check Executing a version check against the server...

160609 16:46:54  version_check Done.

..

..

..

160609 16:47:41 [00] Writing backup-my.cnf

160609 16:47:41 [00]        ...done

160609 16:47:41 [00] Writing xtrabackup_info

160609 16:47:41 [00]        ...done

xtrabackup: Transaction log of lsn (1667732673) to (1667732673) was copied.

160609 16:47:41 completed OK!

[root@localhost ~]# 


가장 밑줄에 있는 completed OK! 가 떨어지면 백업이 정상 종료된거다.



내부적인 실행순서는 아래와 같다.


1. ibdata1 (시스템 테이블스페이스) 카피


2. InnoDB  파일 카피 (.ibd)


3. FLUSH NO_WRITE_TO_BINLOG TABLES 실행


4. FLUSH TABLES WITH READ LOCK 실행


5. non-InnoDB  파일카피 (.MYI, .MYD, .FRM)


6. UNLOCK TABLES 실행


7. backup-my.cnf 생성


8. xtrabackup_info 생성


9. 종료



/Backup 디렉토리 안에 현재 날짜/시간으로 디렉토리가 만들어지고 그 안에 아래와 같이 백업이 된다.


[root@localhost 2016-06-09_16-46-54]# ll

합계 1024060

-rw-r----- 1 root root        421 2016-06-09 16:47 backup-my.cnf

-rw-r----- 1 root root 1048576000 2016-06-09 16:47 ibdata1

drwxr-x--- 2 root root       4096 2016-06-09 16:47 mysql

drwxr-x--- 2 root root       4096 2016-06-09 16:47 performance_schema

-rw-r----- 1 root root        119 2016-06-09 16:47 xtrabackup_checkpoints

-rw-r----- 1 root root        435 2016-06-09 16:47 xtrabackup_info

-rw-r----- 1 root root       2560 2016-06-09 16:47 xtrabackup_logfile


backup-my.cnf : 백업&복구에 필요한 몇가지 옵션이 저장되어 있다. my.cnf자체를 백업한게 아니다.


xtrabackup_checkpoints : 아래와 같은 내용을 담고 있다. 백업타입과 lsn 정보등. 


backup_type = full-backuped

from_lsn = 0

to_lsn = 1667732673

last_lsn = 1667732673

compact = 0

recover_binlog_info = 0


xtrabackup_info : 백업 실행시의 각종 상태(백업시간,사용한 옵션,버전정보등등..)를 저장.




백업시 추가적으로 사용 할 수 있는 옵션들


--host : 원격 백업일때 디비서버 아이피를 적어주면 된다. 안쓰면 기본이 localhost


--port : 안쓰면 기본이 3306


--defaults-file : 안쓰면 기본이 /etc/my.cnf 


--backup : 안쓰면 기본이 --backup, --apply-log 나 --copy-back 등을 쓸수 있음.


--no-timestamp : 날짜/시간으로 된 디렉토리를 생성하지 않는다. 지정한 경로에 바로 백업파일을 생성한다.



그리고 성능 개선을 위해...


--parallel : .ibd 데이터 파일 복사시 병렬로 처리한다. --parallel=4

InnoDB가 아니거나 innodb_file_per_table 을 사용하지 않을때는 당연히 성능향상은 없다.

병렬처리 옵션을 줘도 MyISAM 이나 InnoDB의 .frm 파일은 병렬처리가 안된다.


--compress_threads : 압축백업시 압축수행하는 쓰레드 수 지정.





로그반영


이전글에서 설명했듯 백업만 완료된 데이터는 inconsistent 하기 때문에 이 데이터로는 복구를 할 수 없다.


그렇기 때문에 꼭 백업된 리두로그를 백업된 데이터파일에 반영해줘야한다.


로그반영은 아래처럼 --apply-log 옵션과 함께 백업된 디렉토리를 지정해주면 된다.


[root@localhost ~]# innobackupex --apply-log /Backup/2016-06-09_16-46-54

160609 21:06:30 innobackupex: Starting the apply-log operation


IMPORTANT: Please check that the apply-log run completes successfully.

           At the end of a successful apply-log run innobackupex

           prints "completed OK!".


innobackupex version 2.4.3 based on MySQL server 5.7.11 Linux (x86_64) (revision id: 6a46905)

xtrabackup: cd to /Backup/2016-06-09_16-46-54

xtrabackup: This target seems to be not prepared yet.

InnoDB: Number of pools: 1

xtrabackup: xtrabackup_logfile detected: size=8388608, start_lsn=(1667732763)

xtrabackup: using the following InnoDB configuration for recovery:

..

..

..

..

InnoDB: 96 redo rollback segment(s) found. 1 redo rollback segment(s) are active.

InnoDB: 32 non-redo rollback segment(s) are active.

InnoDB: page_cleaner: 1000ms intended loop took 5030ms. The settings might not be optimal. (flushed=0 and evicted=0, during the time.)

InnoDB: 5.7.11 started; log sequence number 1667736597

xtrabackup: starting shutdown with innodb_fast_shutdown = 1

InnoDB: FTS optimize thread exiting.

InnoDB: Starting shutdown...

InnoDB: Shutdown completed; log sequence number 1667738299

160609 21:06:39 completed OK!

[root@localhost ~]# 


백업때와 마찬가지로 가장 밑줄에 있는 completed OK! 가 떨어지면 로그반영로이 정상 종료된거다.



[root@localhost 2016-06-09_16-46-54]# ll

합계 1568824

-rw-r----- 1 root root        421 2016-06-09 20:27 backup-my.cnf

-rw-r----- 1 root root  134217728 2016-06-09 21:06 ib_logfile0

-rw-r----- 1 root root  134217728 2016-06-09 21:06 ib_logfile1

-rw-r----- 1 root root  134217728 2016-06-09 21:06 ib_logfile2

-rw-r----- 1 root root  134217728 2016-06-09 21:06 ib_logfile3

-rw-r----- 1 root root 1048576000 2016-06-09 21:06 ibdata1

-rw-r----- 1 root root   12582912 2016-06-09 21:06 ibtmp1

drwxr-x--- 2 root root       4096 2016-06-09 20:27 mysql

drwxr-x--- 2 root root       4096 2016-06-09 20:27 performance_schema

-rw-r----- 1 root root        119 2016-06-09 21:06 xtrabackup_checkpoints

-rw-r----- 1 root root        435 2016-06-09 20:27 xtrabackup_info

-rw-r----- 1 root root    8388608 2016-06-09 21:06 xtrabackup_logfile


이제 이 파일들은 완전히 consistent 한 데이터가 되었고 이 데이터들로 복구를 할 수 있게 되었다.



로그반영시 추가할수 있는 옵션


로그반영 작업을 좀 더 빠르게 하기위해 --use-memory 옵션을 사용할 수 있다.


지정하지 않으면 기본값이 100M 로 셋팅되는데 로그반영은 보통 복구 직전에 진행하기에 디비도 내려간 상태이므로


메모리 여유량이 충분할 것이다. 넉넉히 셋팅해주자. 


[root@localhost ~]# innobackup --apply-log --use-memory=4G /Backup/2016-06-09_16-46-54





복구


로그반영까지 완료된 상태에서 복구는 아주 간단하다. 실행옵션 3가지중 --copy-back 을 써주면 된다. 



다시 한번 알아보는 실행옵션 3가지


--backup      : 백업할때 사용. 생략가능

--apply-log  : 로그반영시 사용

--copy-back : 복구시 사용



복구시 주의사항


- 복구전에 datadir 디렉토리는 비어있어야 한다. --copy-back 은 기존파일을 덮어쓰지 못한다. 

  datadir 이 비어있지 않을때는 -force-non-empty-directories 옵션을 이용할 순 있지만 기존 파일을 덮어쓰는 무모한 도전은

  의미가 없다. mv 를 이용해 기존 datadir 이름을 바꾸고 mkdir 로 새로 생성해주자.


- partial backup을 임포팅하는 작업이 아니라면 반드시 디비는 내려간 상태여야 한다.


- 사실 로그반영이 완료된 데이터는 이미 consistent 하므로 --copy-back 을 이용하지 않고 백업디렉토리를 그대로 datadir 로 옮겨도 무방하다. 하지만 운영에 필요없는 파일들도 같이 들어가므로 특별한 이유가 아니라면 정석대로 --copy-back을 사용하도록 하자.



[root@localhost ~]# innobackupex --copy-back /Backup/2016-06-09_16-46-54



역시 위 작업들과 동일하게 innobackupex: completed OK! 가 떨어지면 정상종료 된것이다.



내부적인 복구 과정은 아래와 같다.


1. 데이터파일(.ibd)과 메타데이터(.frm) 카피


2. 시스템테이블 스페이스(iddata1) 카피


3. 언두테이블 스페이스 (따로 있지 않다면 생략)


4. 리두로그(ib_logfile0..) 카피



복구된 데이터의 퍼미션을 확인해보고 mysql 권한이 아니라면 반드시 수정하고 디비를 올려보자.


[root@localhost ~]# chown mysql. /app/mariadb/data -R


[root@localhost ~]# /app/mariadb/bin/mysqld_safe &

[1] 25206

[root@localhost ~]# 160610 17:21:07 mysqld_safe Logging to '/app/mariadb/data/error-log.err'.

/app/mariadb/data/mariaDB.pid

160620 17:21:07 mysqld_safe Starting mysqld daemon with databases from /app/mariadb/data


[root@localhost ~]# 



이상없이 데몬이 잘올라온것을 확인할 수 있다. 예상 못했던 문제가 있을수 있으므로 errorlog 를 꼭 확인하도록 한다.




풀백업정리



풀백업 


$ innobackupex /data/backups


/data/backups에 오늘날짜 디렉토리에 백업파일 생성



$ innobackupex --no-timestamp /data/backups


/data/backups에 백업파일 생성




로그반영


$ innobackupex --use-memory=4G --apply-log /data/backups/2016-03-01_01-00-00


메모리 4기가 할당해 /data/backups/2016-03-01_01-00-00 백업디렉토리에 대한 로그반영




복구


$ innobackupex --copy-back /data/backups/2016-03-01_01-00-00


백업데이터 /data/backups/2016-03-01_01-00-00 를 datadir 로 복구. datadir 경로는 당연히 my.cnf 참조



to Top