【MySQL】利用binlog回滾DML操作

簡(jiǎn)介
數(shù)據(jù)庫(kù)運(yùn)行過程中難免會(huì)發(fā)生誤操作,特別是在測(cè)試環(huán)境 開發(fā)人員或測(cè)試人員有時(shí)會(huì)誤刪或者更新錯(cuò)誤某些數(shù)據(jù)。這時(shí)可以用binlog閃回DML操作。

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供路橋網(wǎng)站建設(shè)、路橋做網(wǎng)站、路橋網(wǎng)站設(shè)計(jì)、路橋網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、路橋企業(yè)網(wǎng)站模板建站服務(wù),十年路橋做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

條件:

  • 1.MySQL binlog必須存在且是row格式的
  • 2.反向生成的表必須有主鍵
  • 3.表結(jié)構(gòu)不能有更改
1.shell腳本閃回:
# 腳本 del_time_recovery.sh(根據(jù)起止 time恢復(fù))用于回滾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 結(jié)束的time 庫(kù)名 表名,
# 直接使用 ?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 即可調(diào)用
# 腳本 update_time_recovery.sh(根據(jù)起止 time恢復(fù))用于回滾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 結(jié)束的time 庫(kù)名 表名,
# 直接使用  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 即可調(diào)用
2.利用mysqlbinlog_back.py 腳本:

參考:
【MySQL】mysqlbinlog_flashback工具使用

3.利用MyFlash工具:

參考:
【MySQL】MyFlash 回滾mysql binlog

網(wǎng)上還有很多類似的開源項(xiàng)目 如:binlog2sql等 都可以參考下。

當(dāng)前名稱:【MySQL】利用binlog回滾DML操作
標(biāo)題網(wǎng)址:http://bm7419.com/article16/jdjddg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、虛擬主機(jī)、小程序開發(fā)關(guān)鍵詞優(yōu)化、微信小程序、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司