在上一篇文章,咱们讲解了有关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;
2、 建立新的表ilannitable
使用如下命令建立表,以下:
use ailanni;
create table ilannitable(id int(4));
show tables;
3、 向表ilannitable插入数据
使用如下命令向表ilannitable中插入数据一、2,以下:
insert into ilannitable values(1);
insert into ilannitable values(2);
select id from ilannitable;
4、 刷新mysqlbin日志
此时mysql的binlog日志文件只有一个mysql-bin.000001,以下:
show master logs;
注意:此时mysql的binlog文件为mysql-bin.000001,而且数据库ailanni中只有一、2两条数据。以下:
select id from ilannitable;
如今咱们来刷新binlog日志,生成新的binlog日志文件mysql-bin.000002,以下:
flush logs;
show master logs;
如今咱们再次向ailanni数据库中插入新的数据三、4,以下:
insert into ilannitable values(3);
insert into ilannitable values(4);
数据三、4插入完毕后,咱们再次刷新binlog日志,生成新的binlog日志文件为mysql-bin.000003,以下:
如今咱们总共有三个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
5、 完整备份ailanni数据库
如今咱们来完整的备份ailanni数据库,使用mysqldump命令,以下:
/usr/local/mysql/bin/mysqldump -uroot -p123456 ailanni >/root/ailanni.sql
查看备份文件是否与ailanni数据库的内容一致,以下:
cat ailanni.sql
经过上图可知,备份的数据库文件与ailanni数据库的内容是一致的。
6、 删除表ilannitable插入的部分数据
在第3、四步中,咱们向表ilannitable中插入了一、二、三、4四个数据。为了模拟在ailanni数据库被破坏后的实际情形,咱们如今把ailanni数据库中的3这条数据给删除,以下:
delete from ilannitable where id=3;
此时咱们再次刷新binlog日志,生成新的binlog日志文件为mysql-bin.000004,以下:
flush logs;
show master logs;
7、 删除数据库ailanni
在第六步中,咱们删除了数据记录3,如今咱们来删除ailanni数据库。以下:
drop database ailanni;
show databases;
删除完毕后,咱们再次刷新binlog日志,生成新的binlog日志文件为mysql-bin.000005,以下:
flush logs;
show master logs;
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
/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000002
/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003
/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000004
9、 恢复ailanni所有数据
如今咱们要恢复ailanni数据库,在此首先有关ailanni数据库是否存在的状况要说明下。
若是目前mysql数据库服务器上有ailanni这个数据库,那么咱们在恢复数据时,就不须要从新建立ailanni数据库。若是目前mysql数据库服务器上没有ailanni这个数据库,那么咱们就须要从新建立一个空的ailanni数据库。即该数据库只是一个空的库,里面没有任何表或者其余的元素。
若是不建立ailanni数据库的话,咱们在经过mysql命令恢复数据库时,系统就会报错,以下:
在第五步时,咱们备份的数据库是ailanni数据库所有的数据。若是要恢复ailanni数据库所有数据的话,咱们只须要执行mysql命令导入备份的sql文件便可。以下:
create database ailanni;
/usr/local/mysql/bin/mysql -uroot -p123456 ailanni</root/ailanni.sql
查看恢复后的ailanni数据库是否和被删除以前的数据同样,以下:
mysql -uroot -p123456
use ailanni;
select id from ilannitable;
经过上图,咱们能够很明显的看到目前ailanni数据库已经被所有恢复,并且数据一个也没有丢失。
10、 恢复ailanni数据库指定的部分
在经过mysql的binlog日志恢复数据库时,咱们能够指定数据库恢复的位置、恢复的时间,同时也能够不指定数据库恢复的位置和时间。
有关mysqlbinlog命令的使用方法,咱们能够经过mysqlbinlog的帮助命令进行查看,以下:
/usr/local/mysql/bin/mysqlbinlog --help
注意图中标记出来的数字,其中1和2是表示经过binlog恢复数据的开始和结束时间,3和4表示的binlog恢复数据的开始和结束位置。
其中时间咱们都知道,看下binlog的日志文件内容就知道了。而位置就是咱们在前面查看各个binlog日志内容时标记出来的数字部分。以下:
图中被标出来的黄色部分数字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
删除3这条数据后,ailanni数据库中的数据记录状况也就是咱们恢复数据库后所要的状态。以下:
如今咱们来经过mysqlbin来恢复删除3这条数据时的数据库,使用以下命令:
/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003 |mysql -uroot -p123456
经过上图咱们能够看到此时数据库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;
有关这个状况,我会再写一篇文章。
如今咱们获得的是一个没有数据的ailanni数据库,这样咱们下面的实验就能够继续进行。
10.2指定时间来恢复数据库
要求恢复到删除数据记录3时的数据库。即数据库中只有一、二、4,这三条数据。
仍是和10.1要求是同样的,可是此次咱们根据时间点来恢复数据。咱们也须要一个空的ailanni数据库,这个咱们能够经过前面的说明能够获得。
如今咱们再次查看mysql-bin.000003文件,以下:
/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000003
注意图中黄色部分标记出来的时间点,咱们能够看到在这个时间点以后,数据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;
经过上图,咱们能够看到经过时间点来恢复数据库也达到咱们的要求,而且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
数据一、2恢复后,咱们如今正式开始恢复插入数据3后,未插入数据4时的数据库。
再次查看mysql-bin.000002日志文件,以下:
/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000002
注意图中标记出来的数字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
经过上图,咱们如今能够看到ailanni数据库已经恢复到插入数据3以后,未插入4的状态。如今ailanni数据库中确实只有一、二、3,这三条数据,已经达到咱们的要求。
到此咱们有关经过binlog日志恢复mysql数据库告一段落。