MySQL通过binlog实现恢复数据

 更新时间:2025年01月26日 09:42:43   作者:鲁班班  
在MySQL中,如果不小心删除了数据,可以利用二进制日志(binlog)来恢复数据,本文将通过几个示例为大家介绍一下具体实现方法,希望对大家有所帮助

一、背景

在MySQL中,如果不小心删除了数据,可以利用二进制日志(binlog)来恢复数据。

实质就是将binlog记录中的事件再次执行一遍。

二、前提条件

启用二进制日志:确保 MySQL 启用了二进制日志功能。

有足够的权限:确保有权限访问和读取二进制日志文件。

三、恢复步骤

1.找到相关的二进制日志文件:

查看是否开启二进制日志文件

SHOW VARIABLES LIKE 'log_bin%';

查看二进制日志文件位置

SHOW VARIABLES LIKE 'log_bin_basename';

查看二进制日志文件列表

SHOW BINARY LOGS;

2.使用 mysqlbinlog 工具提取日志:事件位置

先使用show binlog events命令查看binlog记录,确定事件开始位置和结束位置。

查看二进制日志记录

show binlog events in 'binlog.00001';

再使用 mysqlbinlog 提取开始位置和结束位置的日志:

mysqlbinlog /path/to/binlog.000001 --start-position=13508 --stop-position=14142 | mysql -u username -p database_name

替换 /path/to/binlog.000001 为二进制日志文件路径

修改stop-position和stop-position

替换 username 为MySQL 用户名,database_name 为数据库名称。

3.使用 mysqlbinlog 工具提取日志:时间段

使用 mysqlbinlog 提取特定时间段的日志:

mysqlbinlog /path/to/binlog.000001 --start-datetime="YYYY-MM-DD HH:MM:SS" --stop-datetime="YYYY-MM-DD HH:MM:SS" | mysql -u username -p database_name

替换 /path/to/binlog.000001 为二进制日志文件路径

修改 start-datetime 和 stop-datetime

替换 username 为MySQL 用户名,database_name 为数据库名称。

注意事项

备份当前数据:在进行数据恢复操作之前,最好先备份当前数据库,以防止进一步的数据丢失。

测试恢复脚本:在生产环境中执行恢复脚本之前,可以先在测试环境中进行测试,确保恢复操作的正确性。

mysqlbinlog命令只用于恢复,不能用于回滚。适用数据迁移,数据同步的场景。

四、实操

1.插入数据

mysql -u root -p 登陆

➜  ~ mysql -u root -p                  
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 40
Server version: 8.4.3 MySQL Community Server - GPL

插入两条数据

mysql> use ban;

mysql> INSERT INTO t_user (id, name, phone) VALUES ('1', '小明', '110');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO t_user (id, name, phone) VALUES ('2', '小红', '120');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_user;
+----+--------+-------+---------------------+---------------------+
| id | name   | phone | create_dt           | update_dt           |
+----+--------+-------+---------------------+---------------------+
| 1  | 小明   | 110   | 2025-01-24 15:19:39 | 2025-01-24 15:19:39 |
| 2  | 小红   | 120   | 2025-01-24 15:19:46 | 2025-01-24 15:19:46 |
+----+--------+-------+---------------------+---------------------+
2 rows in set (0.00 sec)

2.删除数据

mysql> delete from t_user where id in(1,2);
Query OK, 2 rows affected (0.00 sec)

mysql> select * from t_user;
Empty set (0.00 sec)

3.通过binlog恢复删除的数据

找到二进制日志文件:/usr/local/mysql/data/binlog.000002

mysql> SHOW VARIABLES LIKE 'log_bin_basename';
+------------------+------------------------------+
| Variable_name    | Value                        |
+------------------+------------------------------+
| log_bin_basename | /usr/local/mysql/data/binlog |
+------------------+------------------------------+
1 row in set (0.01 sec)

​​​​​​​mysql> SHOW BINARY LOGS;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000001 |       668 | No        |
| binlog.000002 |     14142 | No        |
| binlog.000003 |       181 | No        |
| binlog.000004 |       181 | No        |
| binlog.000005 |       181 | No        |
+---------------+-----------+-----------+
5 rows in set (0.01 sec)

查看二进制日志记录,确认事件开始位置(13508)和结束位置(14142)

mysql> show binlog events in 'binlog.00002';

| Log_name      | Pos   | Event_type     | Server_id | End_log_pos | Info  
| binlog.00002 | 13508 | Anonymous_Gtid |         1 |       13587 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
| binlog.00002 | 13587 | Query          |         1 |       13669 | BEGIN                               
| binlog.00002 | 13669 | Table_map      |         1 |       13734 | table_id: 109 (ban.t_user)          
| binlog.00002 | 13734 | Write_rows     |         1 |       13794 | table_id: 109 flags: STMT_END_F     
| binlog.00002 | 13794 | Xid            |         1 |       13825 | COMMIT /* xid=1058 */               
| binlog.00002 | 13825 | Anonymous_Gtid |         1 |       13904 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
| binlog.00002 | 13904 | Query          |         1 |       13986 | BEGIN                               
| binlog.00002 | 13986 | Table_map      |         1 |       14051 | table_id: 109 (ban.t_user)          
| binlog.00002 | 14051 | Write_rows     |         1 |       14111 | table_id: 109 flags: STMT_END_F     
| binlog.00002 | 14111 | Xid            |         1 |       14142 | COMMIT /* xid=1059 */               

使用 mysqlbinlog 恢复数据

➜  ~ mysqlbinlog /usr/local/mysql/data/binlog.00002 --start-position=13508 --stop-position=14142 | mysql -u root -p ban 

4.完整示例

--登陆--
➜  ~ mysql -u root -p                  
Enter password: 

--插入数据----
mysql> use ban;
mysql> INSERT INTO t_user (id, name, phone) VALUES ('1', '小明', '110');
mysql> INSERT INTO t_user (id, name, phone) VALUES ('2', '小红', '120');
mysql> select * from t_user;
+----+--------+-------+---------------------+---------------------+
| id | name   | phone | create_dt           | update_dt           |
+----+--------+-------+---------------------+---------------------+
| 1  | 小明   | 110   | 2025-01-24 15:19:39 | 2025-01-24 15:19:39 |
| 2  | 小红   | 120   | 2025-01-24 15:19:46 | 2025-01-24 15:19:46 |
+----+--------+-------+---------------------+---------------------+
2 rows in set (0.00 sec)

--删除数据--
mysql> delete from t_user where id in(1,2);
mysql> select * from t_user;
Empty set (0.00 sec)

--通过binlog恢复删除的数据--

--找到二进制日志文件:/usr/local/mysql/data/binlog.000002
mysql> SHOW VARIABLES LIKE 'log_bin_basename';
+------------------+------------------------------+
| Variable_name    | Value                        |
+------------------+------------------------------+
| log_bin_basename | /usr/local/mysql/data/binlog |
+------------------+------------------------------+
1 row in set (0.01 sec)

mysql> SHOW BINARY LOGS;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000001 |       668 | No        |
| binlog.000002 |     14142 | No        |
| binlog.000003 |       181 | No        |
| binlog.000004 |       181 | No        |
| binlog.000005 |       181 | No        |
+---------------+-----------+-----------+
5 rows in set (0.01 sec)

--查看二进制日志记录,确认事件开始位置(13508)和结束位置(14142)--
mysql> show binlog events in 'binlog.00002';

| Log_name      | Pos   | Event_type     | Server_id | End_log_pos | Info  
| binlog.00002 | 13508 | Anonymous_Gtid |         1 |       13587 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
| binlog.00002 | 13587 | Query          |         1 |       13669 | BEGIN                               
| binlog.00002 | 13669 | Table_map      |         1 |       13734 | table_id: 109 (ban.t_user)          
| binlog.00002 | 13734 | Write_rows     |         1 |       13794 | table_id: 109 flags: STMT_END_F     
| binlog.00002 | 13794 | Xid            |         1 |       13825 | COMMIT /* xid=1058 */               
| binlog.00002 | 13825 | Anonymous_Gtid |         1 |       13904 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
| binlog.00002 | 13904 | Query          |         1 |       13986 | BEGIN                               
| binlog.00002 | 13986 | Table_map      |         1 |       14051 | table_id: 109 (ban.t_user)          
| binlog.00002 | 14051 | Write_rows     |         1 |       14111 | table_id: 109 flags: STMT_END_F     
| binlog.00002 | 14111 | Xid            |         1 |       14142 | COMMIT /* xid=1059 */            

--使用 mysqlbinlog 恢复数据--
➜  ~ mysqlbinlog /usr/local/mysql/data/binlog.00002 --start-position=13508 --stop-position=14142 | mysql -u root -p ban 

到此这篇关于MySQL通过binlog实现恢复数据的文章就介绍到这了,更多相关MySQL binlog恢复数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL9.1.0实现GTID模式的项目实践

    MySQL9.1.0实现GTID模式的项目实践

    本文主要介绍了在MySQL 9.1.0中实现GTID模式的主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • 详解MySQL如何交换两列值数据

    详解MySQL如何交换两列值数据

    最近遇到了需要将表里的两列值进行互换,原因是存库时值存放反了,在编码语言中,我们一般可以通过定义一个临时变量c,将b赋值给c,a赋值给b,c赋值给a就能实现a和b的值互换,那么,在mysql中,非储存过程的sql语句,没有定义变量的过程,如何实现呢,接下来由小编给大家介绍一下
    2024-01-01
  • MySQL免密登录的几种配置方式小结

    MySQL免密登录的几种配置方式小结

    在日常运维中,为了简化登录操作或提高自动化脚本执行的效率,我们经常需要配置 MySQL 免密登录,MySQL 支持通过多种方式实现免密登录,这样我们就可以避免每次输入密码,本文给大家介绍了MySQL免密登录的几种配置方式,需要的朋友可以参考下
    2024-10-10
  • MySQL分支和循环结构方式

    MySQL分支和循环结构方式

    在MySQL中,IF函数用于根据条件返回不同的值,类似于Java的三目运算符,CASE语句则提供了两种形式:简单CASE函数和搜索CASE函数,分别类似于Java中的switch-case结构和多重if判断,这些控制流函数在数据库查询和数据处理中非常有用,可以实现复杂的逻辑判断
    2024-10-10
  • mysql 8.0.18 安装配置方法图文教程(linux)

    mysql 8.0.18 安装配置方法图文教程(linux)

    这篇文章主要介绍了linux下mysql 8.0.18 安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • 宝塔安装的MySQL无法连接的情况及解决方案

    宝塔安装的MySQL无法连接的情况及解决方案

    宝塔面板是一款流行的服务器管理工具,其中集成的 MySQL 数据库有时会出现连接问题,本文详细介绍两种最常见的 MySQL 连接错误:“1130 - Host is not allowed to connect” 和 “1045 - Access denied”,以及它们的解决方案,需要的朋友可以参考下
    2025-05-05
  • mysql安装配置详解教程(一)

    mysql安装配置详解教程(一)

    这篇文章主要为大家详细介绍了mysql安装配置教程,以图文结合的方式为大家分享了mysql安装步骤,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • MySQL中主从复制重复键问题修复方法

    MySQL中主从复制重复键问题修复方法

    这篇文章主要介绍了MySQL中主从复制重复键问题修复,需要的朋友可以参考下
    2014-12-12
  • MySQL中count()查询的性能梳理

    MySQL中count()查询的性能梳理

    这篇文章主要为大家详细介绍了MySQL中count()查询的性能对比与优化,文中的示例代码讲解详细,具有一定的参考价值,需要的可以了解一下
    2023-07-07
  • 关于B+树的使用及说明

    关于B+树的使用及说明

    这篇文章主要介绍了关于B+树的使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06

最新评论