ibdata1.delta? mysql? ? ? ? ? ? ? xtrabackup_binary? ? ? xtrabackup_logfile
ibdata1.meta? performance_schema? xtrabackup_binlog_info
[root@mariadb ~]# cat /backup/incremental/2015-04-15_16-49-07/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1645178 #这是第一次增量的"to_lsn"值
to_lsn = 1645463
last_lsn = 1645463
compact = 0
再来做一次数据修改,以便演示根据二进制日志做时间点的恢复:
mysql> INSERT INTO mydb1.tb1 (name,age) VALUES ('lucky',40);
mysql> SELECT * FROM tb1;
+----+-------+------+
| id | name? | age? |
+----+-------+------+
|? 1 | tom? |? 10 |
|? 2 | jack? |? 20 |
|? 3 | jason |? 30 |
|? 4 | lucky |? 40 |
+----+-------+------+
6、灾难恢复
6.1、数据破坏
[root@mariadb ~]# service mysqld stop
Shutting down MySQL.. SUCCESS!
[root@mariadb ~]# rm -rf /mnt/mydata/data/*? #把数据目录数据全部删除
我对于xtrabackup做数据恢复的理解:
xtrabackup做数据恢复与mysqldump这样的逻辑备份工作的恢复有很大的区别,xtrabackup进行数据恢复时需要把各个增量的数据备份与全备份的数据进行合并,对每次增量备份的合并只能将已提交的事务进行重放(redo),对合备份的数据恢复也只能做redo操作,把各个增量都合并完成后再把没有提交的事务进行回滚(undo)操作,合并完增量备份后,全备份的“xtrabackup_checkpoints”文件中的“last_lsn”应该是最后一次增量备份时的值,这些合并做redo的过程就是恢复数据前的准备工作(prepare)。
而真正在做数据恢复,建议先把全备和增量备份的文件都copy一份为副本,避免操作失误导致备份文件的损坏。
6.2、数据恢复的准备(prepare)工作
[root@mariadb ~]# innobackupex --apply-log --redo-only /backup/fullbackup/2015-04-15_16-30-19/
#准备全备份的数据
[root@mariadb ~]# innobackupex --apply-log --redo-only /backup/fullbackup/2015-04-15_16-30-19/ --incremental-dir=/backup/incremental/2015-04-15_16-42-00/
#准备第一次增量数据
[root@mariadb ~]# innobackupex --apply-log --redo-only /backup/fullbackup/2015-04-15_16-30-19/ --incremental-dir=/backup/incremental/2015-04-15_16-49-07/
#准备第二次增量数据
[root@mariadb ~]# cat /backup/fullbackup/2015-04-15_16-30-19/xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 1645463 #这是最后一次增量备份的位置,到此数据已全部合并
last_lsn = 1645463
compact = 0
6.3、真正数据恢复
[root@mariadb ~]# innobackupex --copy-back /backup/fullbackup/2015-04-15_16-30-19/? #仅一个“--copy-back”选项
[root@mariadb ~]# ls /mnt/mydata/data/
ibdata1? mydb1? mysql? performance_schema? test
[root@mariadb ~]# chown -R mysql.mysql /mnt/mydata/data/? #修改恢复数据的属主与属组
[root@mariadb ~]# service mysqld start
Starting MySQL.. SUCCESS!
mysql> SELECT * FROM mydb1.tb1;? #检查数据
+----+-------+------+
| id | name? | age? |
+----+-------+------+
|? 1 | tom? |? 10 |
|? 2 | jack? |? 20 |
|? 3 | jason |? 30 |
+----+-------+------+
#lucky信息还没有恢复
6.4、利用二进制日志文件基于时间点恢复
查看最后一次增量备份时的二进制日志文件及position信息:
[root@mariadb ~]# cat /backup/incremental/2015-04-15_16-49-07/xtrabackup_binlog_info
mysql-bin.000031? ? 1665?
[root@mariadb ~]# mysqlbinlog --start-position=1665 /var/log/mysql_log/mysql-bin.000031 > /tmp/position.sql
#用mysqlbinlog工具导出最后一次增量备份后的sql操作
导入数据:
mysql> source /tmp/position.sql
mysql> SELECT * FROM mydb1.tb1;
+----+-------+------+
| id | name? | age? |
+----+-------+------+
|? 1 | tom? |? 10 |
|? 2 | jack? |? 20 |
|? 3 | jason |? 30 |
|? 4 | lucky |? 40 |
+----+-------+------+
#数据全部恢复
7、总结
利用innobackupex工具可对在有混合存储引擎的场景下对数据库进行全备份,当是备份innodb表时innobackupex脚本内部会
自动调用xtrabackup工具来进行备份操作,在数据还原时应停止mysql实例,清空数据目录,然后先做prepare准备工作,第二步才是真正的数据还原(--copy-back),数据还原到数据目录后不要忘记修改数据目录的权限。
当然innobackupex工具也能实现对单库单表的导出、导出,如果是对Innodb表,那建议直接用xtrabackup工具,这样更直观的使用各个选项进行备份。
有一个疑问:
在做全备份时,innobackupex会去备份非innodb表,在从innobackupex备份时输出结果观察它会“150412 23:17:22? innobackupex: Starting to lock all tables... ”锁定所有的表