MySQL—使用binlog日志恢复数据

article/2025/8/5 12:48:48

一、binlog日志恢复数据简介

在 MySQL 中,使用二进制日志(binlog)恢复数据是一种常见的用于故障恢复或数据找回的方法。以下是详细的使用步骤:

  1. 确认 binlog 已启用:首先需要确认 MySQL 服务器已经启用了二进制日志功能。可以通过查看 MySQL 的配置文件(通常是 my.cnf 或 my.ini),检查是否存在 log-bin 配置项。如果配置文件中存在类似 log-bin=mysql-bin 的配置,就表示已经启用了二进制日志。也可以在 MySQL 命令行中执行 SHOW VARIABLES LIKE 'log_bin'; 命令,若 Value 为 ON,则说明已启用。
  2. 找到需要的 binlog 文件:二进制日志文件默认会以 mysql-bin.xxxxxx 的形式命名,xxxxxx 是一个数字编号。可以通过 SHOW BINARY LOGS; 命令查看所有的二进制日志文件列表,确定需要用于恢复数据的日志文件范围。如果知道数据丢失或误操作的大致时间点,可以使用 SHOW BINLOG EVENTS IN '日志文件名'; 命令查看指定日志文件中的事件,找到对应的操作记录。
  3. 准备恢复环境:为了恢复数据,最好在一个与原生产环境相同或相似的测试环境中进行操作。可以使用备份的数据文件先恢复到一个时间点,然后再通过 binlog 来补充后续的操作。
  4. 使用 mysqlbinlog 工具解析 binlogmysqlbinlog 是 MySQL 提供的用于解析二进制日志的工具。可以使用以下命令来解析指定的二进制日志文件:
mysqlbinlog [选项] 二进制日志文件名

例如,mysqlbinlog --no-defaults mysql-bin.000001 可以解析 mysql-bin.000001 这个日志文件。常用的选项包括 --start-datetime 和 --stop-datetime 来指定时间范围,--start-position 和 --stop-position 来指定日志位置范围。例如,只恢复某个时间段内的操作,可以使用 mysqlbinlog --start-datetime='2024-01-01 00:00:00' --stop-datetime='2024-01-02 00:00:00' mysql-bin.000001 。
5. 将解析后的内容应用到数据库:将 mysqlbinlog 解析后的 SQL 语句应用到目标数据库中,可以将解析结果通过管道直接输入到 mysql 客户端来执行。例如:

mysqlbinlog [选项] 二进制日志文件名 | mysql -u用户名 -p密码

假设用户名是 root,密码是 123456,要恢复 mysql-bin.000001 这个日志文件中的数据,可以执行 mysqlbinlog --no-defaults mysql-bin.000001 | mysql -uroot -p123456 。

在使用 binlog 恢复数据时,要特别小心,因为错误的操作可能会导致数据进一步丢失或损坏。在正式恢复生产环境数据之前,务必在测试环境中进行充分的测试。

二、使用binlog日志恢复数据的步骤

1、前提

在数据库的配置文件中一定要开启binlog日志,否则不会有binlog日志产生。

[mysqld]
log_bin = /var/log/mysql/mysql-bin.log
server-id = 1

 

2、可选择的binlog日志配置项

  • 添加配置项:在[mysqld]部分添加或修改以下配置内容。
    • server-id=1:每个 MySQL 服务器必须有一个唯一的 ID,一般设置为正整数。
    • log_bin=mysql-bin:指定开启 binlog 日志,并设置日志文件的基础名,默认存储在 MySQL 的数据目录下,也可指定绝对路径,如log_bin=/data/mysql/mysql-bin
    • binlog_format=ROW:设置 binlog 的格式,可选项有ROW(记录每一行数据的修改细节)、STATEMENT(记录 SQL 语句本身)、MIXED(混合模式),推荐使用ROW格式。
    • expire_logs_days=7:设置 binlog 日志自动过期的天数,到期后会自动删除。
[mysqld]
binlog_format = ROW

STATEMENT格式记录了语句的原文,RO格式记录了每行数据的变化,MIXED格式在某些情况下会记录为STATEMENT,在其他情况下会记录为ROW。

确保配置后重启MySQL服务以使更改生效。

注意:在生产环境中更改这些配置需要谨慎,因为它可能会影响数据库的性能和复制

3、使用命令行在系统中进行操作

  • 登录 MySQL:使用命令mysql -u root -p,输入密码登录到 MySQL 数据库3。
  • 执行命令启用 binlog3
    • SET GLOBAL binlog_format=ROW;:设置 binlog 格式为ROW,也可根据需求设置为STATEMENTMIXED
    • SET GLOBAL binlog-do-db=<要记录更改的数据库>;:指定要记录更改的数据库,如果要记录多个数据库,数据库之间用逗号分隔。
    • SET GLOBAL binlog-ignore-db=<要忽略的数据库>;:指定要忽略的数据库,多个数据库之间用逗号分隔。
  • 保存设置:执行COMMIT;保存设置3。

配置完成后,可以使用show variables like 'log_bin%';命令查看 binlog 是否已启用。如果ValueON,则表示 binlog 已经成功开启。

4、确认binlog日志是否开启

确认binlog已启用:
SHOW VARIABLES LIKE 'log_bin';查看当前的日志文件:
SHOW BINARY LOGS;查看binlog的格式(可选):
SHOW VARIABLES LIKE 'binlog_format';

5、使用mysqlbinlog工具查看binlog二进制日志文件

三、数据备份和恢复步骤

 步骤一:在sql中插入数据

步骤二:备份数据(准确定位到需要恢复数据的时间点)

模拟生产每天数据备份的的数据

mysqldump -ustc -pppp --master-data=2 --single-transaction -S /opt/sumscope/mysql/mysql.sock test stc > stc.sql

备份命令要带上 --master-data=2 --single-transaction

在 MySQL 中,--master-data=2 和 --single-transaction 是 mysqldump 命令常用的参数,它们各自有不同的作用,以下为你详细介绍:

--master-data=2 参数详解
  • 作用:该参数用于在执行 mysqldump 备份时,记录主服务器的二进制日志文件名(File)和位置(Position)信息到备份文件中。这对于后续搭建主从复制环境非常重要,因为从服务器需要知道从主服务器的哪个二进制日志位置开始复制数据。当 --master-data 设置为 2 时,会在备份文件中添加一个 CHANGE MASTER TO 语句,其中包含了主服务器的二进制日志文件名和位置信息。
  • 示例:假设执行 mysqldump --master-data=2 -u root -p mydatabase > backup.sql 命令来备份名为 mydatabase 的数据库。备份完成后,在 backup.sql 文件中会看到类似以下的内容(部分示例):
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=459;
--
-- Current Database: `mydatabase`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mydatabase` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE `mydatabase`;
--
-- Table structure for table `users`
--
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
--
-- Dumping data for table `users`
--
LOCK TABLES `users` WRITE;
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
INSERT INTO `users` (`id`, `name`) VALUES (1,'John');
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
UNLOCK TABLES;

  • 与 --master-data=1 的区别--master-data=1 也会记录主服务器的二进制日志信息,但它会在执行 mysqldump 时,对主服务器加全局读锁(FLUSH TABLES WITH READ LOCK),直到备份完成,这期间主服务器无法进行写入操作,会影响数据库的可用性。而 --master-data=2 不会加全局读锁,它是通过在事务中获取二进制日志位置信息来实现的,对数据库的影响较小。
--single-transaction 参数详解
  • 作用:该参数主要用于在 InnoDB 存储引擎的数据库上进行一致性备份。它会在备份开始时开启一个事务,然后在这个事务中执行 SELECT 语句来获取数据,由于 InnoDB 的 MVCC(多版本并发控制)机制,在事务执行期间,其他事务对数据的修改不会影响到本次备份的数据读取,从而保证了备份数据的一致性。在备份过程中,不会对表加锁(除了在获取二进制日志位置时可能会有短暂的锁),所以可以在数据库正常运行时进行备份,不影响业务的写入操作。
  • 适用场景:适用于需要在不影响数据库正常运行的情况下进行在线备份的场景,特别是对于写入频繁的 InnoDB 数据库。例如,在一个电商网站的数据库中,使用 --single-transaction 参数可以在不中断订单处理等写入操作的同时,获取到一个一致的数据库备份。
  • 注意事项--single-transaction 只对 InnoDB 存储引擎有效,对于其他存储引擎(如 MyISAM)不起作用。因为 MyISAM 表不支持事务,所以在备份 MyISAM 表时,可能会出现数据不一致的情况。

--master-data=2 主要用于记录主服务器的二进制日志信息以便后续搭建主从复制,--single-transaction 则用于在不影响数据库正常写入的情况下实现 InnoDB 数据库的一致性备份。

--single-transactionCreates a consistent snapshot by dumping all tables in asingle transaction. Works ONLY for tables stored instorage engines which support multiversioning (currentlyonly InnoDB does); the dump is NOT guaranteed to beconsistent for other storage engines. While a--single-transaction dump is in process, to ensure avalid dump file (correct table contents and binary logposition), no other connection should use the followingstatements: ALTER TABLE, DROP TABLE, RENAME TABLE,TRUNCATE TABLE, as consistent snapshot is not isolatedfrom them. Option automatically turns off --lock-tables.--single-transaction选项在执行mysqldump命令时,会将隔离级别设置为
REPEATABLE READ,并开启一个事务。这样,在备份过程中读取的数据是一个逻辑一致的快照,即使在备份过程中有其他会话对数据进行修改,
也不会影响到备份的数据。这种方式避免了在备份大型数据库时出现长时间的锁定或阻塞现象,对生产环境的业务操作影响较小‌。--master-data=2
该选项将二进制日志的位置和文件名写入到输出中。该选项要求有RELOAD权限,并且必须启用二进制日志。如果该选项值等于1,
位置和文件名被写入CHANGE MASTER语句形式的转储输出,如果你使用该SQL转储主服务器以设置从服务器,从服务器从主服务器二进制日志的正确位置开始。
如果选项值等于2,CHANGE MASTER语句被写成SQL注释。如果value被省略,这是默认动作。

步骤三:在向数据库中插入数据模拟备份到误删除中间的时间段还有其他数据入库 

步骤四:假设不小心删除了数据

 

步骤五:使用mysqlbinlog命令查看binlog日志明文确定删除前的POS的点好截取相关的日志文件

 

步骤六:查看误删时间段的日志信息
/opt/sumscope/mysql/bin/mysqlbinlog binlog.000002  --start-position=备份数据的POS --stop-position=删除数据的POS -vv > redo.biglog

步骤七:数据恢复
 --先导入备份的数据source /opt/sumscope/mysql/logs/stc.sql--再导入binlog中的日志source /opt/sumscope/mysql/logs/redo.biglog


http://www.hkcw.cn/article/mSyUqVbmyu.shtml

相关文章

Kotlin-类和对象

文章目录 类主构造函数次要构造函数总结 对象初始化 类的继承成员函数属性覆盖(重写)智能转换 类的扩展 类 class Student { }这是一个类,表示学生,怎么才能给这个类添加一些属性(姓名,年龄…)呢? 主构造函数 我们需要指定类的构造函数。构造函数也是函数的一种,但是它专门…

OpenWrt 配置 IOS 、 Android USB共享网络

前言 由于快过年了老家的宽带早已到期, 手机卡流量还有100G, 于是想到使用手机USB网络共享给openwrt来上网。 设备准备 准备手机( IOS / Android / USB随身Wi-Fi ) 带USB插口的openwrt路由器 openwrt配置 安装 kmod-usb-net-rndis、kmod-usb-storage 依赖包: 打开openwrt…

手把手教你在VSCode里开启中文模式(新手必看避坑指南)

文章目录 一、核心操作三步走&#xff08;有手就会&#xff09;1. 插件商店精准搜索2. 闪电安装法3. 终极验证 二、常见翻车现场急救指南场景1&#xff1a;插件装了但没反应场景2&#xff1a;菜单汉化不全场景3&#xff1a;终端/调试界面英文 三、高阶玩家必备骚操作1. 多语言自…

8个2025年必备的IntelliJ IDEA免费插件

IntelliJ IDEA 必备免费插件&#xff0c;全面提升 Java 开发效率与代码质量 微信搜索关注《Java学研大本营》 在 Java 开发中&#xff0c;IntelliJ IDEA 已然是一款强大的集成开发环境。但如果能搭配上合适的插件&#xff0c;能让开发体验提升到全新的高度。 今天给大家分享一…

Mac电脑(M芯片)安装ubuntu22.04

一、下载VMware虚拟机 VMware官网下载VMware Fusion 二、下载ubuntu镜像 M系列的Mac电脑要下载arm架构的镜像 方法一&#xff1a;官网下载 方法二&#xff1a;清华源下载 清华源镜像 点击获取下载链接 选择Ubuntu&#xff0c;下载22.04.5(arm64,Server) 三、创建虚拟机 …

Docker Desktop配置国内镜像源教程

在使用 Docker 时&#xff0c;由于默认镜像源在国外&#xff0c;经常会遇到下载速度慢、连接超时等问题。本文将详细介绍如何在 Windows 系统中为 Docker 配置国内镜像源&#xff0c;以提升镜像拉取速度。 常用国内镜像源 https://docker.1ms.run清华镜像源 https://docker.m…

Python详细安装教程——Python及PyCharm超详细安装教程:新手小白也能轻松搞定!(最新版)

Python作为一门简单易学、功能强大的编程语言&#xff0c;近年来在数据分析、人工智能、Web开发等领域广受欢迎。而PyCharm作为一款专业的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了强大的代码编辑、调试和项目管理功能&#xff0c;是Python开发者的得力…

2024年最新版IntelliJ IDEA下载安装过程(含Java环境搭建)

1.摘要 本文介绍了2024年最新版IntelliJ IDEA的下载和安装过程&#xff0c;包括IntelliJ IDEA介绍、Java和JDK的介绍、如何选择社区版和商业版、Java环境的搭建、讲解了JDK的下载安装及配置。同时&#xff0c;文章还简要概述了Java语言的特点和适用场景&#xff0c;是Java初学…

Windows docker下载minio出现“Using default tag: latestError response from daemon”

Windows docker下载minio出现 Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded 此类情况&#xff0c;一般为镜像地址问题。 {"registry-mirrors": ["https://docker.re…

JetBrains 开发工具弹窗 We could not validate your license 包括但不限于IDEA/CLion/GoLand/PyCharm

JetBrains 开发工具弹窗 We could not validate your license 包括但不限于IDEA/CLion/GoLand/PyCharm 关于 JetBrains 开发工具近期更新后&#xff0c;始终弹窗 We could not validate your license的问题处理 其实问题很简单&#xff0c;弹窗的用户其实是因为地区中选择了中国…

Python深度学习环境配置(Pytorch、CUDA、cuDNN),包括Anaconda搭配Pycharm的环境搭建以及基础使用教程(保姆级教程,适合小白、深度学习零基础入门)

全流程导览 一、前言二、基本介绍2.1全过程软件基本介绍2.1.1 Pytorch2.1.2 Anaconda2.1.3 Pycharm2.1.4 显卡GPU及其相关概念2.1.5 CUDA和cuDNN 2.2 各部分相互间的联系和安装逻辑关系 三、Anaconda安装3.1安装Anaconda3.2配置环境变量3.3检验是否安装成功 四、Pycharm安装五、…

从0开始的github学生认证并使用copilot教程(超详细!)

目录 一.注册github账号 1.1、仅仅是注册 1.2、完善你的profile 二、Github 学生认证 邮箱 学校名称 How do you plan to use Github? Upload Proof 学校具体信息 一.注册github账号 1.1、仅仅是注册 1.用如QQ邮箱的第三方邮箱注册github 再添加.edu结尾的教育邮箱&…

黑马Java面试笔记之MySQL篇(优化)

一. 慢查询 在MySQL中&#xff0c;如何定位慢查询&#xff1f; 出现慢查询的情况有以下几种&#xff1a; 聚合查询多表查询表数据量过大查询深度分页查询 表象&#xff1a;页面加载过慢&#xff0c;接口压测响应时间过长&#xff08;超过1s&#xff09; 1.2 如何定位慢查询&…

批量导出CAD属性块信息生成到excel——CAD C#二次开发(插件实现)

本插件可实现批量导出文件夹内大量dwg文件的指定块名的属性信息到excel&#xff0c;效果如下&#xff1a; 插件界面&#xff1a; dll插件如下&#xff1a; 使用方法&#xff1a; 1、获取此dll插件。 2、cad命令行输入netload &#xff0c;加载此dll&#xff08;要求AutoCAD&…

Chrome 通过FTP,HTTP 调用 Everything 浏览和搜索本地文件系统

【提问1】 Chrome调用本地 everything.exe, everything 好像有本地 FTP 服务器&#xff1f; 【DeepSeek R1 回答】 是的&#xff0c;Everything 确实内置了 HTTP/FTP 服务器功能&#xff0c;这提供了一种相对安全的浏览器与本地应用交互的方式。以下是完整的实现方案&#x…

《汇编语言》第13章 int指令

中断信息可以来自 CPU 的内部和外部&#xff0c;当 CPU 的内部有需要处理的事情发生的时候&#xff0c;将产生需要马上处理的中断信息&#xff0c;引发中断过程。在第12章中&#xff0c;我们讲解了中断过程和两种内中断的处理。 这一章中&#xff0c;我们讲解另一种重要的内中断…

CFTel:一种基于云雾自动化的鲁棒且可扩展的远程机器人架构

中文标题&#xff1a; CFTel&#xff1a;一种基于云雾自动化的鲁棒且可扩展的远程机器人架构 英文标题&#xff1a; CFTel: A Practical Architecture for Robust and Scalable Telerobotics with Cloud-Fog Automation 作者信息 Thien Tran, Jonathan Kua, Minh Tran, Hongh…

Spring Boot是什么?

Spring Boot是什么&#xff1f; Spring Boot是什么&#xff1f;1. 引言1.1 什么是Spring Boot&#xff1f;1.2 为什么选择Spring Boot&#xff1f; 2. Spring Boot的起源2.1 Spring框架的历史2.2 Spring Boot的诞生背景 3. Spring Boot的核心特性3.1 快速启动和部署3.2 自动配置…

基于大数据爬虫+Python+数据可视化大屏的慧游数据爬虫与推荐分析系统(源码+论文+PPT+部署文档教程等)

博主介绍&#xff1a;CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringB…

实时响应的秘密:用Spring Boot轻松实现流式AI输出

1、背景 随着AI的快速发展&#xff0c;越来越多的AI应用诞生了&#xff0c;但是AI也有响应慢的问题&#xff0c;一般不能够即时响应&#xff0c;为了优化用户体验&#xff0c;现在大部分AI应用都是实现了打字机的效果&#xff0c;那么这种效果是如何实现的呢&#xff1f;今天我…