通过binlog恢复数据

1. 通过binlog_rollback恢复数据
     安装binlog_rollback(反向解析出SQL语句)
 下载地址https://github.com/GoDannyLai/binlog_rollback/
  解压之后,chmod +x binlog_rollback即可
  指定时间恢复数据(不指定库,则所有库执行的操作都会恢复)
   ./binlog_rollback -m file -w rollback -M mysql -t 4 -H 192.168.100.211 \
-P 3306 -u test -p Root_2022  -sdt "2022-11-03 17:27:00" -edt "2022-11-03 \
 17:36:00" -e -f -r 20 -k -b 100 -l 10  -o /mnt /var/lib/mysql/mysql-bin.000008
   指定库和表(-dbs指定库,-tbs指定表也可以只指定库)
    ./binlog_rollback -m file -w rollback -M mysql -t 4 -H 192.168.100.211 \
-P 3306 -u test -p Root_2022 -dbs test01 -tbs test -sdt "2022-11-03 17:00:00" \
-edt "2022-11-03 17:17:00" -e -f -r 20 -k -b 100 -l 10  -o /mnt /var/lib/mysql/mysql-bin.000008
  也可以不指定直接恢复
   ./binlog_rollback -m file -w rollback -M mysql -t 4 -H 192.168.100.211 \
-P 3306 -u test -p Root_2022  -e -f -r 20 -k -b 100 -l 10  \
-o /mnt ./mysql-bin.000120
直接source /mnt下的sql文件,即可恢复数据

 

 

2. 通过binlog和sed恢复
    通过时间截取binlog
mysqlbinlog  --base64-output=decode-rows   -v -v  --start-date='2018-10-07 \
 15:25:00' --stop-date='2018-10-07 15:30:00'  /tmp/mysql-bin.000020 \
| grep -C 30 "UPDATE `test`.`zx_scores`"
 通过binlog pos位置截取
 mysqlbinlog  --no-defaults  --base64-output=decode-rows  -v -v  \
/tmp/mysql-bin.000020|sed -n '/# at 14739/,/COMMIT/p'  \
>/tmp/update.sql
  通过sed替换
sed '/WHERE/{:a;N;/SET/!ba;s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}' \
update.sql | sed 's/### //g;s/\/\*.*/,/g' | sed  /@7/s/,//g | sed \
'/WHERE/{:a;N;/@7/!ba;s/,/AND/g};s/#.*//g;s/COMMIT,//g' \
| sed '/^$/d'  >  rollback.sql
 where语句后@7最后一个字段加(;),如果后执行这句请将@7换成对应的列名即可
sed  -i -r  '/WHERE/{:a;N;/@7/!ba;s/(@7=.*)/\1\;/g}' rollback.sql
 字段替换,根据实际表字段进行替换
 sed -i 's/@1/列1/g;s/@2/列2/g;s/@3/列3/g;s/@4/列4/g;s/@5/列5/g; \
s/@6/列6/g;s/@7/列7/g'  rollback.sql
 sql格式化
 sed -i 's/\;/ LIMIT 1\;\n/g'   rollback.sql
每一个;前面加上 LIMIT 1,后面加上换行符:
sed -i 's/\;/ LIMIT 1\;\n/g' rollback.sql

  

  

posted @ 2022-11-04 16:19  MlxgzZ  阅读(486)  评论(0编辑  收藏  举报