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 "