xtrabackup+binlog 实现完全恢复

一、xtrabackup备份原理

1.1 全备过程

  1. 开启一个后台检测进程,检测 redo 的变化,一旦发现redo中有新日志写入,将日志记录到后台日志文件 xtrabackup_log中
  2. 复制 InnoDB 的数据文件和系统表空间 ibdata1文件
  3. 复制结束后,执行 flush tables with read lock。加上--no-lock可以不执行,只对 InnoDB 有效,但是无法获取准确的 position。flush tables with read lock的作用是防止数据表发生 DDL 操作。
  4. 复制 MyISAM等其他引擎的文件
  5. 获取binlog的位置
  6. 执行unlock tables,把表设置可读写状态
  7. 停止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》

 

posted @ 2018-10-26 22:35  Ziroro  阅读(1965)  评论(0编辑  收藏  举报