现在的位置: 首页 > 关系型数据库 > 备份恢复 > 正文

利用xtrabackup和binlog恢复单表误删数据思路

时间:2016年08月17日 | 分类:备份恢复 | 评论:0 条 | 浏览:3,035 次

昨晚,有个朋友说它的DB有张表,被研发误删了一部分数据,咨询我一些恢复的思路:

环境:全备、增备、日志、主从、binlog-format=mixed

由于binlog格式的限制,没法从binlog里面反向解析误删数据,因此,就有了下面的思路,有什么遗漏的或者不到位的地方,欢迎大家指正!!

1.必须有xtrabackup备份

这里包括全备和增备

2.在全备和增备上都执行--apply-log --redo-only操作

执行完此操作后,备份的数据目录里会包含以下几种数据类型文件:

*.frm / *.ibd / *.exp / *.cfg

3.将原来有数据丢失的表重命名为新表

alter table old_table rename old_table_bak

4.创建一个与原表结构一致的新表new_table

5.将新表丢弃表空间

alter table new_table discard tablespace;

6.拷贝备份目录中的 *.ibd/*.cfg/*.exp到mysql的数据目录

mysql> system cp *.{ibd,exp,cfg} /db/mysql5.6/data/test/

7.导入表空间:

alter table new_table import tablespace

注:此时你执行查询时,是可以正常查询,但数据肯定不是最新的

8.由于数据不是最新的,所以需要用到binlog,但是binlog针对单表需要使用脚本过滤,太麻烦,下面介绍一个简单办法

这是使用偷懒的方法,重新授予一个用户,仅对此表有select,insert,delete,update的权限

GRANT SELECT, INSERT, UPDATE, DELETE ON `test`.`t1` TO 'test_user'@'localhost' identified by '123456';

9.执行binlog恢复,具体根据需要进行处理,这里简单说明

mysqlbinlog --no-defaults -vv --base64-output=decode-rows -d test mysql-bin.000001 | mysql -S /tmp/mysqld.sock -utest_user-p123456 -f

注:

这里的 -f 参数:恢复时,忽略后面的错误,强制导入

×