利用mysqlbinlog恢复数据

Posted 雅冰石

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用mysqlbinlog恢复数据相关的知识,希望对你有一定的参考价值。

原理:

binlog2sql分析binlog日志,生成相反的sql。比如,对于delete操作,生成的回滚语句是insert。

前提条件:

mysql server必须设置以下参数:

[mysqld]

server_id = 1

log_bin = /var/log/mysql/mysql-bin.log

max_binlog_size = 1G

binlog_format = row

binlog_row_image = full

安装binlog2sql

该工具的使用依赖以下三个包:

PyMySQL==0.7.8

wheel==0.24.0

mysql-replication==0.9

其中,每个包又会依赖其它包,所以安装这些包是一个比较麻烦的事情。如果是在外网的环境下,可直接通过pip install安装,它会自动下载并安装依赖包的。

在内网环境下,可手动安装这些包,目前,这些包已下载打包,并上传到百度云盘中,大家可自行下载。

binlog2sql.tar.gz_免费高速下载|百度网盘-分享无限制

安装教程:

cd /opt

tar xvf binlog2sql.tar.gz

cd binlog2sql/binlog2sql_dependencies/

tar xvf setuptools-0.6c11.tar.gz

cd setuptools-0.6c11

python setup.py install

cd ..

tar xvf pip-9.0.1.tar.gz

cd pip-9.0.1

python setup.py install

cd ..

pip install *.whl mysql-replication-0.9.tar.gz

二 使用binlog2sql

2.1 语法

2.1.1 查看原始sql

python /opt/binlog2sql/binlog2sql/binlog2sql.py -hip -P端口 -u用户名 -p'密码' -d库名 -t表名 --start-file='要分析的起始binlog文件' --start-datetime='开始时间' --stop-datetime='终止时间' > /tmp/raw.sql

#查看生成的文件内容

less /tmp/raw.sql

2.1.2 生成回滚sql

python /opt/binlog2sql/binlog2sql/binlog2sql.py -hip -P端口 -u用户名 -p'密码' -d库名 -t表名 --start-file='要分析的起始binlog文件' --start-datetime='开始时间' --stop-datetime='终止时间-B > /tmp/raw.sql

2.2 案例

2.2.1 模拟删除数据

2.2.2 查看原始sql

python /opt/binlog2sql/binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'123456' -dbaidd -tt1 --start-file='master1-bin.000004' --start-datetime='2023-03-14 17:00:00' --stop-datetime='2023-03-14 18:00:00' > /tmp/raw.sql

从/tmp/raw.sql里找到自己误删除的数据,示例:

DELETE FROM `baidd`.`t1` WHERE `id`=1 AND `name`='dan' LIMIT 1; #start 1147 end 1323 time 2023-03-14 17:19:23

DELETE FROM `baidd`.`t1` WHERE `id`=2 AND `name`='jiao' LIMIT 1; #start 1147 end 1323 time 2023-03-14 17:19:23

2.2.3 生成回滚sql

python /opt/binlog2sql/binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'123456' -dbaidd -tt1 --start-file='master1-bin.000004' --start-datetime='2023-03-14 17:00:00' --stop-datetime='2023-03-14 18:00:00' -B > /tmp/rollback.sql

从/tmp/rollback.sql里找到自己误删除的数据,示例:

INSERT INTO `baidd`.`t1`(`id`, `name`) VALUES (2, 'jiao'); #start 1147 end 1323 time 2023-03-14 17:19:23
INSERT INTO `baidd`.`t1`(`id`, `name`) VALUES (1, 'dan'); #start 1147 end 1323 time 2023-03-14 17:19:23

2.2.4 执行上面生成的回滚sql

略。

三 注意事项

① 无法回滚truncate table

② 无法回滚DDL

 试验发现,若某个表被drop了,则该表在此之前的DML操作也将无法回滚(只能看到相应的建表删表语句,看不到DML语句)

③ 一次删除多条记录的delete sql会被生成N(N=被删除的记录条数)条delete sql(因为binlog日志里就是这样记录的),但是同一批操作里的start和end postion是一样的,不影响恢复。

--本篇文章参考自:

binlog2sql的安装及使用

以上是关于利用mysqlbinlog恢复数据的主要内容,如果未能解决你的问题,请参考以下文章

利用mysqlbinlog恢复数据

mysql 利用binlog日志恢复问题

mysql恢复数据mysqlbinlog

为啥使用mysqlbinlog无法恢复数据

mysqlbinlog flashback 5.6版本

mysql 只有binlog 怎么恢复