当前位置: 首页 > news >正文

mysql数据恢复

mysql数据恢复

my2sql:

是一款针对 MySQL 数据库的 binlog 解析工具,主要用于从 MySQL 的二进制日志(binlog)中提取数据变更信息(如插入、更新、删除操作),并能生成对应的 SQL 语句,也支持将解析结果输出为其他格式(如 CSV)。它在数据同步、数据恢复、审计追踪等场景中较为常用。

把bin-log日志进行解析,转化为sql语句,进行数据恢复

主要功能
  • binlog 解析:能够解析 MySQL 的 binlog 文件,提取其中的事务和数据操作记录。
  • 生成 SQL:可以将解析到的变更操作转换为对应的 INSERT、UPDATE、DELETE 语句,方便用于数据重放、同步等场景。
  • 过滤功能:支持按数据库名、表名、时间范围、操作类型等条件过滤解析结果,精准获取所需数据。
  • 格式输出:除了 SQL 语句,还能输出为 CSV 等格式,便于数据导入到其他系统或进行分析。

my2sql的常用选项和参数:

一、数据库连接参数

用于连接 MySQL 实例以获取 binlog 信息(本地文件解析时部分参数可省略):

  • -user​:MySQL 用户名(需有 REPLICATION​ 相关权限)
  • -password​:用户密码
  • -host​:数据库主机 IP 或域名(默认 127.0.0.1​)
  • -port​:数据库端口(默认 3306​)
  • -socket​:通过 Unix socket 连接时的路径(如 /tmp/mysql.sock​)

二、binlog 范围指定参数

用于限定解析的 binlog 范围:

  • -start-file​:起始 binlog 文件名(如 binlog.000001​,必填)
  • -start-pos​:起始 binlog 位置(在 -start-file​ 中的偏移量,默认从文件开头)
  • -end-file​:结束 binlog 文件名(默认与 -start-file​ 相同)
  • -end-pos​:结束 binlog 位置(在 -end-file​ 中的偏移量,默认到文件结尾)
  • -start-datetime​:起始时间(格式 YYYY-MM-DD HH:MM:SS​,过滤此时间之后的操作)
  • -end-datetime​:结束时间(格式同上,过滤此时间之前的操作)

三、过滤参数

用于筛选需要解析的数据库、表或操作类型:

  • -database​:只解析指定数据库(可多个,用逗号分隔,如 db1,db2​)
  • -table​:只解析指定表(需配合 -database​,如 tbl1,tbl2​)
  • -ignore-database​:忽略指定数据库(可多个)
  • -ignore-table​:忽略指定表(需配合 -ignore-database​)
  • -sql-type​:只解析指定操作类型(如 insert,update​,可选值:insert​/update​/delete​)

四、输出格式与内容参数

控制解析结果的输出形式:

  • -output-dir​:结果输出目录(必填,会自动创建)
  • -sql​:生成可执行的 SQL 语句(默认开启,与 -csv​ 互斥)
  • -csv​:生成 CSV 格式文件(与 -sql​ 互斥)
  • -rollback​:生成回滚 SQL(将 update​ 转为反向 update​,delete​ 转为 insert​)
  • -no-primary-key​:生成 SQL 时忽略主键(适用于某些特殊场景)
  • -add-extra-info​:在输出中添加额外信息(如 binlog 位置、时间戳)

五、特殊模式参数

  • -local-binlog​:解析本地 binlog 文件(无需连接数据库,需指定 -start-file​ 为本地路径)
  • -flashback​:生成闪回 SQL(类似 -rollback​,但针对旧版本兼容)
  • -daemon​:以守护进程模式运行(持续解析新产生的 binlog)
  • -file-per-table​:按表拆分输出文件(每个表单独生成 SQL/CSV 文件)

六、其他辅助参数

  • -help​:显示所有参数说明
  • -version​:显示 my2sql 版本
  • -log-level​:日志级别(info​/warn​/error​,默认 info​)
  • -worker-count​:解析线程数(加快大文件处理速度,默认 4)

实战演练:

初始状态:

(创一个库环境)

把虚拟数据库文件拖过去

1解压数据:unzip test_db-master.zip

2切换到:cd test_db-master

ls查看目录下文件:这个里面的employees.sql就是数据库内容

导入库的时候导入employees这个文件

3.mysql -uroot -p123.com -t < employees.sql #(耗时长,不要打断)

4.进入库中:mysql -uroot -pRoot@123

5.刷新二进制日志文件:flush logs;

(bin-log日志开启状态)可以通过命令 show variables like “log_bin”查看开启状态如果是on就是开启的。

6.mysql> show variables like "log_bin";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.02 sec)
ON为开启
OFF为关闭

假设:我们不小心把一个表全删了???那我们该怎么做捏????

1.把软件直接拖进去然后给他一个执行权限

chmod +x my2sql

1.先查看bin-log日志里确认误操作的

show binary logs;

查看最后那个bin-log日志假设我们最后操作的那个日志例如是:mysql-bin.000004

2.查看目录的存放位置,里面有数据

show variables like "datadir";

里面有路径例如/var/log/bin-log。

mysql> show variables like "datadir";
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.01 sec)

查看刚刚那个日志文件binlog.000004在这里,但是这个日志里面的内容我们看不懂,所以要通过工具解析成我们能看懂的sql语句

4.使用my2sql工具解析文件。

./my2sql \-user root \                                     # 指定连接 MySQL 的用户名,此处为 root-password Root@123 \                            # 指定 MySQL 用户的登录密码-host 127.0.0.1 \                                # 指定 MySQL 服务器地址,127.0.0.1 表示本地连接-port 3306 \                                     # 指定 MySQL 服务监听端口,默认为 3306-databases employees \                           # 指定需要解析的数据库名,此处为 employees-tables titles \                                 # 指定需要恢复的表名,此处为 titles(可指定多个表,用逗号分隔)-mode repl \                                     # 指定解析模式为 "repl"(实时解析模式),适用于从当前日志开始回放-work-type 2sql \                                # 工作类型:生成可执行的原始 SQL 语句(正向 SQL)-start-file /var/lib/mysql/mysql-bin.000027 \    # 指定解析的起始 binlog 文件-output-dir /tmp     例如:
./my2sql  -user root -password 123.com -host 127.0.0.1 -port 3306  -databases employees -tables titles -mode repl-work-type 2sql  -start-file /var/lib/mysql/mysql-bin.000004 -output-dir /tmp     

出现一堆info就是解析成功了。

5.输出到了/tmp/binlog_status.txt里面,我们可以查看一下

[root@mysql_1 tmp]# cat /tmp/binlog_status.txt
binlog starttime stoptime startpos stoppos inserts updates deletes database table
mysql-bin.000004 2025-08-16_15:25:23 2025-08-16_15:25:26 13585383 23505305 443308 0 0 employees titles
mysql-bin.000004 2025-08-16_16:00:32 2025-08-16_16:00:32 66378688 76293245 0 0 443308 employees titles

这里binlog_status.txt内容解析:
binlog: binlog日志名
starttime: 事务开始时间
stoptime: 事务停止时间
startpos: 事务开始位置
stoppos: 事务停止位置
inserts: 插入操作
updates: 更新操作
deletes: 删除操作
database: 涉及到的数据库
table: 涉及到的表

我们可以看到,mysql-bin.000027日志记录了一系列操作,在2025年8月16日16:00:32开始,2025年8月16日16:00:32结束(删除操作不足一秒),employees库的titles表进行了delete操作,操作数据量443308行,

6.使用my2sql生成回滚roolback.sql

mkdir -p /tmp/flashback/ #这个目录用来放回滚后的内容

./my2sql \                           # 命令名称:my2sql,用于解析 MySQL binlog 并生成 SQL-user root \                      # 指定连接 MySQL 数据库的用户名为 root-password Nsoas123! \             # 指定用户的密码(注意:明文密码存在安全风险,建议使用更安全的方式)-host 127.0.0.1 \                 # 指定 MySQL 服务器地址,这里是本地主机-port 3306 \                      # 指定 MySQL 服务端口,默认为 3306-databases employees \            # 指定要解析的数据库名:employees-tables titles \                # 指定要解析的表名:dept_emp(必须与 -databases 配合使用)-mode repl \                      # 解析模式为 "repl"(replay 的缩写),表示重放原始 SQL 操作# 其他可能模式:rollback(生成回滚 SQL)、print(仅打印不输出)-work-type rollback \             # 工作类型为 rollback,表示生成用于回滚(撤销)的 SQL 语句# 即将 DELETE 变成 INSERT,INSERT 变成 DELETE,UPDATE 恢复旧值-start-file /var/lib/mysql/mysql-bin.000027 \  # 指定从哪个 binlog 文件开始解析-output-dir /tmp/flashback/       # 指定输出目录,生成的回滚 SQL 文件将保存在此路径下
./my2sql -user root -password 数据库密码 -host 主机ip -port 3306 -databases 对应表所在的数据库 -tables 不小心删掉的表 -mode rep1 -work-type roolback -start-file 前面日志文件所在完整路径 -output-dir 回滚后内容放哪
./my2sql -user root -password 123.com -host 127.0.0.1 -port 3306 -databases employees -tables titiles -mode rep1 -work-type roolback -start-file /var/lib/mysql/binlog_000004 -output-dir /tmp/flashback

执行完后会在 前面创的目录里/tmp/flashback/ 生成一个roolback.sql这个文件里面就是sql语句

7.把sql语句还原

mysql -uroot -p123.com < /tmp/flashback/ roolback.sql

http://www.dtcms.com/a/340248.html

相关文章:

  • WT2606B 驱屏语音芯片新增蓝牙功能:功能集成一体化,产品升级自动化,语音交互无线化,场景应用普适化!
  • Java 性能优化实战(二):JVM 调优的 5 个核心维度
  • 2.Shell脚本修炼手册之---创建第一个 Shell 脚本
  • Windows 11 安装 Miniconda + Mamba,配置国内源
  • KV cache
  • java八股文-JVM相关面试题-参考回答
  • 计算机视觉 图片处理 在骨架化过程中,每次迭代都会从图像的边缘移除一层像素,直到只剩下单像素宽度的骨架
  • 机器学习--数据清洗—(续篇)
  • 【论文阅读】Multi-metrics adaptively identifies backdoors in Federated Learning
  • Python文件操作与异常处理详解 :基础方法、注意事项及os模块常用功能
  • day31 SQLITE
  • 百度Q2财报:总营收327亿 AI新业务收入首次超100亿
  • 前端-JavaScript笔记(核心语法)
  • Go语言数据类型全解析
  • 线程安全的产生以及解决方案
  • 记一次pnpm start启动异常
  • 学习设计模式《二十三》——桥接模式
  • 算法实战入门第二篇:链表结构与五大经典应用
  • 如何制作免费的比特币冷钱包
  • C++中的 Eigen库使用
  • 机器学习算法核心总结
  • AI全栈工程师:重塑软件开发全生命周期的未来革命
  • Nginx目录结构与配置文件全解析
  • 3-1〔OSCP ◈ 研记〕❘ WEB应用攻击▸理论概述 OWASP
  • 【LeetCode 热题 100】279. 完全平方数——(解法三)空间优化
  • Windows 中的“计数器”
  • ASP.NET 使用redis 存储session 负载机器共享会话状态
  • 【39页PPT】大模型DeepSeek在运维场景中的应用(附下载方式)
  • RabbitMQ:消息转化器
  • 高通 XR 系列芯介绍