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