【MySQL】MySQL事务回滚脚本

MySQL自己的 mysqlbinlog | mysql 回滚不好用,自己写个简单脚本试试:

想法是用mysqlbinlog把需要回滚的事务区域从mysql-bin.file中找到,然后通过脚本再插入DB。

## INSERT 需要将新增数据删除 对应DELETE
## DELETE 需要将删除数据恢复 对应INSERT
## UPDATE 需要将修改数据恢复 对应UPDATE
## 手动读取BINLOG,并找到对应位置和对应事务
## 手动删除除事务外的其他说明语句

 INSERT回滚最简单,其次是DELETE的,UPDATE操作比较麻烦。

#!/bin/bash
 ## INSERT 需要将新增数据删除 对应DELETE
 ## DELETE 需要将删除数据恢复 对应INSERT
 ## UPDATE 需要将修改数据恢复 对应UPDATE
 ## 手动读取BINLOG,并找到对应位置和对应事务
 ## 手动删除除事务外的其他说明语句

path=`pwd`
tmp_file=$path/tmp.file
cache_file=$path/cache.file
binlog_file=$path/$3
sql_file=$path/rollback.sql
columns='$2'


display_err()
{
        echo -e "33[45;36m$133[0m"
}

display_ok()
{
        echo -e "33[40;32m$133[0m"
}


fun_INSERT()
{
        echo -e "33[40;32m$133[0m"  
}


fun_DELETE()
{

        ##### GET ONE TRANSACTION ROWS #####
        local row_count=`awk 'BEGIN{print 12 + 2}'`

        ##### GET COUNtS OF TRANSACTION #####
        n=`cat $binlog_file | grep DELETE | wc -l`

        ##### GET TABLE NAME #####
        table=`sed -n '1p' $binlog_file | awk '{print $3}'`

        for ((i=1;i<=n;i++))
        do
                ##### MAKE SQL #####
                sed -n '3,'$row_count'p' $binlog_file | awk '{print $1}'| awk -F '=' '{print $2}' |  tr -t '
' ',' | sed 's/,$//' | sed 's/^/(/' | sed 's/$/)/'  >> $tmp_file

                #####  GET POS FOR CUT #####
                local pos=`awk 'BEGIN{print '$row_count' + 1 }'`

                #####  CLEAN cache_file FOR TRANSACTION HAVE DONE #####
                sed  -n ''$pos',$w '$cache_file'' $binlog_file

                ##### COPY TO binlog_file #####
                /bin/cp -f  $cache_file  $binlog_file

                ##### CHECK THE NUMBLE OF TRANSACTION #####


        done
        ##### 
 to , #####
        sed  's/)(/),(/g' $tmp_file |  sed 's/^/insert into t1 values /' | sed 's/)$/);/' > $sql_file
        rm -rf $tmp_file
        echo done!

        ##### CHECK THE NUMBLE OF TRANSACTION TO MAKE SQL #####


}

case $1 in
        insert ) fun_INSERT
                ;;
        delete ) fun_DELETE
                ;;
        update ) fun_update
                ;;
        *      ) display_err "ERROR!!!!  Only insert or delete or update could be input!"
                ;;
esac
原文地址:https://www.cnblogs.com/jiangxu67/p/3732188.html