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