mysql 针对MYSQL delete、update、insert语句误操作(如update忘记加where条件)
目前还没有特别好的办法进行恢复,主要是根据binlog日志文件进行恢复,网上也有
很多的博客说明这些操作步骤,目前总结起来快速方便的办法是:
利用淘宝的彭立勋开发出的一个flashback插件进行恢复,之前的插件版本只针对MySQL-5.5.18,
无法用于目前主流的5.6版本的。后来平民软件将该功能移植到5.6版本上,
让相关人员对数据库有更强的掌控能力。
相关的博客:http://www.cnblogs.com/youge-OneSQL/p/5249736.html
相关的博客:http://blog.csdn.net/wyzxg/article/details/9454375
0. MYSQL可恢复的前提
(1)开启binlog
(2)binlog_format的格式采用 ROW 格式,
ROW 方式会产生大量的binlog信息,参数binlog_row_image = MINIMAL 时可适当优化。
1. 下载 mysql5.6 flashback插件(二进制版本,无需安装)
下载地址:http://pan.baidu.com/s/1nvGOOIl
最新更新的日期: 2016/4/8
2. 将二进制插件文件拷贝到 原mysqlbinlog程序的目录中
下载的插件程序文件重命名 mysqlbinlogFB(保证和mysqlbinlog不重名即可)
下载下来的插件程序文件和之前的mysqlbinlog 工具一样使用,只是参数多了一个 -B参数
3. 模拟一下 delete 没有加 where条件的情况
4. 找到刚才delete 操作在binlog日志文件中的开始和结束位置点
这里主要看如何使用mysqlbinlog工具了,例如:产生delete误操作的时间点大概是在“2016-07-06 21:41:00”左右,我们查看binlog日志文件时指定开始时间点为“2016-07-06 21:40:00”并且匹配表名称“t_name”,如果打印出的binlog日志比较多时,可只看前20行和后20行即可。
前20行:
[root@myDBserver data]# mysqlbinlogFB -v --base64-output=decode-rows --start-datetime='2016-07-06 21:40:00' mysql-bin.000021 |grep -i 't_name' -C20 | head -n 20
后20行:
[root@myDBserver data]# mysqlbinlogFB -v --base64-output=decode-rows --start-datetime='2016-07-06 21:40:00' mysql-bin.000021 |grep -i 't_name' -C20 | tail-n 20
由于是测试的表数据,binlog信息量比较少,所以直接打印2016-07-06 21:40:00时间点之后的全部binglog信息,最后找出的位置起始结束点信息如下:
[root@myDBserver data]# mysqlbinlogFB -v --base64-output=decode-rows --start-datetime='2016-07-06 21:40:00' mysql-bin.000021
注意到两个 位置点 1377 和 1567,查看binlog中的日志信息确实是刚才误操作的delete 语句。
在指定--start-position时,需要注意包含table_map_event的位置,否则工具无法找到相关表的元数据信息。
5. 采用myslqbinlogFB 工具进行恢复
[root@myDBserver data]# mysqlbinlogFB-B-v --start-position=1377 --stop-position=1567 mysql-bin.000021| mysql -uroot -proot123 mytest
采用上面的命令即可 将刚才的delete的 binlog信息反转成insert语句插入到 mytest数据库中的t_name表中。
最后查看 t_name表:
同理,对于update,insert 语句恢复,一样的步骤操作。