【数据库】MySQL 使用Binlog恢复数据实战

2024-08-23 05:04

本文主要是介绍【数据库】MySQL 使用Binlog恢复数据实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 基于Binlog恢复数据
      • 1)使用mysqlbinlog工具查看binlog内容
      • 2)查看指定数据库binlog日志
      • 3)查看指定数据库指定表指定语句的位置
      • 4)根据binlog日志位置恢复删除数据
      • 5)根据binlog时间点恢复删除数据

基于Binlog恢复数据

1)使用mysqlbinlog工具查看binlog内容

mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000005

mysqlbinlog: MySQL 的命令行工具,用于读取和解析二进制日志文件。
–base64-output=DECODE-ROWS: 指定如何处理 base64 编码的数据。这里设置为 DECODE-ROWS,意味着对于每一条包含 base64 编码数据的 SQL 语句(如 INSERT, UPDATE, DELETE),都将解码这些数据并将其包含在 SQL 语句中。
-v: 显示详细信息。
mysql-bin.000005: 指定要解析的 binlog 文件名

2)查看指定数据库binlog日志

mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000005 --database=nacos_dev

-d,–database=name 仅显示指定数据库的转储内容

3)查看指定数据库指定表指定语句的位置

查找nacos_dev数据库users表的binlog日志

mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000007 --database=nacos_dev |grep  -C 20 -i users
---------------------------------------------------------------------------------------------------------------------
mysqlbinlog: [Warning] Skipping '!includedir /etc/mysql/conf.d/' directive as maximum include recursion level was reached in file /etc/mysql/conf.d/my.cnf at line 29.
WARNING: The option --database has been used. It may filter parts of transactions, but will include the GTIDs in any case. If you want to exclude or include transactions, you should use the options --exclude-gtids or --include-gtids, respectively, instead.
# at 14143
# at 14372
#240822  5:31:50 server id 1  end_log_pos 14403 CRC32 0x527a2cf8        Xid = 828
COMMIT/*!*/;
# at 14403
#240822  6:24:23 server id 1  end_log_pos 14482 CRC32 0x2db5daac        Anonymous_GTID  last_committed=28       sequence_number=29      rbr_only=yes    original_committed_timestamp=1724307863861951 immediate_commit_timestamp=1724307863861951     transaction_length=352
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1724307863861951 (2024-08-22 06:24:23.861951 UTC)
# immediate_commit_timestamp=1724307863861951 (2024-08-22 06:24:23.861951 UTC)
/*!80001 SET @@session.original_commit_timestamp=1724307863861951*//*!*/;
/*!80014 SET @@session.original_server_version=80027*//*!*/;
/*!80014 SET @@session.immediate_server_version=80027*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 14482
#240822  6:24:23 server id 1  end_log_pos 14553 CRC32 0x8f9293c0        Query   thread_id=2639  exec_time=0     error_code=0
SET TIMESTAMP=1724307863/*!*/;
SET @@session.sql_mode=1168113696/*!*/;
BEGIN
/*!*/;
# at 14553
#240822  6:24:23 server id 1  end_log_pos 14618 CRC32 0xcd77d550        Table_map: `nacos_dev`.`users` mapped to number 123
# at 14618
#240822  6:24:23 server id 1  end_log_pos 14724 CRC32 0xfaf76371        Write_rows: table id 123 flags: STMT_END_F
### INSERT INTO `nacos_dev`.`users`
### SET
###   @1='nacos1'
###   @2='$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu'
###   @3=1
# at 14724
#240822  6:24:23 server id 1  end_log_pos 14755 CRC32 0xc4d78371        Xid = 945
COMMIT/*!*/;
# at 14755
#240822  6:24:23 server id 1  end_log_pos 14834 CRC32 0x05e34489        Anonymous_GTID  last_committed=29       sequence_number=30      rbr_only=yes    original_committed_timestamp=1724307863953622 immediate_commit_timestamp=1724307863953622     transaction_length=352
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1724307863953622 (2024-08-22 06:24:23.953622 UTC)
# immediate_commit_timestamp=1724307863953622 (2024-08-22 06:24:23.953622 UTC)
/*!80001 SET @@session.original_commit_timestamp=1724307863953622*//*!*/;
/*!80014 SET @@session.original_server_version=80027*//*!*/;
/*!80014 SET @@session.immediate_server_version=80027*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 14834
#240822  6:24:23 server id 1  end_log_pos 14905 CRC32 0xfd287302        Query   thread_id=2639  exec_time=0     error_code=0
SET TIMESTAMP=1724307863/*!*/;
BEGIN
/*!*/;
# at 14905
#240822  6:24:23 server id 1  end_log_pos 14970 CRC32 0xc1874932        Table_map: `nacos_dev`.`users` mapped to number 123
# at 14970
#240822  6:24:23 server id 1  end_log_pos 15076 CRC32 0x1a2d51f9        Write_rows: table id 123 flags: STMT_END_F
### INSERT INTO `nacos_dev`.`users`
### SET
###   @1='nacos2'
###   @2='$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu'
###   @3=1
# at 15076
#240822  6:24:23 server id 1  end_log_pos 15107 CRC32 0xa8b9a67d        Xid = 947
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

这段日志说明了插入2条记录到users表里,记录位置为end_log_pos 15107,即15107

4)根据binlog日志位置恢复删除数据

删除users表中的一条数据,重新查看binlog日志,发现有删除记录,现在开始恢复。
我们只需要把数据恢复到删除前的即可,所以找到删除前的日志位置是上一步操作的15107

mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000007 --database=nacos_dev |grep  -C 20 -i users
------------------------------------------------------------------------------------------------
mysqlbinlog: [Warning] Skipping '!includedir /etc/mysql/conf.d/' directive as maximum include recursion level was reached in file /etc/mysql/conf.d/my.cnf at line 29.
WARNING: The option --database has been used. It may filter parts of transactions, but will include the GTIDs in any case. If you want to exclude or include transactions, you should use the options --exclude-gtids or --include-gtids, respectively, instead.
# at 14143
# at 14372
#240822  5:31:50 server id 1  end_log_pos 14403 CRC32 0x527a2cf8        Xid = 828
COMMIT/*!*/;
# at 14403
#240822  6:24:23 server id 1  end_log_pos 14482 CRC32 0x2db5daac        Anonymous_GTID  last_committed=28       sequence_number=29      rbr_only=yes    original_committed_timestamp=1724307863861951 immediate_commit_timestamp=1724307863861951     transaction_length=352
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1724307863861951 (2024-08-22 06:24:23.861951 UTC)
# immediate_commit_timestamp=1724307863861951 (2024-08-22 06:24:23.861951 UTC)
/*!80001 SET @@session.original_commit_timestamp=1724307863861951*//*!*/;
/*!80014 SET @@session.original_server_version=80027*//*!*/;
/*!80014 SET @@session.immediate_server_version=80027*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 14482
#240822  6:24:23 server id 1  end_log_pos 14553 CRC32 0x8f9293c0        Query   thread_id=2639  exec_time=0     error_code=0
SET TIMESTAMP=1724307863/*!*/;
SET @@session.sql_mode=1168113696/*!*/;
BEGIN
/*!*/;
# at 14553
#240822  6:24:23 server id 1  end_log_pos 14618 CRC32 0xcd77d550        Table_map: `nacos_dev`.`users` mapped to number 123
# at 14618
#240822  6:24:23 server id 1  end_log_pos 14724 CRC32 0xfaf76371        Write_rows: table id 123 flags: STMT_END_F
### INSERT INTO `nacos_dev`.`users`
### SET
###   @1='nacos1'
###   @2='$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu'
###   @3=1
# at 14724
#240822  6:24:23 server id 1  end_log_pos 14755 CRC32 0xc4d78371        Xid = 945
COMMIT/*!*/;
# at 14755
#240822  6:24:23 server id 1  end_log_pos 14834 CRC32 0x05e34489        Anonymous_GTID  last_committed=29       sequence_number=30      rbr_only=yes    original_committed_timestamp=1724307863953622 immediate_commit_timestamp=1724307863953622     transaction_length=352
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1724307863953622 (2024-08-22 06:24:23.953622 UTC)
# immediate_commit_timestamp=1724307863953622 (2024-08-22 06:24:23.953622 UTC)
/*!80001 SET @@session.original_commit_timestamp=1724307863953622*//*!*/;
/*!80014 SET @@session.original_server_version=80027*//*!*/;
/*!80014 SET @@session.immediate_server_version=80027*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 14834
#240822  6:24:23 server id 1  end_log_pos 14905 CRC32 0xfd287302        Query   thread_id=2639  exec_time=0     error_code=0
SET TIMESTAMP=1724307863/*!*/;
BEGIN
/*!*/;
# at 14905
#240822  6:24:23 server id 1  end_log_pos 14970 CRC32 0xc1874932        Table_map: `nacos_dev`.`users` mapped to number 123
# at 14970
#240822  6:24:23 server id 1  end_log_pos 15076 CRC32 0x1a2d51f9        Write_rows: table id 123 flags: STMT_END_F
### INSERT INTO `nacos_dev`.`users`
### SET
###   @1='nacos2'
###   @2='$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu'
###   @3=1
# at 15076
#240822  6:24:23 server id 1  end_log_pos 15107 CRC32 0xa8b9a67d        Xid = 947
COMMIT/*!*/;
# at 15107
#240822  8:12:38 server id 1  end_log_pos 15186 CRC32 0x86889068        Anonymous_GTID  last_committed=30       sequence_number=31      rbr_only=yes    original_committed_timestamp=1724314358298945 immediate_commit_timestamp=1724314358298945     transaction_length=352
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1724314358298945 (2024-08-22 08:12:38.298945 UTC)
# immediate_commit_timestamp=1724314358298945 (2024-08-22 08:12:38.298945 UTC)
/*!80001 SET @@session.original_commit_timestamp=1724314358298945*//*!*/;
/*!80014 SET @@session.original_server_version=80027*//*!*/;
/*!80014 SET @@session.immediate_server_version=80027*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 15186
#240822  8:12:38 server id 1  end_log_pos 15257 CRC32 0x79e992e2        Query   thread_id=4522  exec_time=0     error_code=0
SET TIMESTAMP=1724314358/*!*/;
BEGIN
/*!*/;
# at 15257
#240822  8:12:38 server id 1  end_log_pos 15322 CRC32 0x9525675f        Table_map: `nacos_dev`.`users` mapped to number 123
# at 15322
#240822  8:12:38 server id 1  end_log_pos 15428 CRC32 0x2ec06517        Delete_rows: table id 123 flags: STMT_END_F
### DELETE FROM `nacos_dev`.`users`
### WHERE
###   @1='nacos2'
###   @2='$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu'
###   @3=1
# at 15428
#240822  8:12:38 server id 1  end_log_pos 15459 CRC32 0x1d3b1922        Xid = 978
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

根据日志位置导出sql

mysqlbinlog  -v mysql-bin.000007 --database=nacos_dev --stop-position=15107 > 15107.sql

然后登录到mysql,source 15107.sql,现在删除的数据恢复回来了

这里有一个非常关键的问题,如果你是新开启的binlog日志功能,之前的数据是没有binlog记录的,也就是删除了没有binlog记录的数据,是无法恢复的

5)根据binlog时间点恢复删除数据

mysqlbinlog  -v mysql-bin.000007 --database=nacos_dev --stop-datetime="2024-08-22 06:24:23" > 240822062423.sql

这篇关于【数据库】MySQL 使用Binlog恢复数据实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098429

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd