烂泥:通过binlog恢复mysql数据库

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

在上一篇文章,我们讲解了有关mysql的binlog日志的基础知识。这篇文章,我们来讲解如何通过mysql的binlog日志来恢复数据库。

在使用binlog日志来恢复数据库之前,我们有一些前提工作需要做。步骤如下:

1、创建新的数据库ailanni

2、创建新的表ilannitable

3、向表ilannitable插入数据

4、刷新mysqlbin日志

5、完整备份ailanni数据库

6、删除表ilannitable插入的部分数据

7、删除数据库ailanni

8、各个binlog日志的内容解析

9、恢复ailanni全部数据

10、恢复ailanni数据库指定的部分

一、 创建新的数据库ailanni

使用以下命令创建数据库,如下:

mysql --h 192.168.1.213 -uroot -p123456

create database ailanni;

show databases;

clip_image001

二、 创建新的表ilannitable

使用以下命令创建表,如下:

use ailanni;

create table ilannitable(id int(4));

show tables;

clip_image002

三、 向表ilannitable插入数据

使用以下命令向表ilannitable中插入数据1、2,如下:

insert into ilannitable values(1);

insert into ilannitable values(2);

select id from ilannitable;

clip_image003

四、 刷新mysqlbin日志

此时mysql的binlog日志文件只有一个mysql-bin.000001,如下:

show master logs;

clip_image004

注意:此时mysql的binlog文件为mysql-bin.000001,并且数据库ailanni中只有1、2两条数据。如下:

select id from ilannitable;

clip_image005

现在我们来刷新binlog日志,生成新的binlog日志文件mysql-bin.000002,如下:

flush logs;

show master logs;

clip_image006

现在我们再次向ailanni数据库中插入新的数据3、4,如下:

insert into ilannitable values(3);

insert into ilannitable values(4);

clip_image007

数据3、4插入完毕后,我们再次刷新binlog日志,生成新的binlog日志文件为mysql-bin.000003,如下:

clip_image008

现在我们总共有三个binlog日志文件:mysql-bin.000001、mysql-bin.000002、mysql-bin.000003。其中在mysql-bin.000001中,我们向ilannitable表中插入两个数据1、2。在mysql-bin.000002中我们向ilannitable表中插入两个数据3、4。

我们可以查看binlog中的内容如下:

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000001

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000002

clip_image009

clip_image010

五、 完整备份ailanni数据库

现在我们来完整的备份ailanni数据库,使用mysqldump命令,如下:

/usr/local/mysql/bin/mysqldump -uroot -p123456 ailanni >/root/ailanni.sql

clip_image011

查看备份文件是否与ailanni数据库的内容一致,如下:

cat ailanni.sql

clip_image012

通过上图可知,备份的数据库文件与ailanni数据库的内容是一致的。

六、 删除表ilannitable插入的部分数据

在第三、四步中,我们向表ilannitable中插入了1、2、3、4四个数据。为了模拟在ailanni数据库被破坏后的实际情形,我们现在把ailanni数据库中的3这条数据给删除,如下:

delete from ilannitable where id=3;

clip_image013

此时我们再次刷新binlog日志,生成新的binlog日志文件为mysql-bin.000004,如下:

flush logs;

show master logs;

clip_image014

七、 删除数据库ailanni

在第六步中,我们删除了数据记录3,现在我们来删除ailanni数据库。如下:

drop database ailanni;

show databases;

clip_image015

删除完毕后,我们再次刷新binlog日志,生成新的binlog日志文件为mysql-bin.000005,如下:

flush logs;

show master logs;

clip_image016

八、 各个binlog日志的内容解析

现在mysql的binlog日志文件有5个,从mysql-bin.000001到mysql-bin.000005,其中在mysql-bin.000001中我们向ilannitable表中插入了1、2两条数据。

在mysql-bin.000002中我们向ilannitable表中插入了3、4两条数据,在mysql-bin.000003中我们从表ilannitable删除了3这条数据。在mysql-bin.000004中我们把ailanni数据库给删除了。

各个binlog日志的SQL操作语句,如下:

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000001

clip_image017

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000002

clip_image010[1]

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003

clip_image018

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000004

clip_image019

九、 恢复ailanni全部数据

现在我们要恢复ailanni数据库,在此首先有关ailanni数据库是否存在的情况要说明下。

如果目前mysql数据库服务器上有ailanni这个数据库,那么我们在恢复数据时,就不需要重新创建ailanni数据库。如果目前mysql数据库服务器上没有ailanni这个数据库,那么我们就需要重新创建一个空的ailanni数据库。即该数据库只是一个空的库,里面没有任何表或者其他的元素。

如果不创建ailanni数据库的话,我们在通过mysql命令恢复数据库时,系统就会报错,如下:

clip_image020

在第五步时,我们备份的数据库是ailanni数据库全部的数据。如果要恢复ailanni数据库全部数据的话,我们只需要执行mysql命令导入备份的sql文件即可。如下:

create database ailanni;

/usr/local/mysql/bin/mysql -uroot -p123456 ailanni</root/ailanni.sql

clip_image021

查看恢复后的ailanni数据库是否和被删除之前的数据一样,如下:

mysql -uroot -p123456

use ailanni;

select id from ilannitable;

clip_image022

通过上图,我们可以很明显的看到目前ailanni数据库已经被全部恢复,而且数据一个也没有丢失。

十、 恢复ailanni数据库指定的部分

在通过mysql的binlog日志恢复数据库时,我们可以指定数据库恢复的位置、恢复的时间,同时也可以不指定数据库恢复的位置和时间。

有关mysqlbinlog命令的使用方法,我们可以通过mysqlbinlog的帮助命令进行查看,如下:

/usr/local/mysql/bin/mysqlbinlog --help

clip_image023

注意图中标记出来的数字,其中1和2是表示通过binlog恢复数据的开始和结束时间,3和4表示的binlog恢复数据的开始和结束位置。

其中时间我们都知道,看下binlog的日志文件内容就知道了。而位置就是我们在前面查看各个binlog日志内容时标记出来的数字部分。如下:

clip_image024

图中被标出来的***部分数字5表示时间,6表示位置的节点,位置节点我们也称为binlog的pos点。

10.1不指定位置和时间来恢复数据库

我们先来测试不指定时间和位置来恢复数据库。

在第九步中我们恢复了ailanni全部的数据库,现在我们要求把数据库恢复到删除数据记录3时的状态。即ailanni数据库中只有1、2、4,这三条数据。这个时候我们就要根据mysql的binlog日志进行恢复,要不然达不到这个要求。

在第八步中我们已经分析了各个binlog日志中执行的SQL语句。根据分析,我们需要使用mysql-bin.000003这个binlog日志来恢复数据库。现在我们再次查看该binlog日志,如下:

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003

clip_image018[1]

删除3这条数据后,ailanni数据库中的数据记录情况也就是我们恢复数据库后所要的状态。如下:

clip_image025

现在我们来通过mysqlbin来恢复删除3这条数据时的数据库,使用如下命令:

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003 |mysql -uroot -p123456

clip_image026

通过上图我们可以看到此时数据库ailanni已经恢复到删除数据3时的状态了,ailanni数据库中确实只有1、2、4,这三条数据。这样也达到我们的要求了。

重要说明:

通过上面的文章,我们知道现在ailanni数据库的情况是,已经恢复全部数据。

为了做下面的实验,我们就要把ailanni数据库恢复到还没有进行完全备份之前的状态,即ailanni数据库还没有数据的状态。我们需要做的是清空现在的ailanni数据库,保持ailanni是一个空的数据库。但是ailanni数据库的表结构、主键、外键等等信息都是完整的。

同时还要说明下:如果在同一个时间点,binlog日志中有执行过多条sql语句的话,那么我们在恢复数据库时,一定要根据pos点的位置来恢复数据,切记切记。因为此时在binlog日志中,时间节点是一样的,但是pos位置节点是唯一的。

因此在通过binlog恢复数据库时,强烈建议使用pos位置节点的方法来恢复数据。

清空ailanni数据库使用以下命令,如下:

delete from ilannitable;

select id from ilannitable;

clip_image027

有关这个情况,我会再写一篇文章。

现在我们得到的是一个没有数据的ailanni数据库,这样我们下面的实验就可以继续进行。

10.2指定时间来恢复数据库

要求恢复到删除数据记录3时的数据库。即数据库中只有1、2、4,这三条数据。

还是和10.1要求是一样的,但是这次我们根据时间点来恢复数据。我们也需要一个空的ailanni数据库,这个我们可以通过前面的说明可以得到。

现在我们再次查看mysql-bin.000003文件,如下:

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003

clip_image028

注意图中***部分标记出来的时间点,我们可以看到在这个时间点之后,数据3就被删除了。我们恢复数据,就恢复到这个时间点即可达到要求。使用以下命令进行恢复,如下:

/usr/local/mysql/bin/mysqlbinlog --stop-datetime='2014-11-17 11:30:43' /usr/local/mysql/data/mysql-bin.000003 |mysql -uroot -p123456

mysql -uroot -p123456

use ailanni;

select id from ilannitable;

clip_image029

通过上图,我们可以看到通过时间点来恢复数据库也达到我们的要求,并且ailanni数据库中确实只有1、2、4,这三条数据。

10.3指定位置来恢复数据库

要求把数据库ailanni恢复到插入数据3后,未插入数据4时的状态。即数据库ailanni中只有数据1、2、3,这三条数据。

分析要达到此要求,我们只能通过binlog日志的方式来恢复数据。根据第八步的binlog日志可以得知,要想恢复到此时的数据库,那么我们就要使用mysql-bin.000002这个日志文件。

要到达上述的目的,我们需要先来恢复数据1、2,使用mysql-bin.000001文件,如下:

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000001 |mysql -uroot -p123456

clip_image030

数据1、2恢复后,我们现在正式开始恢复插入数据3后,未插入数据4时的数据库。

再次查看mysql-bin.000002日志文件,如下:

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000002

clip_image031

注意图中标记出来的数字304,这个就是binlog的pos节点位置。我们可以看到在该pos节点后mysql才执行插入数据4的SQL语句。那么我们只需要把数据恢复这个节点即可。

使用如下命令进行恢复数据,如下:

/usr/local/mysql/bin/mysqlbinlog --stop-position=304 /usr/local/mysql/data/mysql-bin.000002 |mysql -uroot -p123456

clip_image032

通过上图,我们现在可以看到ailanni数据库已经恢复到插入数据3之后,未插入4的状态。现在ailanni数据库中确实只有1、2、3,这三条数据,已经达到我们的要求。

到此我们有关通过binlog日志恢复mysql数据库告一段落。


本文转自 烂泥行天下 51CTO博客,原文链接:http://blog.51cto.com/ilanni/1579389

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12天前
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志和二进制日志是确保数据库稳定性和可靠性的关键组件。重做日志主要用于事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务;而二进制日志记录SQL语句的逻辑变化,支持数据复制、恢复和审计。两者在写入时机、存储方式及配置参数等方面存在显著差异。
|
3月前
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
795 4
|
12天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
29天前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的binlog日志文件
MySQL的binlog日志记录了所有对数据库的更改操作(不包括SELECT和SHOW),主要用于主从复制和数据恢复。binlog有三种模式,可通过设置binlog_format参数选择。示例展示了如何启用binlog、设置格式、查看日志文件及记录的信息。
|
1月前
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志(Redo Log)和二进制日志(Binary Log)是两种重要的日志系统。重做日志主要用于保证事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务更改。二进制日志则记录了数据库的所有逻辑变化操作,用于数据的复制、恢复和审计。两者在写入时机、存储方式、配置参数和使用范围上有所不同,共同确保了数据库的稳定性和可靠性。
|
3月前
|
消息中间件 canal 关系型数据库
Maxwell:binlog 解析器,轻松同步 MySQL 数据
Maxwell:binlog 解析器,轻松同步 MySQL 数据
378 11
|
2月前
|
存储 关系型数据库 MySQL
MySQL中的Redo Log、Undo Log和Binlog:深入解析
【10月更文挑战第21天】在数据库管理系统中,日志是保障数据一致性和完整性的关键机制。MySQL作为一种广泛使用的关系型数据库管理系统,提供了多种日志类型来满足不同的需求。本文将详细介绍MySQL中的Redo Log、Undo Log和Binlog,从背景、业务场景、功能、底层实现原理、使用措施等方面进行详细分析,并通过Java代码示例展示如何与这些日志进行交互。
190 0
|
8天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
72 15
|
2天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
9天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。