【MySQL】MySQL回滚工具

1、mysqlbinlog把事务从binlog中导出

2、从导出的binlog中找到要回滚的事务,去掉第一个DML语句前和最后一个DML语句后与DML无关的binlog信息

3、在目录中新建一个table.cnf,把表结构以@1=columns这样的顺序一行写一列

4、update回滚支持选择条件列和回滚的数据列,把回滚时不需要的条件(列)写到not_used.set和not_used.where中

例如:

文件 table.cnf

@1=id
@2=column_a
@3=column_b
@4=time

文件not_used.set
##写到这个文件里面的是update回滚时不需要更新的列
##例如假设回滚不恢复 id 列,文件中应该如下

@1=

文件not_used.where
##写到这个文件里面的是update回滚时条件忽略的列
##例如假设回滚时不需要列 time 和 column_b 作为回滚条件,文件中应该如下,顺序不敏感

@=3
@=4

文件not_used.values
##写到这个文件里面的是delete回滚时不自动插入的列,例如自增列或者TIMESTAMP
##例如假设回滚时不需要列 time 和 id 作为回滚条件,文件中应该如下,顺序不敏感

@4=
@1=


有的表列比较多,写个脚本自己拼配置文件

mysql里面show create table,把结果写到table.txt

#!/bin/bash
awk '{print $1}' ./table.txt >./table.ini
n=`wc -l ./table.ini`
i=1
cat ./table.ini | while read columns_name
do
        echo ""@"$i"="$columns_name" >> ./table.cnf
        i=$[$i+1]
done
rm -rf ./table.txt ./table.ini

然后not_used.where、not_used.set、not_used.values也可以用table.cnf转换一下编辑

awk  -F '`' '{print $1}' table.cnf  > ./not_used.set

脚本:表名自己写吧

#!/bin/bash
table_name="$2"

### DELETE DML 2 rows in binlog
delete=2

### UPDATE DML 3 rows in binlog
update=3

### How many columns for this rollback table
table_columns=`wc -l ./table.cnf | awk '{print $1}'`

### Format binlog
echo -e "