三、Xtrabackup工具
(1)Xtrabackup概述
Xtrabackup是由percona公司开发、用于Mysql数据库物理备份的备份工具,支持Mysql、oracle、percona Server、mariaDB数据库,是一个开源的数据库备份工具
使用Xtrabackup需要安装percona-toolkit-2.2.19-1.noarch.rpm和percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz
在Xtrabackup软件包安装完成后,在bin目录下,一共有六个文件:
[root@rzy ~]# cd /usr/src/percona-xtrabackup-2.4.5-Linux-x86_64/ [root@rzy percona-xtrabackup-2.4.5-Linux-x86_64]# ll 总用量 4 drwxr-xr-x 2 root root 111 11月 25 2016 bin drwxr-xr-x 3 root root 18 11月 25 2016 man drwxr-xr-x 14 root root 4096 11月 25 2016 percona-xtrabackup-2.4-test [root@rzy percona-xtrabackup-2.4.5-Linux-x86_64]# cd bin/ [root@rzy bin]# ll 总用量 225988 lrwxrwxrwx 1 root root 10 11月 25 2016 innobackupex -> xtrabackup -rwxr-xr-x 1 root root 5179300 11月 25 2016 xbcloud -rwxr-xr-x 1 root root 3020 11月 25 2016 xbcloud_osenv -rwxr-xr-x 1 root root 5001985 11月 25 2016 xbcrypt #加解密使用 -rwxr-xr-x 1 root root 5071619 11月 25 2016 xbstream #类似于tar -rwxr-xr-x 1 root root 216142648 11月 25 2016 xtrabackup
其中最主要的是innobackupex和Xtrabackup,innobackupex是一个perl脚本,Xtrabackup是C\C++编译的二进制
Xtrabackup是用来备份innoDB引擎的表的,不能备份非innoDB引擎的表,和mysqld server没有交互
可以看到innobackupex与Xtrabackup做了软连接,innobackupex脚本用来备份非innoDB引擎的表,但是可以调用Xtrabackup命令来备份innoDB引擎的表,还会发送命令与mysqld server进行交互,比如加读锁、获取位点等,简单的来说,innobackupex在Xtrabackup上做了一层封装,使之既能备份非innoDB表也可以调用Xtrabackup备份innoDB表
mysql的系统表使用的是MyISAM存储引擎,当我们备份系统表时一般都是通过innobackupex命令进行备份
(2)备份原理
- Xtrabackup和innobackupex两个工具之间的交互和协调是通过文件的创建、删除来实现的,主要的文件有:
- Xtrabackup_suspended_1
- Xtrabackup_suspended_2
- Xtrabackup_log_copied
- 交互的过程:
- innobackupex在启动Xtrabackup进程后,会一直等待Xtrabackup备份完innoDB文件。
- (而innobackupex如何知道Xtrabackup有没有备份完呢,其实在Xtrabackup备份完后会创建名叫Xtrabackup_suspended_2的文件,当innobackupex检测到这个文件被创建出来之后,就知道Xtrabackup已经备份完innoDB文件了)
- 在Xtrabackup备份完innoDB文件后,创建除了Xtrabackup_suspended_2文件,它会等待innobackupex把这个文件删除,才会继续往下执行操作
- innobackupex在检测到Xtrabackup_suspended_2被创建出来后就会继续往下执行操作
- innobackupex在备份完非innoDB表后,会删除Xtrabackup_suspended_2文件,接着等待Xtrabackup_log_copied创建
- Xtrabackup检测到Xtrabackup_suspended_2文件被删除后,会继续往下执行操作
(3)备份过程
(4)安装Xtrabackup
-实验环境
系统 | 主机名 | mysql版本 | 使用的软件包 |
centos7.4 | rzy | Mysql-5.7.12 | percona-toolkit-2.2.19-1.noarch.rpm percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz |
-实验步骤
[root@rzy ~]# ll #上传两个软件包 总用量 225988 -rw-------. 1 root root 1264 1?. 12 18:27 anaconda-ks.cfg -rw-r--r-- 1 root root 70389425 5?. 11 14:35 boost_1_59_0.tar.bz2 -rw-r--r-- 1 root root 50571897 5?. 11 14:30 mysql-5.7.12.tar.gz -rw-r--r-- 1 root root 1736921 5?. 22 17:21 percona-toolkit-2.2.19-1.noarch.rpm -rw-r--r-- 1 root root 82404945 5?. 22 17:21 percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz [root@rzy ~]# tar xf percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz -C /usr/src/ [root@rzy ~]# cd /usr/src/percona-xtrabackup-2.4.5-Linux-x86_64/ [root@rzy percona-xtrabackup-2.4.5-Linux-x86_64]# cp bin/* /usr/bin/ #优化命令执行路径,和修改环境变量是一样的 [root@rzy percona-xtrabackup-2.4.5-Linux-x86_64]# cd [root@rzy ~]# mount /dev/cdrom /mnt/ mount: /dev/sr0 写保护,将以只读方式挂载 mount: /dev/sr0 已经挂载或 /mnt 忙 /dev/sr0 已经挂载到 /mnt 上 [root@rzy ~]# yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey.x86_64 perl-Digest-MD5 #安装依赖包 。。。。。。 完毕! [root@rzy ~]# rpm -ivh percona-toolkit-2.2.19-1.noarch.rpm #安装rpm包
使用Xtrabackup工具
- 常用选项:
选项 | 作用 |
–host | 指定主机 |
–user | 指定用户名 |
–password | 指定密码 |
–port | 指定端口 |
–databases | 指定数据库 |
–incremental | 创建增量备份 |
–incremental-basedir | 指定包含完全备份的目录 |
–incremental-dir | 指定包含增量备份的目录 |
–apply-log | 对备份进行预处理操作 |
–redo-only | 不回滚未提交事务 |
–copy-back | 恢复备份目录 |
一般情况下,在备份完成后,数据是不能立即用于恢复操作的,因为备份的数据可能会包含尚未提交的事务或已经提交但是没有同步至数据文件的事务,这导致了数据文件的数据不一致,而apply-log选项的作用正是通过回滚未提交的事务以及同步已经提交的事务至数据文件的方法,使得数据文件的数据重新保证了一致性
-完全备份
[root@rzy bin]# innobackupex --user=root --password=123123 /beifen/ #直接完全备份至/beifen目录 。。。。。。 210522 17:51:48 completed OK! #ok表示备份成功 [root@rzy bin]# ll /beifen/ 总用量 0 drwxr-x--- 5 root root 193 5月 22 17:51 2021-05-22_17-51-45 [root@rzy bin]# ll /beifen/2021-05-22_17-51-45/ #从备份的目录可以看出,是物理备份 总用量 12336 -rw-r----- 1 root root 425 5月 22 17:51 backup-my.cnf #备份使用到的配置选项信息文件 -rw-r----- 1 root root 352 5月 22 17:51 ib_buffer_pool -rw-r----- 1 root root 12582912 5月 22 17:51 ibdata1 drwxr-x--- 2 root root 4096 5月 22 17:51 mysql drwxr-x--- 2 root root 8192 5月 22 17:51 performance_schema drwxr-x--- 2 root root 8192 5月 22 17:51 sys -rw-r----- 1 root root 113 5月 22 17:51 xtrabackup_checkpoints #备份的类型、状态和LSN状态信息文件 -rw-r----- 1 root root 417 5月 22 17:51 xtrabackup_info #mysql服务器当前正在使用的二进制日志文件和此时二进制日志时间的位置信息文件 -rw-r----- 1 root root 2560 5月 22 17:51 xtrabackup_logfile #备份的日志文件
-恢复
[root@rzy ~]# innobackupex --apply-log /beifen/2021-05-22_17-51-45/ #先对备份进行预处理,使数据一致 。。。。。。 210522 18:19:01 completed OK! [root@rzy ~]# rm -rf /usr/local/mysql/data/* #删除mysql文件 [root@rzy ~]# innobackupex --copy-back /beifen/2021-05-22_17-51-45/ #进行恢复 。。。。。。 210522 18:19:53 completed OK! [root@rzy ~]# chown -R mysql:mysql /usr/local/mysql/data/ #增加属主和属组 [root@rzy ~]# ll /usr/local/mysql/data/ #查看是否已经恢复 总用量 122916 -rw-r----- 1 mysql mysql 352 5月 22 18:19 ib_buffer_pool -rw-r----- 1 mysql mysql 12582912 5月 22 18:19 ibdata1 -rw-r----- 1 mysql mysql 50331648 5月 22 18:19 ib_logfile0 -rw-r----- 1 mysql mysql 50331648 5月 22 18:19 ib_logfile1 -rw-r----- 1 mysql mysql 12582912 5月 22 18:19 ibtmp1 drwxr-x--- 2 mysql mysql 4096 5月 22 18:19 mysql drwxr-x--- 2 mysql mysql 8192 5月 22 18:19 performance_schema drwxr-x--- 2 mysql mysql 8192 5月 22 18:19 sys -rw-r----- 1 mysql mysql 417 5月 22 18:19 xtrabackup_info [root@rzy ~]# mysql -u root -p123123 -e "show databases;" #进入mysql查看是否可以正常操作 mysql: [Warning] Using a password on the command line interface can be insecure. +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ —————————————————————————————————————————————————————————— 恢复三部曲 1.先把备份进行预操作,使数据一致 2.恢复备份至mysql 3.增加属主和属组 ——————————————————————————————————————————————————————————
-增量备份
[root@rzy ~]# mysql -u root -p123123 #进入mysql创建表 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.7.12 Source distribution Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> create database aaa; Query OK, 1 row affected (0.00 sec) mysql> use aaa; Database changed mysql> create table aaa(id int); Query OK, 0 rows affected (0.13 sec) mysql> insert into aaa values(1); Query OK, 1 row affected (0.07 sec) mysql> insert into aaa values(2); Query OK, 1 row affected (0.00 sec) mysql> insert into aaa values(3); Query OK, 1 row affected (0.00 sec) mysql> exit Bye [root@rzy ~]# innobackupex --user=root --password=123123 --incremental /beifen/ --incremental-basedir=/beifen/2021-05-22_17-51-45/ #进行增量备份要记得使用--incremental-basedir=指定完全备份 。。。。。。 210522 18:31:39 completed OK! [root@rzy ~]# ll /beifen/ 总用量 0 drwxr-x--- 5 root root 245 5月 22 18:19 2021-05-22_17-51-45 #完全备份 drwxr-x--- 6 root root 230 5月 22 18:31 2021-05-22_18-31-36 #增量备份 [root@rzy 2021-05-22_18-31-36]# cat xtrabackup_checkpoints #查看增量备份的xtrabackup_checkpoints文件 backup_type = incremental #备份类型为增量备份 from_lsn = 2522130 #lsn从2522130开始 to_lsn = 2522673 #lsn到2522673结束 last_lsn = 2522673 compact = 0 recover_binlog_info = 0 [root@rzy 2021-05-22_18-31-36]# cat /beifen/2021-05-22_17-51-45/xtrabackup_checkpoints #查看完全备份的 backup_type = full-prepared #备份类型为完全备份 from_lsn = 0 #lsn从0开始 to_lsn = 2522130 #lsn从255130结束 last_lsn = 2522139 compact = 0 recover_binlog_info = 0
-恢复增量备份
[root@rzy 2021-05-22_18-31-36]# innobackupex --apply-log --redo-only /beifen/2021-05-22_17-51-45/ #先把完全备份的数据保持一致性 。。。。。。 210522 18:40:17 completed OK! [root@rzy 2021-05-22_18-31-36]# innobackupex --apply-log --redo-only /beifen/2021-05-22_17-51-45/ --incremental-dir=/beifen/2021-05-22_18-31-36/ #把增量备份和全局备份的数据目录合并--incremental-dir=指定增量备份目录 。。。。。。 210522 18:41:24 completed OK! [root@rzy 2021-05-22_18-31-36]# cat /beifen/2021-05-22_17-51-45/xtrabackup_checkpoints #查看合并后的完全备份的数据目录的xtrabackup_checkpoints文件的lsn是否增加到了增量备份的数字 backup_type = log-applied from_lsn = 0 to_lsn = 2522673 #发现lsn结束的数字和上面的增量备份的数字一致了 last_lsn = 2522673 compact = 0 recover_binlog_info = 0 [root@rzy 2021-05-22_18-31-36]# innobackupex --copy-back /beifen/2021-05-22_17-51-45/ #恢复数据 。。。。。。 210522 18:42:43 completed OK! [root@rzy 2021-05-22_18-31-36]# chown -R mysql:mysql /usr/local/mysql/data/ #修改属主和属组 [root@rzy 2021-05-22_18-31-36]# mysql -u root -p123123 -e "show databases;" #确认mysql可以正常使用 mysql: [Warning] Using a password on the command line interface can be insecure. +--------------------+ | Database | +--------------------+ | information_schema | | aaa | | mysql | | performance_schema | | sys | +--------------------+
-使用Xtrabackup的总结
- 增量备份需要使用参数–incremental指定需要备份到那个目录,在恢复增量备份和完全备份时,要使用–incremental-dir参数指定增量备份目录和完全备份目录合并
- 进行数据备份恢复时,要先使用参数–apply-log和redo-only使数据目录的数据保持一致
- 如果有多个增量备份,要把增量备份逐一和完全备份进行合并,可以查看完全备份的lsn值是否达到最近一次的增量备份的lsn值