zoukankan      html  css  js  c++  java
  • 【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
  • 相关阅读:
    sharding-jdbc精确分片配置
    sharding-jdbc注意事项
    sharding-jdbc绑定表和公共表
    go 语言解析yaml文件作为配置文件
    go语言添加全局的json配置文件
    go查询数据库讲单数据结果绑定结构体
    sharding-jdbc分库分表节点路由
    增强for循环对遍历的集合进行增删改操作会出现并发修改异常
    go语言数据模型改变响应给前端字段名
    视图
  • 原文地址:https://www.cnblogs.com/jiangxu67/p/3732188.html
Copyright © 2011-2022 走看看