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日

相关文章

  • windows+mysql集群搭建-三分钟搞定集群

    原文:http://blog.csdn.net/chenxiaochan/article/details/50856072 1、mysql-cluster-gpl-7.4.9-winx64 下载方式:   http://dev.mysql.com/downloads/cluster/ 2、两台电脑 一台配置管理节点,一个数据节点和一个sql节点,一台配置一个…

    MySQL 2023年4月13日
    00
  • Linux系统下实现远程连接MySQL数据库的方法教程

    下面是“Linux系统下实现远程连接MySQL数据库的方法教程”的完整攻略: 准备工作 安装MySQL服务端和客户端: sudo apt install mysql-server mysql-client 配置MySQL服务端允许远程登录: 找到 /etc/mysql/mysql.conf.d/mysqld.cnf 文件,将以下内容的注释取消,并将其中的 b…

    database 2023年5月22日
    00
  • windows上安装mysql5.7

    安装前准备: 系统:windows7-x64 MySql:mysql5.7.19-X64-windows压缩包 安装步骤: 在windows上安装mysql有两种方式,一种是安装mysql压缩包,一种是图形化的安装,只要是配置好my.ini配置文件,压缩包安装比图形化更快更简单。这篇文章主要说明mysql压缩包的安装步骤。 一、新建数据库文件存放目录 将my…

    MySQL 2023年4月12日
    00
  • MySQL锁机制/管理(并发锁,行锁,表锁,预加锁,全局锁等等)-转

    百度博客居然无缘无故被封了。。。。。搬家中。。。  转自 MySQL实验室 1. MySQL中并发和隔离控制机制 Meta-data元数据锁:在table cache缓存里实现的,为DDL(Data Definition Language)提供隔离操作。一种特别的meta-data元数据类型,叫Name Lock。(SQL层) 表级table-level数据…

    MySQL 2023年4月13日
    00
  • Mysql数据库delete操作没报错却删除不了数据的解决

    针对这个问题,我们需要确保删除数据的操作没有出现任何问题,否则就会导致删除不成功。下面我将介绍几种可能影响删除操作的原因,并提供相应的解决方法。 1. WHERE条件不准确 如果我们的删除操作没有使用准确的WHERE条件,那么就有可能会删除错误的行,或者完全没有删除任何行。例如,我们可能打错了表名或列名,或者WHERE条件没有符合要求。 为了保证WHERE条…

    database 2023年5月18日
    00
  • pymysql实现增删改查的操作指南(python)

    pymysql实现增删改查的操作指南 什么是pymysql PyMySQL 是在 Python 3.x 版本中用于连接 MySQL 服务器的一个库,语言上几乎与 Python 自带的 mysql 连接库 MySQLdb 基本一致。PyMySQL 使用纯 Python 实现,它不需要编译就能够安装到 Python 解释器中。 安装PyMySQL 使用 pip …

    database 2023年5月22日
    00
  • Derby 和 MongoDB 的区别

    Derby和MongoDB是两个不同类型的数据库,具有不同的特性和用途。接下来,我将详细讲解两者的区别。 Derby 什么是Derby Derby是一个基于Java平台的嵌入式关系型数据库管理系统。它是以纯Java代码实现的,并且可以嵌入到应用程序中。Derby是Apache软件基金会的一个开源项目。 Derby的特点 嵌入式数据库:Derby是一个面向嵌入…

    database 2023年3月27日
    00
  • 如何选择MySQL存储引擎?

    MySQL是一个开源的关系型数据库管理系统,拥有多种存储引擎(Storage Engine),不同的引擎具有不同的特点和性能表现。可通过修改数据表的存储引擎来优化数据库的性能。 存储引擎介绍 MySQL支持的存储引擎较多,具体如下: 1 InnoDB:支持ACID事务,并发性高,行级锁定、MVCC、自适应哈希索引、为外键提供支持。 2 MyISAM:不支持事…

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