1、mysqlbinlog把事务从binlog中导出

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

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

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

例如:

文件 table.cnf

@=id
@=column_a
@=column_b
@=time 文件not_used.set
##写到这个文件里面的是update回滚时不需要更新的列
##例如假设回滚不恢复 id 列,文件中应该如下 @= 文件not_used.where
##写到这个文件里面的是update回滚时条件忽略的列
##例如假设回滚时不需要列 time 和 column_b 作为回滚条件,文件中应该如下,顺序不敏感 @=
@=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=
cat ./table.ini | while read columns_name
do
echo ""@"$i"="$columns_name" >> ./table.cnf
i=$[$i+]
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 rows in binlog
delete= ### UPDATE DML rows in binlog
update= ### How many columns for this rollback table
table_columns=`wc -l ./table.cnf | awk '{print $1}'` ### Format binlog
echo -e "\033[47;30m wait for change binlog format \033[0m"
#cat ./mysql-bin.txt | awk '{$1="";print>"./bin.log"}'
echo -e "\033[47;30m change binlog format OK \033[0m" ### Count for DML
dml_delete_count=`cat ./bin.log | grep DELETE | wc -l `
dml_update_count=`cat ./bin.log | grep UPDATE | wc -l `
echo -e "\033[47;30m dml_delete_count $dml_delete_count \033[0m"
echo -e "\033[47;30m dml_update_count $dml_update_count \033[0m" ### How many rows for one DML
dml_delete_row=`echo |awk '{print "'$delete'"+"'$table_columns'"}'`
dml_update_row=`echo |awk '{print "'$update'"+"'$table_columns'"+"'$table_columns'"}'`
dml_update_where_row_begin=
dml_update_where_row_finish=`echo |awk '{print 2+"'$table_columns'"}'`
dml_update_set_row_begin=`echo |awk '{print 4+"'$table_columns'"}'`
dml_update_set_row_finish=$dml_update_row
echo -e "\033[47;30m dml_delete_row $dml_delete_row \033[0m"
echo -e "\033[47;30m dml_update_row $dml_update_row \033[0m" fun_delete()
{
b=''
for((i=;i<=${dml_delete_count};i++))
do
sed -n '1,'$dml_delete_row'p' ./bin.log > ./bin.tmp
sed -i '1,'$delete'd' ./bin.tmp
cat ./not_used.values | while read columns_values
do
sed -i '/'$columns_values'/d' ./bin.tmp
done
data=`awk -F '=' '{$1="";print}' ./bin.tmp | awk '{print $1}' | tr "\n" "," | sed 's/,$//' ` cp ./table.cnf ./dml_columns.tmp
cat ./not_used.values | while read columns_values
do
sed -i '/'$columns_values'/d' ./dml_columns.tmp
done
dml_columns=`awk -F '=' '{print $2}' ./dml_columns.tmp | tr "\n" "," | sed 's/,$//'` echo "insert into $table_name($dml_columns) values ($data);" >> ./rollback.sql
sed -i '1,'$dml_delete_row'd' ./bin.log
rm -rf ./bin.tmp ./sql.tmp
h=`echo | awk '{print int("'$i'"/"'$dml_delete_count'"*"100%")}'`
printf "progress:[$h%%]\r" done
rm -rf ./bin.log
echo -e "\n"
echo done
} fun_update()
{
if [ $dml_update_count -lt ]
then
file=
else
file=
fi file_count=$[${dml_update_count}/${file}]
file_mod=$[${dml_update_count}%${file}]
file_dml_pos_begin=
file_dml_pos_finish=$[${file_count}*${dml_update_row}] for((f=;f<=$[${file}+];f++))
do
sed -n ''$file_dml_pos_begin','$file_dml_pos_finish'p' ./bin.log > ./bin.log.$f rows_no_update_begin=
rows_no_update_finish=$dml_update_row for((i=;i<=${dml_update_count};i++))
do
sed -n ''$rows_no_update_begin','$rows_no_update_finish'p' ./bin.log.$f > ./bin.tmp
sed -n ''$dml_update_set_row_begin','$dml_update_set_row_finish'p' ./bin.tmp > ./bin.where
sed -n ''$dml_update_where_row_begin','$dml_update_where_row_finish'p' ./bin.tmp > ./bin.set
### data have been set,and this data make to search for new data in rollback SQL,choose columns
cat ./not_used.where | while read columns_where
do
sed -i '/'$columns_where'/d' ./bin.where
done
dml_where=`awk '{print $1}' ./bin.where | tr "\n" "," | sed 's/,$//'` ### data will be update,all columns or part of them
cat "./not_used.set" | while read columns_set
do
sed -i '/'$columns_set'/d' ./bin.set
done
dml_set=`awk '{print $1}' ./bin.set | tr "\n" "," | sed 's/,$//'` echo "update $table_name set $dml_set where $dml_where;" >> ./rollback.sql # delete big bin.log too slow
# sed -i '1,'$dml_update_row'd' ./bin.log rows_no_update_begin=$[$[${dml_update_row}*${i}]+]
rows_no_update_finish=$[${dml_update_row}*$[${i}+]] # change columns'name
cat ./table.cnf | while read t_tmp
do
t_1="`echo $t_tmp | awk -F '=' '{print $1}'`="
t_2="`echo $t_tmp | awk -F '=' '{print $2}'`="
sed -i 's/'$t_1'/'$t_2'/g' ./rollback.sql
done done file_dml_pos_begin=$[$[${file_count}*${f}*${dml_update_row}]+]
file_dml_pos_finish=$[${file_count}*$[${f}+]*${dml_update_row}] rm -rf ./bin.log.$f h=`echo | awk '{print int("'$f'"/"'$dml_update_count'"*"100%")}'`
printf "progress:[$h%%]\r"
echo -e "\n"
done echo done
} case $ in
delete)echo -e "\033[47;32m begin fun_delete \033[0m";sleep ;fun_delete
;;
update)echo -e "\033[47;32m begin fun_update \033[0m";sleep ;fun_update
;;
*)echo -e "\033[47;31m err input,please choose delete or update,quit \033[0m";exit
esac

【MySQL】MySQL回滚工具的更多相关文章

  1. 解析php mysql 事务处理回滚操作

    论坛扣币项目中,用户支付论坛币的时候如果突然断网.电脑死机.停电.等其它自然灾害时,导致本次交易没有成功(即用户的币已经扣掉了,但是服务器数据库中没有消费记录等其它情况),这种情况应该怎么样进行处理呢 ...

  2. 浅析Mysql 数据回滚错误的解决方法

    介绍一下关于Mysql数据回滚错误的解决方法.需要的朋友可以过来参考下 MYSQL的事务处理主要有两种方法.1.用begin,rollback,commit来实现begin 开始一个事务rollbac ...

  3. 解析php mysql 事务处理回滚操作(附实例)

    其实用PHP来处理mysql的事务回滚并不难,下面小编就详细的为大家介绍一下.相信大家看完之后都知道如何使用 很多新手在进行项目过程中,会碰到这样一种情况,如:论坛扣币项目中,用户支付论坛币的时候如果 ...

  4. 浅析Mysql数据回滚错误的解决方法

    介绍一下关于Mysql数据回滚错误的解决方法.需要的朋友可以过来参考下   MYSQL的事务处理主要有两种方法.   1.用begin,rollback,commit来实现   begin 开始一个事 ...

  5. 为什么mysql事务回滚后, 自增ID依然自增

    事务回滚后,自增ID仍然增加,回滚后,自增ID仍然增加.比如当前ID是7,插入一条数据后,又回滚了.然后你再插入一条数据,此时插入成功,这时候你的ID不是8,而是9.因为虽然你之前插入回滚,但是ID还 ...

  6. mysql事务回滚机制概述

    应用场景:   银行取钱,从ATM机取钱,分为以下几个步骤       1 登陆ATM机,输入密码:    2 连接数据库,验证密码:    3 验证成功,获得用户信息,比如存款余额等:    4 用 ...

  7. mysql基于binlog回滚工具_flashback(python版本)

        update.delete的条件写错甚至没有写,导致数据操作错误,需要恢复被误操作的行记录.这种情形,其实时有发生,可以选择用备份文件+binlog来恢复到测试环境,然后再做数据修复,但是这样 ...

  8. mysql有回滚,php没有回滚的说法

    mysql 事务表是有回滚的说法.当发生mysql层面的错误才会执行回滚

  9. 【MySQL】MySQL事务回滚脚本

    MySQL自己的 mysqlbinlog | mysql 回滚不好用,自己写个简单脚本试试: 想法是用mysqlbinlog把需要回滚的事务区域从mysql-bin.file中找到,然后通过脚本再插入 ...

随机推荐

  1. bug_ _小心android-support-v4.jar版本混乱造成的NoClassDefFoundError

    当你的项目出现以下红色提示的时候,要小心了, 因为很可能因为这个错误而导致解释不通的异常出现. Found 2 versions of android-support-v4.jar in the de ...

  2. Struts2返回JSON对象的方法总结

    如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选择.而在基于Spring3 MVC的架构下,对HTTP+JSON的返回类型也有很好 ...

  3. windows service的作成

    http://jingyan.baidu.com/article/fa4125acb71a8628ac709226.html

  4. 将多个网页制作成一个CHM文件

    有时我们想将一个网站上的多个页面集中保存起来,在即使没有网络的情况下也能够查看. 这时可以将这些网页保存成.mht的单个文件(在IE中打开时,点击 文件 -> 另存) 再使用Easy CHM去将 ...

  5. bat命令之for命令详解

    ______________版主提醒____________________________ 为了避免影响技术讨论.提高看帖的舒适性,请大家不要在此帖下跟无实质内容的口水帖,特别是纯顶.纯支持.纯感谢 ...

  6. [ActionScript 3.0] AS3 深入理解Flash的 应用程序域Application Domains

    简介 网上有很多flash,通常都不需要显示的使用应用程序域,因为默认的应用程序域就够用了.其实复杂的情况下需要用到应用程序域,比如说有两个不同的swf,一个是旧版本的,一个是新版的,这两个文件里的类 ...

  7. Servlet中读取参数的几种方式

    为每一Servlet设置初始化参数 可以为每一个Servlet在对应的web.xml中的Servlet节点下编写初始化参数,格式如下: <init-param> <param-nam ...

  8. gomoblie flappy 源码分析:游戏逻辑

    本文主要讨论游戏规则逻辑,具体绘制技术请参看相关文章: gomoblie flappy 源码分析:图片素材和大小的处理 http://www.cnblogs.com/ghj1976/p/5222289 ...

  9. 针对android方法数64k的限制,square做出的努力。精简protobuf

    1.早期的Dalvik VM内部使用short类型变量来标识方法的id,dex限制了程序的最大方法数是65535,如果超过最大限制,无法编译,把dex.force.jumbo=true添加到proje ...

  10. (转)windows下配置nginx+php环境

    原文地址 http://www.cnblogs.com/huayangmeng/archive/2011/06/15/2081337.html 刚看到nginx这个词,我很好奇它的读法(engine ...