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

yizhihongxing

下面我将为您详细讲解“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日

相关文章

  • 详细部署阿里云服务器全过程(图文教程)

    下面我来详细讲解一下“详细部署阿里云服务器全过程(图文教程)”的完整攻略。 环境准备 首先需要准备好以下环境: 阿里云账号 一台空的云服务器 本地电脑安装SSH客户端 创建服务器 在阿里云控制台中,选择“云服务器ECS”,点击“创建实例”按钮。 按照提示填写实例信息,包括地域、可用区、实例类型、镜像、购买数量等。其中,选择镜像时建议选择常用的操作系统,如Ce…

    database 2023年5月22日
    00
  • mysql用户变量与set语句示例详解

    关于“mysql用户变量与set语句示例详解”,我会给你详细讲解一下。 什么是MySQL用户变量 MySQL用户变量是指在MySQL连接期间创建的变量,其生命周期与连接相关。用户变量可以存储字符串、数值和二进制数据等类型的值,而设置它们的语法为: @var_name := value。 其中,@符号为用户变量的前缀,var_name为变量名,value为变量…

    database 2023年5月21日
    00
  • MySQL分区表的正确使用方法

    MySQL分区表是将单张大表按照某种规则进行分割,将数据分散到不同的物理表中,以达到优化查询速度、提升效率的目的。正确使用MySQL分区表是提高数据处理能力和数据查询效率的重要手段。下面是正确使用MySQL分区表的完整攻略。 一、什么是MySQL分区表? MySQL分区表是将单张大表按照某种规则进行分割,将数据分散到不同的物理表中。MySQL提供了多种分区方…

    database 2023年5月22日
    00
  • 如何使用Python查询某个列中的唯一值?

    以下是如何使用Python查询某个列中的唯一值的完整使用攻略。 步骤1:导入模块 在Python中,我们需要导入相应的模块来连接数据库和查询操作。以下是导入mysql-connector-python模块的基本语法: import mysql.connector 以下是导入psycopg2模块的基本语法: import psycopg2 步骤2:连接数据库 …

    python 2023年5月12日
    00
  • 网站维护需要做什么?做好网站维护需要具备哪些知识

    网站维护是一个不可忽视的重要环节,其作用在于保持网站的稳定性、可靠性、安全性,同时也有助于提升用户体验和网站质量。为做好网站维护,需要投入大量的精力和资源,以下是我总结的几个方面: 网站维护需要做什么? 更新网站内容:网站的内容是吸引用户的最重要因素之一,因此需要定期更新,尤其是一些涉及到新闻、资讯、产品信息等内容的网站更要注重。同时,对于一些旧的或者已经过…

    database 2023年5月19日
    00
  • mysql中 datatime与timestamp的区别说明

    MySQL 中的 DATEIME 和 TIMESTAMP 类型都用于存储日期和时间,但它们的存储和工作方式不同。下面详细讲解它们的区别说明。 DATETIME 类型 DATETIME 类型用于存储日期和时间。它使用 8 个字节存储时间和日期,其中前 4 个字节存储日期值,后 4 个字节存储时间值。DATETIME 类型可以存储从 1000 年到 9999 年…

    database 2023年5月22日
    00
  • MySQL中的用户创建与权限管理

    MySQL中的用户创建与权限管理 在MySQL中,用户创建和权限管理是非常重要的操作,本篇文章将详细介绍如何创建用户和管理权限。 1. 创建用户 创建用户需要使用CREATE USER语句,其语法如下: CREATE USER ‘username’@’host’ IDENTIFIED BY ‘password’; 其中,’username’是用户的名称,’h…

    database 2023年5月18日
    00
  • Hive 和 Derby 的区别

    Hive和Derby都是基于Hadoop和Java开发的关系型数据库管理系统,它们有很多相似之处,但也有很多不同之处。下面将详细讲解Hive和Derby的区别,包括它们的定义、架构、优缺点等,并通过实例说明。 1. 定义 Hive是一个基于Hadoop的数据仓库工具,可以把结构化的数据文件映射为一张数据库表,并提供类SQL语言查询功能。Hive支持使用HQL…

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