如何用shell脚本闪回binlog呢

Posted MySQL技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用shell脚本闪回binlog呢相关的知识,希望对你有一定的参考价值。

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

条件:

  • 1.mysql binlog必须存在且是row格式的

  • 2.反向生成的表必须有主键

  • 3.表结构不能有更改

1.shell脚本闪回:

 
   
   
 
  1. # 脚本 del_time_recovery.sh(根据起止 time恢复)用于回滚delete操作:


  2. #!/bin/bash

  3. # File Name   : del_time_recovery.sh

  4. # Author      : wang

  5. # Description : delete recover according to starttime and endtime.

  6. Usage() {

  7. cat << EOF

  8. mysql_delete_recovery

  9. OPTIONS:

  10.    -b      binlog name

  11.    -s      starttime

  12.    -e      endtime

  13.    -d      database name

  14.    -t      table name

  15. For secrity: This scripts check the full need arguments

  16. EOF

  17. }

  18. while getopts ":b:s:e:d:t:" opt; do

  19.   case $opt in

  20.     b)

  21.       logname=${OPTARG}

  22.       ;;

  23.     s)

  24.       starttime=${OPTARG}

  25.       ;;

  26.     e)

  27.       endtime=${OPTARG}

  28.       ;;

  29.     d)

  30.       db=${OPTARG}

  31.       ;;

  32.     t)

  33.       table=${OPTARG}

  34.       ;;

  35.     \?)

  36.       echo "Invalid option: -$OPTARG" >&2

  37.       exit 1

  38.       ;;

  39.     :)

  40.       echo "Option -$OPTARG requires an argument." >&2

  41.       Usage

  42.       exit 1

  43.       ;;

  44.   esac

  45. done

  46. if [ $# != 10 ] ; then

  47.     Usage

  48.     exit 1;

  49. fi

  50. 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)

  51. export PATH


  52. user=root

  53. pwd='xxxxxxxx'

  54. tmpfile=/tmp/del_recovery_$table.sql

  55. mysqlbinlog --no-defaults -vv --base64-output=DECODE-ROWS --start-datetime="$starttime" --stop-datetime="$endtime" $logname |sed -n '/### DELETE FROM `'${db}'`.`'${table}'`/,/COMMIT/p' | \

  56. sed -n '/###/p'    | \

  57. sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;'   > $tmpfile

  58. n=0;

  59. for i in `mysql -u$user -p$pwd --skip-column-names --silent -e "desc $db.$table" |awk '$0=$1'`;

  60. do

  61.         ((n++));

  62. done

  63. sed -i -r "s/(@$n.*),/\1;/g" $tmpfile

  64. sed -i 's/@[1-9].*=//g' $tmpfile

  65. sed -i 's/@[1-9][0-9]=//g' $tmpfile


  66. # 用法:-b -s  -e -d -t 分别带别binlog名字 开始的time 结束的time 库名 表名,

  67. # 直接使用  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. # 脚本 update_time_recovery.sh(根据起止 time恢复)用于回滚update操作:


  2. #!/bin/bash

  3. # File Name   : update_time_recovery.sh

  4. # Author      : wang

  5. # Description : update recover according to starttime and endtime.

  6. Usage() {

  7. cat << EOF

  8. mysql_update_recovery

  9. OPTIONS:

  10.   -b      binlog name

  11.   -s      starttime

  12.   -e      endtime

  13.   -d      database name

  14.   -t      table name

  15. For secrity: This scripts check the full need arguments

  16. EOF

  17. }

  18. while getopts ":b:s:e:d:t:" opt; do

  19.  case $opt in

  20.    b)

  21.      logname=${OPTARG}

  22.      ;;

  23.    s)

  24.      starttime=${OPTARG}

  25.      ;;


  26.    e)

  27.      endtime=${OPTARG}

  28.      ;;


  29.    d)

  30.      db=${OPTARG}

  31.      ;;

  32.    t)

  33.      table=${OPTARG}

  34.      ;;

  35.    \?)

  36.      echo "Invalid option: -$OPTARG" >&2

  37.      exit 1

  38.      ;;

  39.    :)

  40.      echo "Option -$OPTARG requires an argument." >&2

  41.      Usage

  42.      exit 1

  43.      ;;

  44.  esac

  45. done

  46. if [ $# != 10 ] ; then

  47.    Usage

  48.    exit 1;

  49. fi

  50. user=root

  51. pwd='xxxxxxx'

  52. tmpfile=/tmp/update_recovery_$table.sql

  53. n=0;

  54. for i in `mysql -u$user -p$pwd --skip-column-names --silent -e "desc $db.$table" |awk '$0=$1'`;

  55. do

  56.        ((n++));

  57. done

  58. mysqlbinlog --no-defaults -vv --base64-output=DECODE-ROWS --start-datetime="$starttime" --stop-datetime="$endtime" $logname |sed -n '/### UPDATE `'${db}'`.`'${table}'`/,/COMMIT/p'          \

  59. |       sed '/WHERE/{:a;N;/SET/!ba;s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}'                                                   \

  60. |       sed -r '/WHERE/{:a;N;/@'"$n"'/!ba;s/###   @2.*//g}'                                                                          \

  61. |       sed 's/### //g;s/\/\*.*/,/g'                                                                                            \

  62. |       sed '/WHERE/{:a;N;/@1/!ba;s/,/;/g};s/#.*//g;s/COMMIT,//g'                                                               \

  63. |       sed '/^$/d'     > $tmpfile

  64. n=0;

  65. for i in `mysql -u$user -p$pwd --skip-column-names --silent -e "desc $db.$table" |awk '$0=$1'`;

  66. do

  67.        ((n++));

  68.          sed -i "s/@$n\b/$i/g" $tmpfile

  69. done

  70. sed -i -r "s/($i=.*),/\1/g" $tmpfile


  71. # 用法:-b -s  -e -d -t 分别带别binlog名字 开始的time 结束的time 库名 表名,

  72. # 直接使用  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 脚本:

3.利用MyFlash工具:

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




以上是关于如何用shell脚本闪回binlog呢的主要内容,如果未能解决你的问题,请参考以下文章

除了binlog2sql工具外,使用python脚本闪回数据(数据库误操作)

(4.11)mysql备份还原——mysql闪回技术(基于binlog)

binlog2sql之MySQL数据闪回

mac下如何用脚本启动jar包程序

各位vbs高手进来,如何用 VBS来编写 执行组合键

shell脚本,如何用shell打印金字塔