How to auto Rollback DML Using binlog
本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客
新美大在binlog2sql的基础只是开源了一款新的小工具叫Myflash;用于解析binlog实现快速数据恢复,类似Oracle中的flashback功能,不过目前仅支持MySQL 5.6、5.7版本(MariaDB 10 已经引入了flashback功能).我这里进行了简单测试,以后恢复DML误操作就更简单一些了。
1)首先需要准备好myflash测试环境
大家可以去这里下载源程序:https://github.com/Meituan-Dianping/MyFlash
我这里的测试环境是Redhat Linux 6.5,直接解压myflash无法运行,发现glibc版本不匹配,需要2.14版本。因此首先我需要编译新版本的glibc。
–下载glibc 2.14
1 2 3 4 5 6 7 8 |
---下载lib包 # wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz # wget http://ftp.gnu.org/gnu/glibc/glibc-ports-2.14.tar.gz # tar -xvf glibc-2.14.tar.gz # tar -xvf glibc-ports-2.14.tar.gz # mv glibc-ports-2.14 glibc-2.14/ports # mkdir glibc-build-2.14 # cd glibc-build-2.14/ |
–编译
1 2 |
# ../glibc-2.14/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin # make |
–拷贝libc.so.6到/lib64
1 |
[root@killdb glibc-build-2.14]# cp libc.so.6 /lib64/libc-2.14.so |
–删除原来的libc
1 2 3 4 5 |
[root@killdb lib64]# rm -rf /lib64/libc.so.6 rm: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory [root@killdb lib64]# export LD_PRELOAD=/lib64/libc-2.14.so [root@killdb lib64]# rm -rf /lib64/libc.so.6 [root@killdb lib64]# ln -s /lib64/libc-2.14.so /lib64/libc.so.6 |
–make install
1 |
# make install |
–确认是否ok
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[root@killdb glibc-build-2.14]# ll /lib64/libc.so.6 lrwxrwxrwx. 1 root root 12 Sep 25 04:17 /lib64/libc.so.6 -> libc-2.14.so [root@killdb glibc-build-2.14]# strings /lib64/libc.so.6 |grep GLIBC_ GLIBC_2.2.5 GLIBC_2.2.6 GLIBC_2.3 GLIBC_2.3.2 GLIBC_2.3.3 GLIBC_2.3.4 GLIBC_2.4 GLIBC_2.5 GLIBC_2.6 GLIBC_2.7 GLIBC_2.8 GLIBC_2.9 GLIBC_2.10 GLIBC_2.11 GLIBC_2.12 GLIBC_2.13 GLIBC_2.14 GLIBC_PRIVATE |
可以看到已经ok了,支持最新的GLIBC_2.14了。下面开始测试myflash.
2) 如下是针对myflash的简单测试过程
–创建测试表
1 2 3 4 5 6 |
mysql> CREATE TABLE `Test` ( -> `ID` int(11) NOT NULL AUTO_INCREMENT, -> `NAME` varchar(50) NOT NULL, -> PRIMARY KEY (`ID`) -> ) AUTO_INCREMENT=1000 -> ; |
–创建测试存储过程模拟10万条测试数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
mysql> delimiter $$ mysql> create procedure pro_test() -> begin -> declare id int; -> set id = 100000; -> while id>0 do -> insert into Test(name) values ('www.killdb.com'); -> set id = id-1; -> end while; -> end $$ Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> call pro_test(); Query OK, 1 row affected (44.21 sec) |
–模拟删除5万条数据
1 2 3 4 5 6 7 8 9 10 11 12 |
mysql> delete from Test limit 50000; Query OK, 50001 rows affected (0.54 sec) mysql> select count(1) from Test; +----------+ | count(1) | +----------+ | 50001 | +----------+ 1 row in set (0.01 sec) mysql> |
–利用myflash解析binlog
这里简单的修改了一个小脚本,实现了半自动化(参考了群里一个网友的脚本).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[root@killdb binary]# ./flashback.sh [root@killdb binary]# cat flashback.sh #!/bin/bash file_path=/root/myflash/binary/ cd /root/myflash/binary ./flashback --databaseNames enmotech --tableNames Test --sqlTypes delete --binlogFileNames=/opt/mysql/mysql-bin.000003 ./flashback --maxSplitSize=15 --binlogFileNames=binlog_output_base.flashback arr=`find ${file_path} -name "binlog_output_base.0*"|sort -n` for i in ${arr} do mysqlbinlog ${i} | mysql -S /opt/mysql/mysql.sock done |
–验证数据
1 2 3 4 5 6 7 |
mysql> select count(1) from Test; +----------+ | count(1) | +----------+ | 100001 | +----------+ 1 row in set (0.02 sec) |
可以看到数据很容易就恢复出来了,效率非常高。比binsql2sql要高很多。整个恢复过程大概1~2秒。不仅是delete,实际对于insert和update的DML操作,都是支持的。这里我不进一步展开了。
Leave a Reply
You must be logged in to post a comment.