• 【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
  • 相关阅读:
    WEBAPP开发技巧(手机网站开发注意事项)
    2014阿里前端线上笔试题
    [NOIp2008] 双栈排序 (二分图染色 + 贪心)
    [NOIp2012] 国王游戏(排序 + 贪心 + 高精度)
    关于错排公式以及扩展的一些小结论
    [NOI2009]诗人小G(dp + 决策单调性优化)
    Codeforces Round #429 (Div. 1) C. On the Bench(dp + 组合数)
    Educational Codeforces Round 33 (Rated for Div. 2) F. Subtree Minimum Query(主席树合并)
    Codeforces Round #511 (Div. 1) C. Region Separation(dp + 数论)
    Codeforces Round #471 (Div. 2) F. Heaps(dp)
  • 原文地址:https://www.cnblogs.com/jiangxu67/p/3732188.html
Copyright © 2020-2023  润新知