当前位置: 首页 > 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.lryc.cn/news/626495.html

相关文章:

  • iOS App 上架实战 从内测到应用商店发布的全周期流程解析
  • QT聊天项目DAY20
  • java17学习笔记
  • 【Tech Arch】Apache HBase分布式 NoSQL 数据库
  • idea maven 设置代理
  • FastAPI初学
  • 《深度解析PerformanceObserverAPI: 精准捕获FID与CLS的底层逻辑与实践指南》
  • 【STM32】HAL库中的实现(六):DAC (数模转换)
  • 调用海康威视AI开放平台接口实现人体关键点检测
  • Java毕业设计选题推荐 |基于SpringBoot+Vue的知识产权管理系统设计与实现
  • langchain-ds的报告生成提示词
  • 结构化 OCR 技术:破解各类检测报告信息提取难题
  • Objective-C 版本的 LiveEventBus 效果
  • java和javascript在浮点数计算时的差异
  • Flink实现Exactly-Once语义的完整技术分解
  • mac 搭建docker-compose,部署docker应用
  • Android 入门到实战(三):ViewPager及ViewPager2多页面布局
  • linux内核 - 内存管理单元(MMU)与地址翻译(二)
  • 0820 SQlite与c语言的结合
  • Mac编译Android AOSP
  • 【密码学实战】X86、ARM、RISC-V 全量指令集与密码加速技术全景解析
  • deque的原理与实现(了解即可)
  • HTML5中秋网站源码
  • 基于RK3568储能EMU,储能协调控制器解决方案
  • 生产电路板的公司有哪些?国内生产电路板的公司
  • MySQL 8.x的性能优化文档整理
  • RK3576赋能无人机巡检:多路视频+AI识别引领智能化变革
  • 【38页PPT】关于5G智慧园区整体解决方案(附下载方式)
  • 无人机图传 便携式5G单兵图传 HDMI图传设备 多卡5G单兵图传设备详解
  • 元宇宙的网络基础设施:5G 与 6G 的关键作用