我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【MySQL】利用binlog回滚DML操作

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【MySQL】利用binlog回滚DML操作

简介
数据库运行过程中难免会发生误操作,特别是在测试环境 开发人员或测试人员有时会误删或者更新错误某些数据。这时可以用binlog闪回DML操作。

条件:

  • 1.mysql binlog必须存在且是row格式的
  • 2.反向生成的表必须有主键
  • 3.表结构不能有更改
1.shell脚本闪回:
# 脚本 del_time_recovery.sh(根据起止 time恢复)用于回滚delete操作:

#!/bin/bash
# File Name   : del_time_recovery.sh
# Author      : wang
# Description : delete recover according to starttime and endtime.
Usage() {
cat << EOF
mysql_delete_recovery
OPTIONS:
   -b      binlog name
   -s      starttime
   -e      endtime
   -d      database name
   -t      table name
For secrity: This scripts check the full need arguments
EOF
}
while getopts ":b:s:e:d:t:" opt; do
  case $opt in
    b)
      logname=${OPTARG}
      ;;
    s)
      starttime=${OPTARG}
      ;;
    e)
      endtime=${OPTARG}
      ;;
    d)
      db=${OPTARG}
      ;;
    t)
      table=${OPTARG}
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      Usage
      exit 1
      ;;
  esac
done
if [ $# != 10 ] ; then
    Usage
    exit 1;
fi
PATH=$[PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/usr/local/mysql/bin](http://path/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/usr/local/mysql/bin)
export PATH

user=root
pwd='xxxxxxxx'
tmpfile=/tmp/del_recovery_$table.sql
mysqlbinlog --no-defaults -vv --base64-output=DECODE-ROWS --start-datetime="$starttime" --stop-datetime="$endtime" $logname |sed -n '/### DELETE FROM `'${db}'`.`'${table}'`/,/COMMIT/p' | \
sed -n '/###/p'    | \
sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;'   > $tmpfile
n=0;
for i in `mysql -u$user -p$pwd --skip-column-names --silent -e "desc $db.$table" |awk '$0=$1'`;
do
        ((n++));
done
sed -i -r "s/(@$n.*),/\1;/g" $tmpfile
sed -i 's/@[1-9].*=//g' $tmpfile
sed -i 's/@[1-9][0-9]=//g' $tmpfile

# 用法:-b -s  -e -d -t 分别带别binlog名字 开始的time 结束的time 库名 表名,
# 直接使用  sh del_time_recovery.sh -b /mysqllog/mysql-bin.000005 -s "2017-11-02 19:10:00" -e "2017-11-02 19:20:00" -d test_db -t test_tb 即可调用
# 脚本 update_time_recovery.sh(根据起止 time恢复)用于回滚update操作:

#!/bin/bash
# File Name   : update_time_recovery.sh
# Author      : wang
# Description : update recover according to starttime and endtime.
Usage() {
cat << EOF
mysql_update_recovery
OPTIONS:
   -b      binlog name
   -s      starttime
   -e      endtime
   -d      database name
   -t      table name
For secrity: This scripts check the full need arguments
EOF
}
while getopts ":b:s:e:d:t:" opt; do
  case $opt in
    b)
      logname=${OPTARG}
      ;;
    s)
      starttime=${OPTARG}
      ;;

    e)
      endtime=${OPTARG}
      ;;

    d)
      db=${OPTARG}
      ;;
    t)
      table=${OPTARG}
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      Usage
      exit 1
      ;;
  esac
done
if [ $# != 10 ] ; then
    Usage
    exit 1;
fi
user=root
pwd='xxxxxxx'
tmpfile=/tmp/update_recovery_$table.sql
n=0;
for i in `mysql -u$user -p$pwd --skip-column-names --silent -e "desc $db.$table" |awk '$0=$1'`;
do
        ((n++));
done
mysqlbinlog --no-defaults -vv --base64-output=DECODE-ROWS --start-datetime="$starttime" --stop-datetime="$endtime" $logname |sed -n '/### UPDATE `'${db}'`.`'${table}'`/,/COMMIT/p'          \
|       sed '/WHERE/{:a;N;/SET/!ba;s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}'                                                   \
|       sed -r '/WHERE/{:a;N;/@'"$n"'/!ba;s/###   @2.*//g}'                                                                          \
|       sed 's/### //g;s/\/\*.*/,/g'                                                                                            \
|       sed '/WHERE/{:a;N;/@1/!ba;s/,/;/g};s/#.*//g;s/COMMIT,//g'                                                               \
|       sed '/^$/d'     > $tmpfile
n=0;
for i in `mysql -u$user -p$pwd --skip-column-names --silent -e "desc $db.$table" |awk '$0=$1'`;
do
        ((n++));
          sed -i "s/@$n\b/$i/g" $tmpfile
done
sed -i -r "s/($i=.*),/\1/g" $tmpfile

# 用法:-b -s  -e -d -t 分别带别binlog名字 开始的time 结束的time 库名 表名,
# 直接使用  sh update_time_recovery.sh -b /mysqllog/mysql-bin.000005 -s "2017-11-03 14:30:00" -e "2017-11-03 15:00:00" -d test_db -t test_tb 即可调用
2.利用mysqlbinlog_back.py 脚本:

参考:
【MySQL】mysqlbinlog_flashback工具使用

3.利用MyFlash工具:

参考:
【MySQL】MyFlash 回滚mysql binlog

网上还有很多类似的开源项目 如:binlog2sql等 都可以参考下。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【MySQL】利用binlog回滚DML操作

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL数据操作-DML语句的使用

说明 DML(Data Manipulation Language)数据操作语言,是指对数据库进行增删改的操作指令,主要有INSERT、UPDATE、DELETE三种,代表插入、更新与删除,这是学习MySQL必要掌握的基本知识。 方语法中
2022-05-14

如何在MySQL中实现数据的版本管理和回滚操作?

通过使用事务、备份恢复、日志和版本控制工具等方法,可以在MySQL中实现数据的版本管理和回滚操作。
MySQL数据库2024-11-30

如何利用WCF回调操作解决死锁问题

这篇文章主要介绍“如何利用WCF回调操作解决死锁问题”,在日常操作中,相信很多人在如何利用WCF回调操作解决死锁问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何利用WCF回调操作解决死锁问题”的疑惑有所
2023-06-17

【云原生】Helm 常用命令(chart 安装、升级、回滚、卸载等操作)

要重写chart中的值,使用--values参数传递一个文件或者使用--set参数在命令行传递配置,强制使用字符串要用--set-string。当值本身对于命令行太长或者是动态生成的时候,可以使用--set-file设置独立的值。

在RHEL/CentOS系统上使用YUM history命令回滚升级操作是怎样的

在RHEL/CentOS系统上使用YUM history命令回滚升级操作是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。为服务器打补丁是 Linux 系统管理员的一项
2023-06-16

几个MySQL在Python中操作示例,MySQL利用于Python的实战!

不管你是做数据分析,还是网络爬虫,Web 开发、亦或是机器学习,你都离不开要和数据库打交道,而 MySQL 又是最流行的一种数据库,这篇文章介绍 Python 操作 MySQL 的5种方式,你可以在实际开发过程中根据实际情况合理选择。1、M
2023-06-02

使用mysql记录从url返回的http GET请求数据操作

业务场景需求及实现逻辑分析 在业务中,我们经常会碰到需要用HTTP GET请求数据的情况,比如http请求返回的结果如下所示:那么,如果我们想将这些数据用mysql存储下来,那该怎么实现呢? 其实,调用python的httplib和MySQ
2022-05-27

如何利用MySQL触发器实现数据库操作自动化

标题:利用MySQL触发器实现数据库操作自动化在数据库管理中,触发器是一种强大的工具,能够帮助我们实现数据库操作的自动化。MySQL作为一款广泛应用的开源数据库管理系统,也提供了触发器功能,我们可以利用MySQL触发器来实现数据库操作的自
如何利用MySQL触发器实现数据库操作自动化
2024-03-15

利用Python批量导出mysql数据库表结构的操作实例

目录前言解决方法1. mysql 数据库 表信息查询2.连接数据库代码3.数据查询处理代码3.0 配置信息3.1查询数据库表3.2 查询对应表结构3.3 pandas进行数据保存导出excel补充:python脚本快速生成mysql数据库结
2022-08-08

如何利用索引提升PHP与MySQL的排序和分组操作?

索引是一种在数据库表中创建的数据结构,用来提高查询操作的效率。在PHP和MySQL中,索引可以在排序和分组操作中发挥重要作用,提升数据库查询的性能。本文将介绍如何利用索引来优化PHP与MySQL的排序和分组操作,并提供具体的代码示例。排序操
2023-10-21

编程热搜

目录