安裝
[root@node01 yum.repos.d]# cat percona.repo
[percona]
name = Percona
baseurl = https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch
enabled = 1
gpgcheck = 0
[epel]
name=epelrepo
baseurl=https://mirrors.aliyun.com/epel/$releasever/$basearch
gpgcheck=0
enable=1
[root@node01 yum.repos.d]# yum list all| grep xtraback -i
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
holland-xtrabackup.noarch 1.1.21-1.el7 epel
percona-xtrabackup.x86_64 2.3.10-1.el7 percona
percona-xtrabackup-22.x86_64 2.2.13-1.el7 percona
percona-xtrabackup-22-debuginfo.x86_64 2.2.13-1.el7 percona
percona-xtrabackup-24.x86_64 2.4.18-1.el7 percona
percona-xtrabackup-24-debuginfo.x86_64 2.4.18-1.el7 percona
percona-xtrabackup-80.x86_64 8.0.9-1.el7 percona
percona-xtrabackup-80-debuginfo.x86_64 8.0.9-1.el7 percona
percona-xtrabackup-debuginfo.x86_64 2.3.10-1.el7 percona
percona-xtrabackup-test.x86_64 2.3.10-1.el7 percona
percona-xtrabackup-test-22.x86_64 2.2.13-1.el7 percona
percona-xtrabackup-test-24.x86_64 2.4.18-1.el7 percona
percona-xtrabackup-test-80.x86_64 8.0.9-1.el7 percona
[root@node01 yum.repos.d]# yum -y install percona-xtrabackup-24
裝完xtrabackup后,生成以下幾個工具。
[root@node01 yum.repos.d]# rpm -ql percona-xtrabackup-24 | grep bin | xargs ls -hl
lrwxrwxrwx 1 root root 10 2月 4 18:05 /usr/bin/innobackupex -> xtrabackup -rwxr-xr-x 1 root root 3.7M 12月 15 00:23 /usr/bin/xbcloud -rwxr-xr-x 1 root root 3.0K 12月 15 00:16 /usr/bin/xbcloud_osenv -rwxr-xr-x 1 root root 3.5M 12月 15 00:23 /usr/bin/xbcrypt -rwxr-xr-x 1 root root 3.5M 12月 15 00:23 /usr/bin/xbstream -rwxr-xr-x 1 root root 21M 12月 15 00:23 /usr/bin/xtrabackup
- xbcloud和xbcloud_osenv是xtrabackup新的高級特性:雲備份;
- xbcrypt也是新的特性,加密備份集;
- xbstream是xtrabackup的流數據功能,通過流數據功能,可將備份內容打包並傳給管道后的壓縮工具進行壓縮;
- xtrabackup是主程序;
- innobackupex在以前是一個perl腳本,會調用xtrabackup這個二進制工具,從xtrabackup 2.3開始,該工具使用C語言進行了重寫,當前它是xtabackup二進制工具的一個軟連接,但是實際的使用方法卻不同,並且在以后的版本中會刪除該工具。
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql> CREATE DATABASE friends; Query OK, 1 row affected (0.00 sec)
mysql> create table test ( -> d int(4), -> name varchar(16) -> )ENGINE=innodb DEFAULT CHARSET=gbk; Query OK, 0 rows affected (0.29 sec)
進行全量備份
[root@node01 yum.repos.d]# mkdir -p /opt/backup/ [root@node01 yum.repos.d]# cd /opt/backup/ [root@node01 backup]# mkdir full [root@node01 backup]# mkdir incr [root@node01 backup]# ls full incr [root@node01 backup]#
[root@node01 backup]# innobackupex --defaults-file=/etc/my.cnf --user=root --password='Qwer!234' --port=3306 /opt/backup/full/ [root@node01 backup]# ls -l full/2020-02-04_18-37-08/ 總用量 12336 -rw-r----- 1 root root 487 2月 4 18:37 backup-my.cnf drwxr-x--- 2 root root 52 2月 4 18:37 friends -rw-r----- 1 root root 425 2月 4 18:37 ib_buffer_pool -rw-r----- 1 root root 12582912 2月 4 18:37 ibdata1 drwxr-x--- 2 root root 4096 2月 4 18:37 mysql drwxr-x--- 2 root root 8192 2月 4 18:37 performance_schema drwxr-x--- 2 root root 8192 2月 4 18:37 sys -rw-r----- 1 root root 135 2月 4 18:37 xtrabackup_checkpoints -rw-r----- 1 root root 468 2月 4 18:37 xtrabackup_info -rw-r----- 1 root root 2560 2月 4 18:37 xtrabackup_logfile
第一次增量插入一條數據
mysql> INSERT INTO test(d, name) VALUES (2, 'winstom' ); Query OK, 1 row affected (0.07 sec) mysql> select * from test; +------+---------+ | d | name | +------+---------+ | 2 | winstom | +------+---------+ 1 row in set (0.00 sec)
進行第一次增量備份
注意
第一次增量備份,要以全量備份為節點,進行備份
增量備份使用--incremental
參數加 增量備份的目錄。
所以 --incremental-basedir
跟的參數是全量備份的目錄
[root@node01 ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password='Qwer!234' --incremental /opt/backup/incr/ --incremental-basedir=/opt/backup/full/2020-02-04_18-37-08/
第一次增量備份完成,下面進行查看
[root@node01 ~]# cd /opt/backup [root@node01 backup]# ll incr/2020-02-04_18-46-03/ 總用量 148 -rw-r----- 1 root root 487 2月 4 18:46 backup-my.cnf drwxr-x--- 2 root root 79 2月 4 18:46 friends -rw-r----- 1 root root 425 2月 4 18:46 ib_buffer_pool -rw-r----- 1 root root 98304 2月 4 18:46 ibdata1.delta -rw-r----- 1 root root 60 2月 4 18:46 ibdata1.meta drwxr-x--- 2 root root 4096 2月 4 18:46 mysql drwxr-x--- 2 root root 8192 2月 4 18:46 performance_schema drwxr-x--- 2 root root 8192 2月 4 18:46 sys -rw-r----- 1 root root 139 2月 4 18:46 xtrabackup_checkpoints -rw-r----- 1 root root 536 2月 4 18:46 xtrabackup_info -rw-r----- 1 root root 2560 2月 4 18:46 xtrabackup_logfile
第二次增量插入一條數據
mysql> INSERT INTO test(d, name) VALUES (3, 'liujunjun' ); Query OK, 1 row affected (0.05 sec) mysql> select * from test; +------+-----------+ | d | name | +------+-----------+ | 2 | winstom | | 3 | liujunjun | +------+-----------+ 2 rows in set (0.00 sec)
進行第二次增量備份
注意
在第二次增量備份的時候,不再是以全量為節點,要以上一次增量備份為節點來進行第二次的增量備份
所以--incremental-basedir
參數后面跟的是上一次增量備份的目錄;
[root@node01 backup]# cd /opt/backup/ [root@node01 backup]# innobackupex --defaults-file=/etc/my.cnf --user=root --password='Qwer!234' --incremental /opt/backup/incr/ --incremental-basedir=/opt/backup/incr/2020-02-04_18-46-03 [root@node01 backup]# ls incr/2020-02-04_18-51-53/ -l 總用量 116 -rw-r----- 1 root root 487 2月 4 18:51 backup-my.cnf drwxr-x--- 2 root root 79 2月 4 18:51 friends -rw-r----- 1 root root 425 2月 4 18:51 ib_buffer_pool -rw-r----- 1 root root 65536 2月 4 18:51 ibdata1.delta -rw-r----- 1 root root 60 2月 4 18:51 ibdata1.meta drwxr-x--- 2 root root 4096 2月 4 18:51 mysql drwxr-x--- 2 root root 8192 2月 4 18:51 performance_schema drwxr-x--- 2 root root 8192 2月 4 18:51 sys -rw-r----- 1 root root 139 2月 4 18:51 xtrabackup_checkpoints -rw-r----- 1 root root 535 2月 4 18:51 xtrabackup_info -rw-r----- 1 root root 2560 2月 4 18:51 xtrabackup_logfile
查看xtrabackup_binlog_info中的binlog位置
查看xtrabackup_checkpoints中lsn
[root@node01 2020-02-04_18-37-08]# cat xtrabackup_checkpoints backup_type = full-backuped from_lsn = 0 to_lsn = 2634553 last_lsn = 2634562 compact = 0 recover_binlog_info = 0 flushed_lsn = 2634562 [root@node01 incr]# cat 2020-02-04_18-46-03/xtrabackup_checkpoints backup_type = incremental from_lsn = 2634553 to_lsn = 2634772 last_lsn = 2634781 compact = 0 recover_binlog_info = 0 flushed_lsn = 2634781 [root@node01 incr]# cat 2020-02-04_18-51-53/xtrabackup_checkpoints backup_type = incremental from_lsn = 2634772 to_lsn = 2634958 last_lsn = 2634967 compact = 0 recover_binlog_info = 0 flushed_lsn = 2634967
這里可以看到,全備的lsn是從0開始的,第一次增量備份的lsn是從全量備份的lsn結束的位置開始的,第二次增量備份同理,從第一次增量備份的lsn結束的位置開始的。
模擬數據刪除
mysql> drop database friends; Query OK, 1 row affected (0.49 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)
數據恢復操作
恢復具體步驟
- 先把xtrabackup備份下來的目錄進行再次備份,防止在還原的時候誤操作,導致備份不可用;
- 關閉要回復的數據庫實例;
- 移除需要恢復數據的MySQL實例下的data目錄,建議
mv
移動到別的目錄下; - 操作全量備份使用
--apply-log
和--redo-only
參數對全量備份進行恢復前准備操作,如事物回滾等操作; - 操作第一次增量備份將第一次增量備份應用到完全備份,同用使用
--apply-log
和--redo-only
參數 - 操作第二次增量備份將第二次增量備份應用到完全備份,使用
--apply-log
參數,不要加--redo-only
參數。 - 把所有合在一起的完全備份整體進行一次apply操作,回滾未提交的數據
- 使用
--copy-back
和--rsync
參數直接對全量備份操作后的目錄進行恢復; - 授權MySQL實例下的data目錄后,啟動數據庫
- 驗證恢復數據
第一步 備份
[root@node01 incr]# cd /opt/backup/full/ [root@node01 full]# cp -a 2020-02-04_18-37-08/ 2020-02-04_18-37-08.bak [root@node01 full]# cd .. [root@node01 backup]# cd incr/ [root@node01 incr]# ls -l 總用量 0 drwxr-x--- 6 root root 234 2月 4 18:46 2020-02-04_18-46-03 drwxr-x--- 6 root root 234 2月 4 18:51 2020-02-04_18-51-53 [root@node01 incr]# cp -a 2020-02-04_18-46-03/ 2020-02-04_18-46-03.bak [root@node01 incr]# cp -a 2020-02-04_18-51-53/ 2020-02-04_18-51-53.bak
第二步 關閉MySQL實例
[root@node01 incr]# systemctl stop mysqld [root@node01 incr]# netstat -tuln Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN udp 0 0 127.0.0.1:323 0.0.0.0:* udp6 0 0 ::1:323 :::*
[root@node01 mysql]# ls -l 總用量 110672 -rw-r----- 1 mysql mysql 56 2月 4 18:17 auto.cnf -rw------- 1 mysql mysql 1680 2月 4 18:17 ca-key.pem -rw-r--r-- 1 mysql mysql 1112 2月 4 18:17 ca.pem -rw-r--r-- 1 mysql mysql 1112 2月 4 18:17 client-cert.pem -rw------- 1 mysql mysql 1680 2月 4 18:17 client-key.pem -rw-r----- 1 mysql mysql 14266 2月 4 19:08 ib_buffer_pool -rw-r----- 1 mysql mysql 12582912 2月 4 19:08 ibdata1 -rw-r----- 1 mysql mysql 50331648 2月 4 19:08 ib_logfile0 -rw-r----- 1 mysql mysql 50331648 2月 4 18:17 ib_logfile1 drwxr-x--- 2 mysql mysql 4096 2月 4 18:17 mysql drwxr-x--- 2 mysql mysql 8192 2月 4 18:17 performance_schema -rw------- 1 mysql mysql 1680 2月 4 18:17 private_key.pem -rw-r--r-- 1 mysql mysql 452 2月 4 18:17 public_key.pem -rw-r--r-- 1 mysql mysql 1112 2月 4 18:17 server-cert.pem -rw------- 1 mysql mysql 1680 2月 4 18:17 server-key.pem drwxr-x--- 2 mysql mysql 8192 2月 4 18:17 sys [root@node01 mysql]# mv /var/lib/mysql /tmp/
第四步 准備全量備份
[root@node01 mysql]# innobackupex --apply-log --redo-only /opt/backup/full/2020-02-04_18-37-08/
第五步 應用第一次增量備份到全量備份
[root@node01 mysql]# innobackupex --apply-log --redo-only /opt/backup/full/2020-02-04_18-37-08 --incremental-dir=/opt/backup/incr/2020-02-04_18-46-03/
查看全量備份的xtrabackup_checkpoints
[root@node01 mysql]# cat /opt/backup/full/2020-02-04_18-37-08/xtrabackup_checkpoints backup_type = log-applied from_lsn = 0 to_lsn = 2634772 last_lsn = 2634781 compact = 0 recover_binlog_info = 0 flushed_lsn = 2634781
對比之前查看的第一次增量備份的last_lsn
位置,在應用第一次增量備份到全量后,可以看到last_lsn
已經被應用和第一次全量備份的位置相同了
第六步 應用第二次增量備份到全量備份
注意 在引用最后一次增量備份到全量時,不需要增加--redo-only
參數。
[root@node01 mysql]# innobackupex --apply-log /opt/backup/full/2020-02-04_18-37-08 --incremental-dir=/opt/backup/incr/2020-02-04_18-51-53/
查看全量備份的xtrabackup_checkpoints
[root@node01 mysql]# cat /opt/backup/full/2020-02-04_18-37-08/xtrabackup_checkpoints backup_type = full-prepared from_lsn = 0 to_lsn = 2634958 last_lsn = 2634967 compact = 0 recover_binlog_info = 0 flushed_lsn = 2634967
對比之前查看的第二次增量備份的last_lsn
位置,在應用第二次增量備份到全量后,可以看到last_lsn
已經被應用和第二次全量備份的位置相同了
第七步 把備份整體進行一次apply操作
[root@node01 mysql]# innobackupex --apply-log /opt/backup/full/2020-02-04_18-37-08/
第八步 使用--copy-back
參數恢復拷貝到data目錄
[root@node01 mysql]# innobackupex --defaults-file=/etc/my.cnf --copy-back /opt/backup/full/2020-02-04_18-37-08/
驗證操作
[root@node01 mysql]# ls /var/lib/mysql -l 總用量 122920 drwxr-x--- 2 root root 52 2月 4 19:23 friends -rw-r----- 1 root root 425 2月 4 19:23 ib_buffer_pool -rw-r----- 1 root root 12582912 2月 4 19:23 ibdata1 -rw-r----- 1 root root 50331648 2月 4 19:23 ib_logfile0 -rw-r----- 1 root root 50331648 2月 4 19:23 ib_logfile1 -rw-r----- 1 root root 12582912 2月 4 19:23 ibtmp1 drwxr-x--- 2 root root 4096 2月 4 19:23 mysql drwxr-x--- 2 root root 8192 2月 4 19:23 performance_schema drwxr-x--- 2 root root 8192 2月 4 19:23 sys -rw-r----- 1 root root 535 2月 4 19:23 xtrabackup_info -rw-r----- 1 root root 1 2月 4 19:23 xtrabackup_master_key_id
第九步 授權並啟動MySQL
[root@node01 mysql]# chown -R mysql.mysql /var/lib/mysql [root@node01 mysql]# ls -l 總用量 110672 -rw-r----- 1 mysql mysql 56 2月 4 18:17 auto.cnf -rw------- 1 mysql mysql 1680 2月 4 18:17 ca-key.pem -rw-r--r-- 1 mysql mysql 1112 2月 4 18:17 ca.pem -rw-r--r-- 1 mysql mysql 1112 2月 4 18:17 client-cert.pem -rw------- 1 mysql mysql 1680 2月 4 18:17 client-key.pem -rw-r----- 1 mysql mysql 14266 2月 4 19:08 ib_buffer_pool -rw-r----- 1 mysql mysql 12582912 2月 4 19:08 ibdata1 -rw-r----- 1 mysql mysql 50331648 2月 4 19:08 ib_logfile0 -rw-r----- 1 mysql mysql 50331648 2月 4 18:17 ib_logfile1 drwxr-x--- 2 mysql mysql 4096 2月 4 18:17 mysql drwxr-x--- 2 mysql mysql 8192 2月 4 18:17 performance_schema -rw------- 1 mysql mysql 1680 2月 4 18:17 private_key.pem -rw-r--r-- 1 mysql mysql 452 2月 4 18:17 public_key.pem -rw-r--r-- 1 mysql mysql 1112 2月 4 18:17 server-cert.pem -rw------- 1 mysql mysql 1680 2月 4 18:17 server-key.pem drwxr-x--- 2 mysql mysql 8192 2月 4 18:17 sys
第十步 驗證數據
[root@node01 mysql]# systemctl start mysqld mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | friends | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.12 sec) mysql> use friends; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +-------------------+ | Tables_in_friends | +-------------------+ | test | +-------------------+ 1 row in set (0.00 sec) mysql> select * from test; +------+-----------+ | d | name | +------+-----------+ | 2 | winstom | | 3 | liujunjun | +------+-----------+ 2 rows in set (0.02 sec)