我们来说恢复的第二种情况,就是需要从binlog中指定位置恢复
binlog如何设置不说了,我们假设上次用mysqldump做过一次全量备份。
1mysqldump -uroot -p -h 192.168.1.35 -P3306 --opt --triggers -R --hex-blob --single-transaction --flush-logs --master-data=2 -B 库名 > 库名.sql
由于我们在备份中使用了参数–flush-logs –master-data=2,所以 库名.sql 中会有binglog的信息供我们使用。
一、用mysqlbinlog来恢复
我们首先要查到随后的binlog文件是那个,从那时候起又生成多少个binglog文件。
然后去库里查询:
1show master logs;
2show master status;
我们要分析一下SQL
1# show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
2
3show binlog events in 'javaboy_logbin.000002' limit 5,10;
我们来翻看日志:
可以看到是从 764–>865 ,发生了删除,那么回放到这个764这个position前即可,764不会执行
1mysqlbinlog /var/lib/mysql/mysql-bin.000204 --stop-position=764 --database=bbb | mysql -uroot -p
–start-position指定从哪里开始恢复,如果不指定,就会从binlog文件开头的position开始
1mysqlbinlog /var/lib/mysql/mysql-bin.000204 --start-position=205 --stop-position=764 --database=bbb | mysql -uroot -p
二、用binglog2sql来恢复
binlog2sql 是大众点评公司的DBA 开发的一款基于通过解析binlog将delete 恢复为insert,update 的值 set 字段和where条件做对调的原理来恢复数据的。 使用限制 MySQL的binlog format 必须是row 安装
简单说它的道理就是变删为增,生成新的SQL执行。感觉 yearning 的回滚应该就是基于这个东西搞得。
地址:https://github.com/danfengcao/binlog2sql
解析出回滚的SQL:
1python binlog2sql.py --flashback -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttest3 --start-file='mysql-bin.000002' --start-position=763 --stop-position=1147 > rollback.sql
回滚前务必再备份一下
1mysql -h127.0.0.1 -P3306 -uadmin -p < rollback.sql