MySql使用binlog日志恢复误删数据(强化)—— 筑梦之路

对于数据库误删数据恢复,推荐定期备份,通过定期备份的文件进行恢复,这里主要是使用binlog日志方式来恢复误删数据,之前也写过相关内容,这里再次强化一下步骤流程,增强熟悉程度。

概述

MySQL数据库可以开启binlog功能,记录数据库中每个操作的日志。可以通过解析binlog日志来找回误删除的操作。可以使用"mysqlbinlog"命令来解析binlog文件,并通过该命令生成的SQL语句进行数据恢复。

恢复流程

  • **1)**先使用备份数据恢复出全部备份的数据

  • **2)**使用binlog日志恢复出增量数据到误操作之前

恢复步骤过程

1. 创建测试表t2

bash 复制代码
# 创建表t2

create table t2(id bigint);

# 插入数据

insert into t2 values (1), (2), (3), (4);

# 查询

select * from t2;

# 再次插入数据

insert into t2 values (5), (6), (7), (8);

2. 数据库全备

bash 复制代码
mysqldump -p -d test --single-transaction --set-gtid
-purged=off --master-data=2 --flush-logs --routines --
triggers --events --extended-insert=true> test.sql



参数说明:
single-transaction

此选项会将隔离级别设置为:REPEATABLE READ。并且随后再执行一条START TRANSACTION语句,让整个数据在dump过程中保证数据的一致性,这个选项对InnoDB的数据表很有用,且不会锁表。但是这个不能保证MyISAM表和MEMORY表的数据一致性。

master-data=2  

在bin-log日志里记录备份到了哪个位置,比如说binlog名称,binlog位置。

set-gtid-purged=off

表示在备份时不输出跟 GTID 相关的信息。

flush-logs

命令的作用就是关闭当前使用的binary log,然后打开新的binary log文件,文件的序号加1。

extended-insert 

代表长INSERT,多row在一起批量INSERT提高导入效率。

routines,events,triggers

备份的时候将过程,函数,触发器,事件进行备份。

3. 增量数据插入

bash 复制代码
insert into t2 values (9), (10), (11), (12);

insert into t2 values (16), (15), (14), (13);

insert into t2 values (20), (19), (18), (17);


# 检查插入的数据

select count(*) from t2;

4. 删除test库

bash 复制代码
drop database test;

# 确认是否删除
show databases;

5. 恢复数据(全量+binlog)

bash 复制代码
create database test;

use test;

source test.sql;

# 检查数据

select * from t2;

此处使用全量备份的sql文件进行恢复,在备份之后的数据是没有的,因此我们需要使用binlog日志来恢复在全量备份之后插入的数据。

首先解析binlog文件,找到执行误操作的那条命令,他的事物号为787.记住该事物号,很重要!,很重要!很重要!

bash 复制代码
mysqlbinlog -uroot -p --start-position=154
/var/lib/mysql/mysql-bin.000002 --base64-output=decode-rows -vv



参数解释:
start-position:
日志开始位点,mysqlbinlog从哪个位点开始解析binlog日志.
stop-position
日志结束位点,mysqlbinlog到哪个位点结束解析binlog日志.

看到在mysql-bin.000002日志里面出现了drop database的操作

当前需要的是注释掉解析出的drop database日志语句,或者使用stop-position来限定binlog结束位置,下面使用stop-position参数限定:

bash 复制代码
mysqlbinlog -uroot -p --start-position=154
--stop-position=787 /var/lib/mysql/mysql-bin.000002>000003binlog.sql

执行增量的binlog恢复

bash 复制代码
source 000003binlog.sql;

# 查询数据

select * from t2;

select count(*) from t2;

至此,就已经完成数据的恢复。这里主要结合了全量备份和binlog日志方式进行。

相关推荐
【非典型Coder】3 分钟前
Statement和PreparedStatement区别
数据库
m0_736927041 小时前
想抓PostgreSQL里的慢SQL?pg_stat_statements基础黑匣子和pg_stat_monitor时间窗,谁能帮你更准揪出性能小偷?
java·数据库·sql·postgresql
lang201509281 小时前
MySQL 8.0.29 及以上版本中 SSL/TLS 会话复用(Session Reuse)
数据库·mysql
望获linux2 小时前
【实时Linux实战系列】使用 u-trace 或 a-trace 进行用户态应用剖析
java·linux·前端·网络·数据库·elasticsearch·操作系统
咖啡Beans2 小时前
6分钟慢速搭建MySQL服务器
mysql
清和与九2 小时前
binLog、redoLog和undoLog的区别
数据库·oracle
望获linux2 小时前
【实时Linux实战系列】FPGA 与实时 Linux 的协同设计
大数据·linux·服务器·网络·数据库·fpga开发·操作系统
总有刁民想爱朕ha2 小时前
Python自动化从入门到实战(24)如何高效的备份mysql数据库,数据备份datadir目录直接复制可行吗?一篇给小白的完全指南
数据库·python·自动化·mysql数据库备份
朝九晚五ฺ3 小时前
【Redis学习】持久化机制(RDB/AOF)
数据库·redis·学习
虾说羊3 小时前
sql中连接方式
数据库·sql