Last Updated on 3월 30, 2021 by 태랑(정현호)
0. 포스팅 환경
포스팅에서는 아래의 환경에서 진행 하였습니다.
OS: CentOS 7.8
MySQL : 5.7.31
MySQL data 경로 : /usr/local/mysql/data
MySQL replication 유저 : repl_user
Xtrabackup : 2.4.21
1. XtraBackup 설치 및 구성
1.1 Repository 구성 - Master/Slave 모두 수행
먼저 xtrabackup 을 받기 위해서 repository 를 구성 합니다
[root] yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
1.2 xtrabackup 와 qpress 설치 - Master/Slave 모두 수행
[root] yum install -y qpress percona-xtrabackup-24
1.3 백업 유저 및 Replication 유저 생성 - Master 서버에서만 수행
mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'bkpuser'; mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost'; mysql> CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_user'; mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'repl_user'@'%'; mysql> FLUSH PRIVILEGES;
2. 백업 수행
2.1 백업 받을 디렉토리 생성 및 백업 수행
* 포스팅에서 사용된 디텍토리는 예시 입니다.
[root]# mkdir -p /root/backup/ [root]# innobackupex \ --defaults-file=/etc/my.cnf \ --host="localhost" \ --user="bkpuser" \ --password="bkpuser" \ --compress \ --compress_threads=4 \ --parallel=4 --no-lock \ --stream=xbstream /tmp > /root/backup/backup.xbstream [root]# ls -alrth /root/backup/backup.xbstream -rw-r--r--. 1 root root 1.5G Feb 2 18:27 /root/backup/backup.xbstream
2.2 파일을 슬레이브 서버로 전송
먼저 슬레이스 서버에서 디렉토리 생성 합니다
* 포스팅에서 사용된 디텍토리는 예시 입니다.
[root]# mkdir -p /root/backup/xbstream
2.3 백업 파일 전송 - 마스터 서버에서 수행
마스터 서버에서 슬레이브 서버로 백업파일을 전송 합니다.
[root]# rsync -avzr --progress /root/backup/backup.xbstream \ root@슬레이브서버IP:/root/backup/xbstream/ root@ip's password: sending incremental file list backup.xbstream 133,758,976 8% 14.84MB/s 0:01:33
3. 백업 리스토어
3.1 파일 묶음 해제
먼저 슬레이브 서버에서 전송받은 stream 형태의 파일을 해제를 진행 합니다
[root]# cd /root/backup/xbstream [root]# xbstream -x < backup.xbstream -C /root/backup/ ls -al /root/backup/ total 178060 drwxr-xr-x. 11 root root 4096 Feb 3 10:56 . dr-xr-x---. 12 root root 4096 Feb 3 10:55 .. -rw-r-----. 1 root root 492 Feb 3 10:56 backup-my.cnf.qp drwxr-x---. 2 root root 4096 Feb 3 10:56 employees -rw-r-----. 1 root root 550 Feb 3 10:56 ib_buffer_pool.qp -rw-r-----. 1 root root 2923584 Feb 3 10:55 ibdata1.qp drwxr-x---. 2 root root 4096 Feb 3 10:56 mysql <..중략..>
3.2 압축 해제
파일을 보면 ibdata1.qp 와 같이 qp 확장자가 확인되며 이러한 파일은 qpress 로 압축된 상태 입니다 압축을 해제하는 방법은 2가지 있습니다.
• 첫번째로 innobackupex --decompress 를 사용 하여 압축해제를 할 수 있으며 이 경우 압축이 해제된 파일과 압축된 qp 파일이 2개가 존재 하게 됩니다.
필요시 아래 커맨드를 통해 qp 파일을 삭제 할 수 있습니다.
[root]# find . -type f -name "*.qp" -exec rm -v {} \;
• 두번째로 아래의 qpress 유틸리티를 사용하여 아래 명령어 조합으로 압축을 해제 할 수 있습니다 아래 명령어의 경우 압축 해제 후 qp 파일을 삭제 하게 됩니다.
[root]# cd /root/backup/ [root]# for bf in `find . -iname "*\.qp"`; do qpress -d $bf $(dirname $bf) && /usr/bin/rm $bf; done
포스팅 에서는 innobackupex --decompress 을 통해 진행 하였습니다
[root]# innobackupex --decompress /root/backup/ [root]# ls -al /root/backup/ total 616372 drwxr-xr-x. 11 root root 4096 Feb 3 11:50 . dr-xr-x---. 12 root root 4096 Feb 3 11:08 .. -rw-r--r--. 1 root root 517 Feb 3 11:50 backup-my.cnf -rw-r-----. 1 root root 492 Feb 3 11:09 backup-my.cnf.qp drwxr-x---. 2 root root 4096 Feb 3 11:50 employees -rw-r--r--. 1 root root 823 Feb 3 11:50 ib_buffer_pool -rw-r-----. 1 root root 550 Feb 3 11:09 ib_buffer_pool.qp <..중략..>
3.3 apply log
apply log 단계를 수행 합니다.
[root]# innobackupex --apply-log /root/backup/
3.4 data dir 삭제
삭제 전 Slave DB 가 기동 중이라면 먼저 중지가 필요하며 기존 data dir 를 삭제하거나 mv 합니다.
포스팅에서 data 디렉토리는 /usr/local/mysql/data 을 사용하고 있습니다.
[root]# systemctl stop mysqld [root]# cd /usr/local/mysql [root]# rm -rf data [root]# mkdir data [root]# chown -R mysql:mysql data
3.5 데이터 파일 위치 원복
백업 파일에 대해서 원복은 --copy-back 이니 --move-back 을 사용하면 되며 copy는 백업에서 data 디렉토리로 복제를 하게 되고, move 는 data 디렉토리로 백업 파일을 옴기게 됩니다.
공간적으로 파일을 2개 유지하기 하기 어렵거나 하면 --move-back 을 사용하면 되며, 백업과 복구를 다시 해야할 필요성이 있다면 재사용을 위해 --copy-back 을 사용하시면 됩니다.
파일이 모두 복사(원복) 되었다면 디렉토리와 파일에 대해서 소유권을 변경 합니다
[root]# innobackupex --defaults-file=/etc/my.cnf \ --copy-back /root/backup/ [root]# chown -R mysql:mysql /usr/local/mysql/data
[참고] data 디렉토리 아래에 디렉토리나 파일이 중복이 되어서는 안됩니다 즉 data 디렉토리는 비워져 있어야 합니다.
3.6 Slave DB 를 시작 합니다.
[root]# systemctl start mysqld
4. replication 설정
4.1 마스터 정보 조회
백업 파일 중에 xtrabackup_info 이나 xtrabackup_binlog_info 에서 binlog 파일명과 log position 정보를 알수 있습니다.
[root]# cd /root/backup [root]# cat xtrabackup_info <..중략..> tool_name = innobackupex tool_command = --host=localhost --user=bkpuser --compress_threads=4 --parallel=4 --password=... --compress --no-lock --stream=xbstream /tmp tool_version = 2.4.21 ibbackup_version = 2.4.21 server_version = 5.7.31-log <..중략..> binlog_pos = filename 'binlog.000080', position '815' <..중략..>
[참고] Slave(Replica) 에서 백업 받은 파일로 추가적인 Replication 을 구성하려고 할 경우에는 xtrabackup_slave_info 파일을 참조하면 백업 받은 Slave DB가 참조하는(바라보는) Master 서버의 정보를 확인 할 수 있습니다.
Slave 에서 다시 Replication 을 설정하는 Relay Replication 을 설정하려면 slave 에서 binlog 활성화 후에 xtrabackup 을 수행 한 다음 다른 서버에서 Replication 설정시 xtrabackup_info 을 참조하시면 백업 받은 slave의 정보를 확인 할 수 있습니다.
4.2 replication 설정 및 확인
MySQL 에 접속 하여 change master 구문을 통해 복제 설정을 진행 하면 되며, 복제 설정 후 show slave status\G 명령어를 통해 상태 및 정상 복제 여부를 확인 하면 됩니다
[참고] --login-path 에 대한 정보는 아래 포스팅을 참조하시면 됩니다.
user$ mysql --login-path=dba mysql> change master to master_host='마스터서버IP',master_port=포트번호, master_user='repl_user', master_password='repl_user', master_log_file='binlog.000001',master_log_pos=154; mysql> start slave; mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 마스터서버IP Master_User: repl_user Master_Port: 3306 Connect_Retry: 60 Master_Log_File: binlog.000080 Read_Master_Log_Pos: 815 Relay_Log_File: relay_log.000002 Relay_Log_Pos: 317 Relay_Master_Log_File: binlog.000080 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 815 Relay_Log_Space: 518 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: 12416d15-0bfa-11eb-ad17-080027d4f8ed Master_Info_File: /usr/local/mysql/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version:
Ref link.
percona.com/streaming_backups_innobackupex.html[Link]
percona.com/recipes_ibkx_compressed.html[Link]
percona.com/streaming_backups_innobackupex.html[Link]
연관된 다른 글




Senior DBA(MySQL, Oracle) - 현재 위메프에서 많은 새로움을 경험중입니다
At WeMakePrice / Previous - Oracle Korea ACS Support / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io