通过mysql binlog文件生成指定时间段的SQL语句

本文介绍了一种通过mysqlbinlog和binlog2sql工具恢复MySQL数据库数据的方法,即使在没有进行drop或delete操作的情况下,也能通过定时备份和指定时间段的SQL语句找回丢失的数据。

背景:当MySQL数据库无操作(drop,delete),如何通过mysql binlog文件找回来?

我们可以通过定时备份,先还原到某个时间点,然后用binlog2sql工具将mysql binlog文件生成指定时间段的SQL语句:

1. 下载binlog2sql工具:

https://github.com/danfengcao/binlog2sql

 

2. binlog2sql解压后,将如mysql-bin.000102放到binlog2sql-master/binlog2sql 目录下

 

3. 执行命令,生成指定时间段的SQL文件:

python binlog2sql.py -h141.91.24.182 -P3306 -uroot -p'acbcs2!#' -dDBtest --start-file='mysql-bin.000102' --start-datetime='2018-11-26 17:10:00' --stop-datetime='2018-11-26 17:40:00' > ./sql_102.sql
f44280f0599b1b7248a0d3bdb65b41fdd1b.jpg

 

4. 在生成的SQL文件中搜索含关键字的语句,如:

grep  "5bfb30bfba46f.mp4"  sql.sql_org   > out.log

cat  out.log

这样就可以找到相关的SQL语句。

转载于:https://my.oschina.net/michaelshu/blog/2961508

### 使用 binlog2sql 工具生成回滚 SQL 文件 为了通过 `binlog2sql` 从 MySQL 的二进制日志中提取并生成用于回滚操作的 SQL 文件,可以按照以下方法实现: #### 准备工作 确保已安装 Python 和必要的依赖库。`binlog2sql` 是基于 Python 编写的工具,它利用了 `python-mysql-replication` 库来解析 MySQLbinlog 数据[^2]。 可以通过 pip 安装该工具及其依赖项: ```bash pip install pymysql python-dateutil mysql-replication git clone https://github.com/danfengcui/binlog2sql.git cd binlog2sql ``` #### 基本命令结构 运行 `binlog2sql` 的基本命令如下所示: ```bash binlog2sql --flashback --start-datetime="YYYY-MM-DD HH:MM:SS" \ --stop-datetime="YYYY-MM-DD HH:MM:SS" -h hostname -u username -p password \ -P port_number --databases=database_name --tables=table_name ``` 其中参数解释如下: - `--flashback`: 表示生成反向(即回滚)SQL。 - `--start-datetime` 和 `--stop-datetime`: 指定时间范围内的 binlog 记录被转换成 SQL[^3]。 - `-h`, `-u`, `-p`, `-P`: 连接数据库所需的信息。 - `--databases` 和 `--tables`: 可选过滤条件,指定特定数据库或表的操作记录。 #### 输出结果存储至文件 默认情况下,上述命令会将生成的结果打印到标准输出流 (stdout),可将其重定向保存为 `.sql` 文件以便后续使用: ```bash binlog2sql ...options... > rollback.sql ``` 这样就创建了一个名为 `rollback.sql` 的文件,里面包含了可用于撤销目标时间段内更改的所有逆向 SQL 语句[^1]。 #### 处理多线程环境下的潜在冲突 当存在并发事务或者复杂场景下需要考虑单条或多条 SQL 执行顺序时,应特别注意避免因乱序或其他因素造成的数据不一致问题[^4]。一般建议按需调整脚本逻辑以适应具体业务需求;如果确实有必要,则可通过增加额外控制机制比如锁管理等方式解决此类同步难题。 ```python import threading def execute_sql(sql_statement, thread_id): # 实现具体的SQL执行流程... pass threads = [] for sql in parsed_statements: t = threading.Thread(target=execute_sql, args=(sql,)) threads.append(t) t.start() for t in threads: t.join() ``` 以上代码片段展示了如何在一个简单的例子中启动多个独立线程分别处理不同的 SQL 请求,并等待它们全部完成后再继续下一步动作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值