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

本文由秀依林枫提供友情赞助,首发于烂泥行天下html

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

在使用binlog日志来恢复数据库以前,咱们有一些前提工做须要作。步骤以下:sql

一、建立新的数据库ailanni数据库

二、建立新的表ilannitable服务器

三、向表ilannitable插入数据post

四、刷新mysqlbin日志测试

五、完整备份ailanni数据库3d

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

七、删除数据库ailannihtm

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

九、恢复ailanni所有数据

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

1、 建立新的数据库ailanni

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

mysql --h 192.168.1.213 -uroot -p123456

create database ailanni;

show databases;

clip_image001

2、 建立新的表ilannitable

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

use ailanni;

create table ilannitable(id int(4));

show tables;

clip_image002

3、 向表ilannitable插入数据

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

insert into ilannitable values(1);

insert into ilannitable values(2);

select id from ilannitable;

clip_image003

4、 刷新mysqlbin日志

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

show master logs;

clip_image004

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

select id from ilannitable;

clip_image005

如今咱们来刷新binlog日志,生成新的binlog日志文件mysql-bin.000002,以下:

flush logs;

show master logs;

clip_image006

如今咱们再次向ailanni数据库中插入新的数据三、4,以下:

insert into ilannitable values(3);

insert into ilannitable values(4);

clip_image007

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

clip_image008

如今咱们总共有三个binlog日志文件:mysql-bin.00000一、mysql-bin.00000二、mysql-bin.000003。其中在mysql-bin.000001中,咱们向ilannitable表中插入两个数据一、2。在mysql-bin.000002中咱们向ilannitable表中插入两个数据三、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

5、 完整备份ailanni数据库

如今咱们来完整的备份ailanni数据库,使用mysqldump命令,以下:

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

clip_image011

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

cat ailanni.sql

clip_image012

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

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

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

delete from ilannitable where id=3;

clip_image013

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

flush logs;

show master logs;

clip_image014

7、 删除数据库ailanni

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

drop database ailanni;

show databases;

clip_image015

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

flush logs;

show master logs;

clip_image016

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

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

在mysql-bin.000002中咱们向ilannitable表中插入了三、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

9、 恢复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数据库已经被所有恢复,并且数据一个也没有丢失。

10、 恢复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数据库中只有一、二、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数据库中确实只有一、二、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时的数据库。即数据库中只有一、二、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数据库中确实只有一、二、4,这三条数据。

10.3指定位置来恢复数据库

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

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

要到达上述的目的,咱们须要先来恢复数据一、2,使用mysql-bin.000001文件,以下:

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

clip_image030

数据一、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数据库中确实只有一、二、3,这三条数据,已经达到咱们的要求。

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

转载于:https://www.cnblogs.com/ilanni/p/4107530.html