通过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