MySQL Binlog
使用mysql binlog进行数据还原和恢复
一、Binlog导出
mysqlbinlog --no-defaults --start-datetime="<start-datetime>" --stop-datetime="<stop-datetime>" ./<binlog name> --result-file=bin.sql
mysqlbinlog --no-defaults --database=<data_base> --start-datetime="2022-07-15 12:00:00" --stop-datetime="2022-07-15 23:59:59" ./mysql-bin.000039 --result-file=mysql-bin.20220715.sql
二、数据恢复
1、导出binlog为sql文件
# 通过时间点导出binlog为sql文件
mysqlbinlog --database=<database_name> --base64-output=DECODE-ROWS --start-datetime='2022-08-02:14:20:02' --stop-datetime='2022-08-02:14:20:02' -v mysql-bin.000039 > test.sql
2、将binlog的删除语句转换为插入语句
cat mysql-bin.20220802.sql | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/);INSERT INTO/g;s/WHERE/VALUES(/g;' |sed -r 's/(@17.*),/\1;/g' | sed 's/@[1-9]=//g' | sed 's/@[1-1][0-7]=//g' | sed 's/$/&,/g' >insert.sql
# 在每一行的结尾拼接上,&平均字符串,/g结尾
| sed 's/$/&,/g'
# 对转换的insert.sql文件进行局部修改后,即可直接执行或者通过shell执行
mysql -uroot -p < insert.sql
3、Binlog复现
# 这个命令只是重新执行一次指定的binlog内容,需要提前将数据库备份,然后还原备份,再通过该命令将数据库从备份时间点还原到需要还原的时间点
mysqlbinlog <binlog_file> --start-datetime="<start_datetime>" --stop-datetime="<stop_datetime>" | mysql -u root -p
# 基于位点的复现
mysqlbinlog <binlog_file> --start-position=957850222 --stop-position=959568045 | mysql -u root -p
# 基于时间段的复现
mysqlbinlog <binlog_file> --start-datetime="2022-08-02 14:20:02" --stop-datetime="2022-08-02 14:20:02" | mysql -u root -p
Binlog命令参数
# 指定数据库
--database=<database_name>
# 指定表
|grep -i "<table_name>"
# 开始时间
--start-datetime="2021-12-16 11:00:00
# 截止时间
--stop-datetime="2021-12-16 12:00:00"
# 开始位置
--start-position=147407370
# 截止位置
--stop-position=147407374