arongsoft 发表于 2018-10-5 10:31:06

【MySQL】利用binlog回滚DML操作

# 脚本 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 &2
  exit 1
  ;;
  :)
  echo "Option -$OPTARG requires an argument." >&2
  Usage
  exit 1
  ;;
  esac
  done
  if [ $# != 10 ] ; then
  Usage
  exit 1;
  fi
  PATH=$(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/@.*=//g' $tmpfile
  sed -i 's/@=//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 即可调用

页: [1]
查看完整版本: 【MySQL】利用binlog回滚DML操作