MySQL Binlog

使用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