前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何用shell脚本闪回binlog呢

如何用shell脚本闪回binlog呢

作者头像
MySQL技术
发布2019-09-08 19:51:07
6280
发布2019-09-08 19:51:07
举报
文章被收录于专栏:MySQL技术MySQL技术

简介: 上篇推文 笔者介绍了如何用开源工具来闪回binlog,但有时候我们的机器无法安装这些开源工具。这时候我们可以使用shell脚本来闪回binlog,是不是觉得方便多了。

条件:

  • 1.mysql binlog必须存在且是row格式的
  • 2.反向生成的表必须有主键
  • 3.表结构不能有更改
1.shell脚本闪回:
代码语言:javascript
复制
# 脚本 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 即可调用
代码语言:javascript
复制
# 脚本 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 即可调用

注意: 使用前请仔细阅读shell脚本哦 可能在你的环境下要稍微改动下。如果想基于position进行闪回 可以自行修改下脚本 也是可以实现的。当然与开源工具相比 功能并不是那么齐全 不过临时用下也是极好的。

2.利用mysqlbinlog_back.py 脚本:

项目地址:https://github.com/58daojia-dba/mysqlbinlog_flashback

3.利用MyFlash工具:

项目地址:https://github.com/Meituan-Dianping/MyFlash

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MySQL技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.shell脚本闪回:
  • 2.利用mysqlbinlog_back.py 脚本:
  • 3.利用MyFlash工具:
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档