Percona-XtraBackup 实现全备&增量备份与恢复(在上上章的基础上16、CentOS7.2 MySQL5.7服务器主从复制 ):
XtraBackup是Percona公司的开源项目,用以实现类似Innodb官方的热备份工具InnoDB Hot Backup的功能,它支持在线热备份(备份时不影响数据读写)。到目前为止,最新的版本为Percona XtraBackup 2.4.12
XtraBackup有很多功能和优点:例如支持全备、增量备份、部分备份;支持压缩备份;备份不影响数据读写、事务等,但是也有缺陷不足:例如不支持脱机备份、不支持直接备份到磁带设备、不支持Cloud Back,MyISAM的备份也会阻塞。不过这些小瑕疵不影响XtraBackup成为一款流行的MySQL备份工具。另外,请注意XtraBackup只支持Linux平台,不支持Windows平台。
完全备份原理:
增量备份原理:
数据还原备份原理:
Percona XtraBackup 剖析
全备
完全备份和恢复 |
|
1、找到mysql数据库数据存放的位置 |
grep “datadir” /etc/my.cnf |
2、开始全备份 |
innobackupex --user=root --password=Abc@123 /tmp/mysql-backup/完全备份目录 |
3、重演日志将redolog应用到ibdatax当中 |
innobackupex --apply-log /tmp/mysql-back/日志重演日志包括两个操作:重演日志回滚
|
4、完全还原 |
innobackupex --copy-back <完全备份目录>
|
增量备份
增量备份和恢复 |
|
1、完全备份 |
lsn:记录备份结束的时间点 |
innobackupex --user=root --password=Abc@123 /tmp/mysql-backup/ |
|
2、增量备份1 |
数据的lsn>完全备份的lsn |
innobackupex --incremental /tmp/mysql-backup/ --incremental-basedir=/tmp/mysql-backup/2018-09-08_21-33-29 |
|
3、增量备份2 |
数据的lsn>增量备份1的lsn |
innobackupex --incremental /tmp/mysql-backup/ --incremental-basedir=/tmp/mysql-backup/2018-09-08_21-34-20 |
|
4、还原1------完全备份 |
重演日志不会滚 |
innobackupex --apply-log --redo-only /tmp/mysql-backup/2018-09-08_21-33-29 |
|
5、还原2------完全备份+增量备份1=完全备份2 |
重演日志不会滚 |
innobackupex --apply-log --redo-only /tmp/mysql-backup/2018-09-08_21-33-29 --incremental-dir=/tmp/mysql-backup/2018-09-08_21-34-20 |
|
6、还原3------完全备份2+增量备份2=完全备份 |
重演日志不会滚 |
innobackupex --apply-log --redo-only /tmp/mysql-backup/2018-09-08_21-33-29 --incremental-dir=/tmp/mysql-backup/2018-09-08_21-34-20 |
|
7、还原4----完全备份3 |
重演日志不会滚 |
innobackupex --apply-log /tmp/mysql-backup/2018-09-08_21-33-29 |
|
8、还原 |
innobackupex --copy-back <完全备份目录> |
1、下载Percona-XtraBackup(CentOS7系统 官网:https://www.percona.com/):
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
2、安装:
yum -y localinstall percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
3、Percona Xtrabackup的备份还原数据
(1)完全备份
[root@linux-node1 ~]# grep "datadir" /etc/my.cnf
datadir=/usr/local/mysql/data #查看数据目录所在的位置
[root@linux-node1 ~]# innobackupex --user=root --password=Abc@123 /tmp/mysql-backup/
[root@linux-node1 ~]# ls /tmp/mysql-backup/ #查看全备份的内容
2017-10-17_13-08-59
(2)增量备份
[root@linux-node1 ~]# innobackupex --user=root --password=Abc@123 --incremental /tmp/mysql-backup/ --incremental-basedir=/tmp/mysql-backup/2018-09-08_09-51-57/
[root@linux-node1 ~]# innobackupex --user=root --password=Abc@123 --incremental /tmp/mysql-backup/ --incremental-basedir=/tmp/mysql-backup/2018-09-08_09-57-44/
[root@linux-node1 ~]# ls /tmp/mysql-backup/
2018-09-08_09-51-57 2018-09-08_09-57-44 2018-09-08_09-59-17
备注:第一个是完全备份数据,后面两个是增量备份数据
- 还原数据
①停止mysql服务,然后清空数据文件目录,恢复完成后再设置权限
[root@linux-node1 ~]# /etc/init.d/mysqld stop
Shutting down MySQL............ SUCCESS!
[root@linux-node1 ~]# mv /usr/local/mysql/data /usr/local/mysql/data.bak #这是模拟不小心将数据删掉
[root@linux-node1 ~]# mkdir /usr/local/mysql/data
[root@linux-node1 ~]# chown -R mysql:mysql /usr/local/mysql/data
②还原数据
[root@linux-node1 ~]# innobackupex --apply-log --redo-only /tmp/mysql-backup/2018-09-08_09-51-57/ #读取全备份的事务日志,不回滚
[root@linux-node1 ~]# innobackupex --apply-log --redo-only /tmp/mysql-backup/2018-09-08_09-51-57/ --incremental-dir=/tmp/mysql-backup/2018-09-08_09-57-44/ #将第一次增量备份的事务日志导入到读取全备份的事务日志中,不回滚
[root@linux-node1 ~]# innobackupex --apply-log --redo-only /tmp/mysql-backup/2018-09-08_09-51-57/ --incremental-dir=/tmp/mysql-backup/2018-09-08_09-59-17/ #将第二次增量备份的事务日志导入到读取全备份的事务日志中,不回滚
[root@linux-node1 ~]# innobackupex --apply-log /tmp/mysql-backup/2018-09-08_09-51-57/ #回滚事务日志
[root@linux-node1 ~]# innobackupex --copy-back /tmp/mysql-backup/2018-09-08_09-51-57/ #还原数据
[root@linux-node1 ~]# chown -R mysql:mysql /usr/local/mysql/data/ #修改权限
[root@linux-node1 ~]# /etc/init.d/mysqld start #启动服务
1、报错:
[root@linux-node1 ~]# /etc/init.d/mysqld start
Starting MySQL.. ERROR! The server quit without updating PID file (/usr/local/mysql/data/mysqld.pid).
解决方法:
chown -R mysql:mysql /usr/local/mysql/data/
2、报错(数据恢复回来后,主从失效):
解决方法:
从新设置,在主数据库看查看主服务器状态:
从新根据主服务器状态更改相应二进制日志文件和偏移量
mysql> stop slave;
mysql> change master to master_host='192.168.10.101',master_user='myslave',master_password='Abc@123',master_log_file='master-bin.000001',master_log_pos=154;
mysql> start slave;