1、首先构建测试环境数据create table t1(a varchar(10),b varchar(10))insert into t1 values('1','1')insert into t1 values('2','2')commit。
2、模拟误修改,将t1表中的b字段更新为错误数据 "123456"update t1 set b='123456' where a='1'commitselect * from t1。
3、将恢复工具上传到服务器并进行解压。unzip binlog2sql-master.zip。
4、得到误修改时的binlog文件(show binary logs),实验环境是mysql-bin.000011。
5、通过 binlog2sql.py 脚本的到所有 对表 t1 的修改 *** 作。python binlog2sql.py -hlocalhost -P23307 -ubinlog2sql -p'binlog2sql' -dtest -tt1 --start-file='mysql-bin.000011'。
6、得到了误删除的sql的准确位置在1382-1615之间,使用 _**-B**_ 选项生成回滚sql。python binlog2sql.py -hlocalhost -P23307 -ubinlog2sql -p'binlog2sql' -dtest -tt1 --start-file='mysql-bin.000011' --start-position=1382 --stop-position=1615 -B。
7、执行得到的回滚语句进行误 *** 作恢复。就完成了。
误删数据的几种 *** 作
如何事前预防误删数据?
误删行数据恢复
误删行数据恢复可以使用 Flashback工具 。
Flashback恢复数据的原理是通过修改binlog内容,拿回原库进行回放,前提是 binlog_format=row和binlog_row_image=FULL 。
在使用Flashback进行恢复的时候, 不建议在主库上进行 *** 作 ,比较安全的做法是恢复出一个备份,或者找一个从库作为临时库,在这个临时库上执行 *** 作,然后再将确认过的临时库的数据恢复到主库。
误删库/表
drop table或者truncate table误删数据表 无法通过Flashback工具恢复 ,因为binlog_format的格式即使是ROW模式,在binlog中记录的也只是一条drop table或者truncate语句,因此无法进行恢复。
此时恢复的方式需要 全量备份加增量日志的方式进行恢复 ,因此要求数据有定期的全量备份,并且实时备份binlog。
假如某人在中午12点误删除了一个库里的某张表,恢复数据的流程如下:
mysqlbinlog恢复数据慢的原因?
如何更快的恢复误删的表?
在用备份恢复出临时实例以后,将这个临时实例设置成线上备库的从库:
假设此时备库的binlog已经被删除,那么需要去binlog备份系统找到删掉的日志文件拷贝到日志目录下,假设文件名是master.000001,打开日志目录下的binlog的index文件,在开头加入master.000001,让备库重新识别此日志文件
延迟复制备库
以上恢复都具有时间不可控性,如果采用上述步骤进行恢复,建议开发成工具(甚至可以做自己的DBA自动化平台),并大量测试后进行使用,避免手动误 *** 作带来更大的问题。
一般的主备复制存在的问题是,假设主库上的表被删除,这个命令很快会被发给所有从库,进而导致从库的数据表也被一起误删除。
延迟复制备库 是可以持续保持与主库有N秒延迟的备库 。
假设这里N=3600,那么表示只要在1个小时以内发现了误删除,就可以的到备库上执行stop slave,再通过之前讲到的方法,跳过误 *** 作的命令(比如将误删除的GTID加到实例集合中),就可以恢复出需要的数据。
rm误删
只要你的集群是高可用,如果rm删除了某个节点(只要不是恶意删除所有节点),HA系统会自动开始工作,选出一个新的主库,从而保证集群工作。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)