mysql如何利用binlog进行数据恢复详解

下面我将为您详细讲解“MySQL如何利用binlog进行数据恢复”的完整攻略。

什么是binlog

binlog即二进制日志(Binary Log),记录MySQL服务器中执行的所有修改操作(如insert、update、delete等)。binlog是MySQL复制和数据恢复中最重要的部分之一。

数据恢复需求

当MySQL数据库中的数据遭到误删除、误更改或磁盘损坏等意外情况导致数据丢失时,需要进行数据恢复。而binlog记录了MySQL服务器的所有修改操作,所以可以利用binlog来还原出误删或误更改的数据。

如何利用binlog进行数据恢复

利用binlog进行数据恢复需要分为以下几个步骤:

1. 找到binlog所在目录

MySQL默认情况下会将binlog存放在数据目录下的binlog文件夹中,可以通过以下命令查看binlog所在目录:

SHOW VARIABLES LIKE '%log_bin%'

2. 找到操作记录所在的binlog文件

使用以下命令查看当前所有binlog文件及其保存路径:

SHOW MASTER STATUS;

可以得到类似以下结果:

+------------------+-----------+--------------+------------------+-------------------+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 552958340 |              |                  |                   |
+------------------+-----------+--------------+------------------+-------------------+

其中,File为binlog文件名,Position为操作记录偏移量。

3. 再次确认误操作需要恢复的记录

可以使用以下命令查看指定时间段内所有的修改操作(如删除操作):

mysqlbinlog --start-datetime="2021-05-01 00:00:00" --stop-datetime="2021-05-01 23:59:59" mysql-bin.000003

4. 生成修改操作的SQL语句

使用以下命令根据操作记录生成SQL语句

mysqlbinlog --start-position=552958340 --stop-position=552959500 mysql-bin.000003 > revert.sql

其中,start-position和stop-position为操作记录的起始偏移量和结束偏移量。

5. 将SQL语句导入到MySQL中

使用以下命令将SQL语句导入到MySQL中

mysql -u root -p < revert.sql

示例说明

假设有一位用户误删了名为mydb的数据库中的student表,现在需要利用binlog进行数据恢复。

示例一

  1. 查看binlog所在目录,假设目录为/var/log/mysql/binlog。
SHOW VARIABLES LIKE '%log_bin%'

结果如下:

+---------------+---------------------------+
| Variable_name | Value                     |
+---------------+---------------------------+
| log_bin       | /var/log/mysql/binlog/ |
+---------------+---------------------------+
1 row in set (0.00 sec)
  1. 找到操作记录所在的binlog文件,假设文件名为mysql-bin.000003,记录偏移量为552958340。
SHOW MASTER STATUS;

结果如下:

+------------------+-----------+--------------+------------------+-------------------+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 552958340 |              |                  |                   |
+------------------+-----------+--------------+------------------+-------------------+
  1. 再次确认误操作需要恢复的记录。使用以下命令查看指定时间段内的所有操作:
mysqlbinlog --start-datetime="2021-05-01 00:00:00" --stop-datetime="2021-05-01 23:59:59" /var/log/mysql/binlog/mysql-bin.000003

假设查询结果中有以下记录(只保留关键部分):

### DELETE FROM `mydb`.`student`
### WHERE
###   @1='1' COLLATE utf8_general_ci
###   @2='张三' COLLATE utf8_general_ci
###   @3='男' COLLATE utf8_general_ci
###   @4='18' COLLATE utf8_general_ci
### ;

### at 552958340
  1. 生成SQL语句。
mysqlbinlog --start-position=552958340 --stop-position=552959500 /var/log/mysql/binlog/mysql-bin.000003 > student_revert.sql

生成的student_revert.sql中包含删除student表的操作语句:

#210501  9:56:47 server id 1  end_log_pos 552959500 Delete_rows: table id 7 flags: STMT_END_F

BINLOG '
i8WDXw8AAAAAkAAAAEoAAAALAAAAMTAwNjQzMTAyNzk2ODU2MDQwMBQAAAAdAAZzdHVkZW50'
+'JAAAAAAAAABRAQM=',
BINLOG '
i8+lXw8AAAAAkAAAAEYAAAALAAAAMTAwNjQzMTAyNzk2ODU2MDQwMBQAAAAIAAQJzdHVkZW50'
+'AJMCAAAAAAABRAQM=',
...
DELETE FROM `mydb`.`student`
 WHERE
   @1='1' COLLATE utf8_general_ci
   @2='张三' COLLATE utf8_general_ci
   @3='男' COLLATE utf8_general_ci
   @4='18' COLLATE utf8_general_ci
;
### at 552958340
...
  1. 导入SQL语句。

使用以下命令将SQL导入到MySQL中,重新创建student表,并将误删除的记录再次插入进去:

mysql -u root -p < student_revert.sql

示例二

如果误删的是单个记录,需要根据删除记录的唯一标识符再次生成SQL语句。

以删除id=1的记录为例,记录如下:

### DELETE FROM `mydb`.`student`
### WHERE
###   @1='1' COLLATE utf8_general_ci
### LIMIT 1
###;

### at 552972618

则需要使用以下命令生成SQL语句:

mysqlbinlog --start-position=552972618 --stop-position=552973009 /var/log/mysql/binlog/mysql-bin.000003 > student1_revert.sql

生成的student1_revert.sql中包含删除id=1学生记录的操作语句:

#210501  9:58:30 server id 1  end_log_pos 552973009 Delete_rows: table id 7 flags: STMT_END_F

BINLOG '
jM9BXg8BAAAAkgAAAEkAAAABAAAAAAAQk9UWQ==',
BINLOG '
jM9BXw8BAAAAkgAAAJcAAAABAAAAAAAQk9UWQ==',
...
DELETE FROM `mydb`.`student`
 WHERE
   @1='1' COLLATE utf8_general_ci
 LIMIT 1
;
### at 552972618
...

假如之前的记录中包含server-id,可以增加以下参数进行过滤:

--read-from-remote-server --stop-never --host=<mysql_slave_ip> --port=<mysql_slave_port> , --exclude-server-id=<server-id>

以上就是基本的MySQL利用binlog进行数据恢复攻略,希望对您有帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mysql如何利用binlog进行数据恢复详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • MySQL之Join语句执行流程是什么

    本文小编为大家详细介绍“MySQL之Join语句执行流程是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL之Join语句执行流程是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 Join语句执行流程 在实际生产中,关于 join 语句使用的问题,一般会集中在以下两类: 不让使用 join,使用 join 有什么问…

    MySQL 2023年4月11日
    00
  • 如何使用Python在MySQL中使用联合查询?

    以下是如何使用Python在MySQL中使用联合查询的完整使用攻略,包括连接MySQL数据库、创建表、插入数据、使用联合查询等步骤。同时,提供两个示例以便更好理解如何使用Python在MySQL中使用联合查询。 步骤1:连接MySQL数据库 在Python中,我们可以使用pymysql模块连接到MySQL数据库。以下是连接MySQL数据库的基本语法: imp…

    python 2023年5月12日
    00
  • oracle查询锁表与解锁情况提供解决方案

    安装Oracle锁监控工具LockSmith 首先需要在Oracle数据库中安装锁监控工具LockSmith,以便在查询锁表与解锁时提供更加详细的信息和方便的操作。 下载LockSmith安装包并解压: $ tar -xzvf locksmith-1.0.tar.gz 执行安装脚本,并按照向导进行安装: $ cd locksmith-1.0 $ ./inst…

    database 2023年5月21日
    00
  • ASP中经常使用的SQL语句与教程说明

    让我来详细讲解ASP中经常使用的SQL语句与教程说明,步骤如下: 1. 连接数据库 在ASP中使用SQL语句首先需要连接数据库,参考下面的代码进行连接: <% ‘连接数据库 set conn=server.createobject("adodb.connection") conn.open "Provider=Micros…

    database 2023年5月21日
    00
  • php安装redis扩展过程介绍

    下面是详细的php安装redis扩展过程介绍攻略。 安装Redis扩展前的准备工作 在安装Redis扩展之前,需要先保证已经安装了Redis服务器,可以通过以下命令检查Redis是否已经安装: redis-cli ping 如果输出为PONG,则表示Redis服务器已经启动,在此基础上开始安装Redis扩展。 安装Redis扩展 步骤1:下载Redis扩展源…

    database 2023年5月22日
    00
  • ORACLE多条件统计查询的简单方法

    下面我来为您详细讲解“ORACLE多条件统计查询的简单方法”的完整攻略。 前言 对于多条件统计查询,通常我们会使用group by语句实现。然而,如果条件数量较多,group by语句就会变得臃肿且不易维护。本文将介绍一种简单的方法,通过使用CASE语句实现多条件统计查询。 方法 假设我们有一个订单表order,字段包括order_id, customer_…

    database 2023年5月21日
    00
  • spring boot项目application.properties文件存放及使用介绍

    介绍 application.properties是SpringBoot项目中常用的一种配置文件,可以用来定义项目的各种属性值,其中包括:数据库链接信息、各种组件的属性以及其他一些自定义属性值等等。本文将对application.properties的存放位置、使用方法以及示例进行详细的介绍。 存放位置 在一个SpringBoot项目中,applicatio…

    database 2023年5月18日
    00
  • 在centos7上安装redis的方法

    下面是详细讲解“在centos7上安装redis的方法”的完整攻略。 1. 安装Redis 在CentOS 7上安装Redis需要使用以下命令: sudo yum install epel-release sudo yum install redis 2. 启动Redis 在CentOS 7上,我们可以用以下命令来启动Redis服务: sudo system…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部