xtrabackup+binlog 实现完全恢复
一、xtrabackup备份原理
1.1 全备过程
- 开启一个后台检测进程,检测 redo 的变化,一旦发现redo中有新日志写入,将日志记录到后台日志文件 xtrabackup_log中
- 复制 InnoDB 的数据文件和系统表空间 ibdata1文件
- 复制结束后,执行 flush tables with read lock。加上--no-lock可以不执行,只对 InnoDB 有效,但是无法获取准确的 position。flush tables with read lock的作用是防止数据表发生 DDL 操作。
- 复制 MyISAM等其他引擎的文件
- 获取binlog的位置
- 执行unlock tables,把表设置可读写状态
- 停止xtrabackup_log
1.2 全备恢复
恢复的过程会应用xtrabackup_log,将提交的事务变更到 InooDB表空间,同时回滚未提交的事务。
二、xtrabackup全备+binlog恢复到某个时间点
2.1. 构造测试数据
create database vcyber; use vcyber; create table t(id int primary key,name varchar(10)); insert into t select 1,'a'; insert into t select 2,'b'; select * from t; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | +----+------+
2.2. 执行全量备份
innobackupex --defaults-file=/etc/my.cnf --slave-info --no-timestamp /data/backup/data/dbfull_3306_`date '+%Y%m%d_%H%M'`
2.3. 新增加2行数据
insert into t select 3,'c'; insert into t select 4,'d'; select * from t; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | | 3 | c | | 4 | d | +----+------+
2.4. 模拟误删除数据库
drop database vcyber;
2.5. 恢复数据库
# 关闭数据库
mysqladmin shutdown
# 把原来的数据目录改名,清空 data目录下面的数据,要不然后面还原数据的时候会报目录非空
mv /data/mysql/mysql_3306/data /data/mysql/mysql_3306/data_bak
# 应用日志
innobackupex --defaults-file=/etc/my.cnf --apply-log /data/backup/data/dbfull_3306_20180907_0319
# 把一致性的备份还原到原来数据目录
innobackupex --defaults-file=/etc/my.cnf --move-back /data/backup/data/dbfull_3306_20180907_0319
# 修改权限
chown -R mysql:mysql /data/mysql/mysql_3306/data
2.6. 查看恢复情况
# 启动数据库
service mysqld start
# 查看恢复状况
select * from t; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | +----+------+
有 2 条数据没有恢复过来
2.7. 应用 binlog
# 查看开始应用 binlog 的位置
cat xtrabackup_binlog_pos_innodb bin.000001 944
# 解析binlog
mysqlbinlog -vv --start-position=944 /data/mysql/mysql_3306/logs/bin.00000 > recover.sql
# 清空GTID,最好先备份 binlog
reset master
# 应用 binlog
mysql < recover.sql
# 查看恢复情况
select * from t; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | | 3 | c | | 4 | d | +----+------+
看来已经是把数据恢复回来了
参考书籍:《涂抹MySQL》