该部分介绍了怎样做增量备份及如何利用全量备份,增量备份,binlog进行完全恢复。
增量备份只影响xtradb和innodb表,其他引擎将会复制所有数据。
这里计划做一次全量备份,三次增量备份。后两次的增量备份都基于上次的增量备份。
一 增量备份与恢复
1.1 备份
1.1.1 全量备份
增量备份基于全量备份,所以需要先创建一个全量备份。
全量备份命令示例:
innobackupex --port=3307 --user=XtrabackupUser --password=123456 /download/bak/xtrbak/
在备份路径下生成了一个子目录2020-03-18_19-46-30。
1.1.2 增量备份
增量备份需要指定--incremental选项和BASEDIR信息。
BASEDIR可以指向之前的全备,也可以指向上一个增量备份。
#增量备份1
innobackupex --port=3307 --user=XtrabackupUser --password=123456 --incremental --incremental-basedir=/download/bak/xtrbak/2020-03-18_19-46-30 /download/bak/xtrbak/
在备份路径下生成了一个子目录2020-03-18_19-53-42。
#增量备份2
innobackupex --port=3307 --user=XtrabackupUser --password=123456 --incremental --incremental-basedir=/download/bak/xtrbak/2020-03-18_19-53-42 /download/bak/xtrbak/
在备份路径下生成了一个子目录2020-03-18_19-55-45。
#增量备份3
innobackupex --port=3307 --user=XtrabackupUser --password=123456 --incremental --incremental-basedir=/download/bak/xtrbak/2020-03-18_19-55-45 /download/bak/xtrbak/
在备份路径下生成了一个子目录2020-03-18_19-56-55。
1.2 故障模拟
删除数据文件:
cd /data/server/mysql_3307/
mv data data_bak
重启数据库失败:
Starting MySQL. ERROR! The server quit without updating PID file (/data/server/mysql_3307/data/pc1.pid)
1.3 恢复
1.3.1 prepare
规则:
需要在全量备份及除最后一个增量备份外的所有增量备份上--apply log --redo only,在最后一个增量备份上加--apply log,即只有最后一个备份中不用加--redo only.
#对全量备份做prepare
innobackupex --apply-log --redo-only 2020-03-18_19-46-30
#将增量备份1合并到全量备份中(incremental-dir后跟增量备份目录)
innobackupex --apply-log --redo-only 2020-03-18_19-46-30 --incremental-dir=/download/bak/xtrbak/2020-03-18_19-53-42
#将增量备份2合并到全量备份中
innobackupex --apply-log --redo-only 2020-03-18_19-46-30 --incremental-dir=/download/bak/xtrbak/2020-03-18_19-55-45
#将增量备份3合并到全量备份中(不加redo-only)
innobackupex --apply-log 2020-03-18_19-46-30 --incremental-dir=/download/bak/xtrbak/2020-03-18_19-56-55
1.3.2 使用innobackupex做恢复
在prepare阶段后,如果需要用备份数据来恢复数据库,则需要指定--copy-back和备份数据所在的目录即可。
#如果数据库没被关闭,需要关闭数据库:
service mysqld stop
#如果数据目录不为空,则将数据目录设置为空
cd /data/server/mysql_3307/
mv data data_bak
#在恢复机器上恢复数据:
innobackupex --copy-back /download/bak/xtrbak/2020-03-18_19-46-30
chown -R mysql:mysql data
此时,数据恢复到了备份时刻的状态。
1.3.3 利用binlog做完全恢复
若想恢复到故障时刻,需要结合binlog进行完全恢复:
关闭相应的应用接口,阻止往数据库里写入数据,防止数据错乱。
service mysqld start
#查看应该从哪个binlog及position进行恢复
查看最近的一个增量备份的xtrabackup_binlog_info文件。
cd 2020-03-18_19-56-55
[root@pc1 2020-03-18_19-56-55]# cat xtrabackup_binlog_info
mysql-bin.000037 1042 2daff865-67ce-11ea-874e-080027040516:1-11,
a4ac8cd2-e17c-11e9-a602-080027040516:1-89,
d4d2f1d2-66f2-11ea-972a-080027040516:1-17
#查看有哪些binlog需要恢复(上面阴影部分的binlog及其之后的binlog都需要恢复)
mysql> show binary logs;
……
| mysql-bin.000037 | 1345 |
|mysql-bin.000038 | 577 |
| mysql-bin.000039 | 530 |
| mysql-bin.000040 | 274
#执行flush logs,以防止恢复最后一个binlog时,会重复复制,因为恢复binlog本身的操作也会记录到binlog里。
#恢复
/usr/local/mysql/bin/mysqlbinlog --skip-gtids=true --start-position=1042 mysql-bin.000037 | mysql -u root -p
/usr/local/mysql/bin/mysqlbinlog --skip-gtids=true mysql-bin.000038 mysql-bin.000039 mysql-bin.000040 | mysql -u root -p