经过我们之前学习的mysqlbinlog,我们已经学会如何进行备份,我们在这里开始将其进行备份恢复。

假设现在是凌晨12点,我们的任务是将数据库进行一次完整备份,将binlog数据库备份到/root下BAK.binlog.sql

mysqldump -uroot -p123456 -lF --log-error=/root/myDump.err -B binlog > /root/BAK.binlog.sql

由于我使用了-F选项,当备份工作刚开始时系统会刷新log日志,产生新的binlog日志来记录备份之后的数据库“增删改”操作,查看一下:

mysql中binlog怎么恢复数据库 mysql binlog 按时间恢复恢复_数据库

然后早上8点半我们对数据库进行了一系列的操作。增删改查,建表等。。。

然后在中午下班前我们不小心将数据库binlog删除了

这时候就用到我们的数据库备份了,我们将其进行恢复。

先仔细查看最后一个binlog日志,并记录下关键的pos点,到底是哪个pos点的操作导致了数据库的破坏(通常在最后几步);
备份一下最后一个binlog日志文件:

查看日志文件,备份最后一个操作binlog日志文件

mysql中binlog怎么恢复数据库 mysql binlog 按时间恢复恢复_日志文件_02

 

然后我们刷新日志索引操作,重新开始binlog日志文件的记录

mysql中binlog怎么恢复数据库 mysql binlog 按时间恢复恢复_数据库_03

我们可以看到日志文件编号从00006开始并且position为154,154表示没有任何操作时的大小。

 

那么,接下来我们就开始了我们的恢复数据大业-------------

mysql> show binlog events in 'mysql-bin.000004';
+------------------+------+----------------+-----------+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info                                                                                                                                                                                                 |
+------------------+------+----------------+-----------+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| mysql-bin.000004 |    4 | Format_desc    |      1918 |         123 | Server ver: 5.7.28-log, Binlog ver: 4                                                                                                                                                                |
| mysql-bin.000004 |  123 | Previous_gtids |      1918 |         154 |                                                                                                                                                                                                      |
| mysql-bin.000004 |  154 | Anonymous_Gtid |      1918 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                                                                                                 |
| mysql-bin.000004 |  219 | Query          |      1918 |         382 | use `binlog`; CREATE TABLE `binlog`.`lala` (
  `idlala` INT NOT NULL,
  `lalacol` VARCHAR(45) NULL)                                                                                                  |
| mysql-bin.000004 |  382 | Anonymous_Gtid |      1918 |         447 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                                                                                                 |
| mysql-bin.000004 |  447 | Query          |      1918 |         707 | use `binlog`; CREATE TABLE `binlog`.`123` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_bin |
| mysql-bin.000004 |  707 | Anonymous_Gtid |      1918 |         772 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                                                                                                 |
| mysql-bin.000004 |  772 | Query          |      1918 |         846 | BEGIN                                                                                                                                                                                                |
| mysql-bin.000004 |  846 | Table_map      |      1918 |         897 | table_id: 112 (binlog.123)                                                                                                                                                                           |
| mysql-bin.000004 |  897 | Write_rows     |      1918 |         940 | table_id: 112 flags: STMT_END_F                                                                                                                                                                      |
| mysql-bin.000004 |  940 | Table_map      |      1918 |         991 | table_id: 112 (binlog.123)                                                                                                                                                                           |
| mysql-bin.000004 |  991 | Write_rows     |      1918 |        1034 | table_id: 112 flags: STMT_END_F                                                                                                                                                                      |
| mysql-bin.000004 | 1034 | Table_map      |      1918 |        1085 | table_id: 112 (binlog.123)                                                                                                                                                                           |
| mysql-bin.000004 | 1085 | Write_rows     |      1918 |        1128 | table_id: 112 flags: STMT_END_F                                                                                                                                                                      |
| mysql-bin.000004 | 1128 | Table_map      |      1918 |        1179 | table_id: 112 (binlog.123)                                                                                                                                                                           |
| mysql-bin.000004 | 1179 | Write_rows     |      1918 |        1224 | table_id: 112 flags: STMT_END_F                                                                                                                                                                      |
| mysql-bin.000004 | 1224 | Table_map      |      1918 |        1275 | table_id: 112 (binlog.123)                                                                                                                                                                           |
| mysql-bin.000004 | 1275 | Write_rows     |      1918 |        1318 | table_id: 112 flags: STMT_END_F                                                                                                                                                                      |
| mysql-bin.000004 | 1318 | Table_map      |      1918 |        1369 | table_id: 112 (binlog.123)                                                                                                                                                                           |
| mysql-bin.000004 | 1369 | Write_rows     |      1918 |        1413 | table_id: 112 flags: STMT_END_F                                                                                                                                                                      |
| mysql-bin.000004 | 1413 | Table_map      |      1918 |        1464 | table_id: 112 (binlog.123)                                                                                                                                                                           |
| mysql-bin.000004 | 1464 | Write_rows     |      1918 |        1509 | table_id: 112 flags: STMT_END_F                                                                                                                                                                      |
| mysql-bin.000004 | 1509 | Xid            |      1918 |        1540 | COMMIT /* xid=246 */                                                                                                                                                                                 |
| mysql-bin.000004 | 1540 | Anonymous_Gtid |      1918 |        1605 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                                                                                                 |
| mysql-bin.000004 | 1605 | Query          |      1918 |        1679 | BEGIN                                                                                                                                                                                                |
| mysql-bin.000004 | 1679 | Table_map      |      1918 |        1730 | table_id: 112 (binlog.123)                                                                                                                                                                           |
| mysql-bin.000004 | 1730 | Delete_rows    |      1918 |        1773 | table_id: 112 flags: STMT_END_F                                                                                                                                                                      |
| mysql-bin.000004 | 1773 | Xid            |      1918 |        1804 | COMMIT /* xid=275 */                                                                                                                                                                                 |
| mysql-bin.000004 | 1804 | Anonymous_Gtid |      1918 |        1869 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                                                                                                 |
| mysql-bin.000004 | 1869 | Query          |      1918 |        1969 | DROP DATABASE `binlog`                                                                                                                                                                               |
+------------------+------+----------------+-----------+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
30 rows in set (0.00 sec)

通过上表我们可以看出在pos号在1969时我们发生了数据库的drop,所以我们恢复1869之前的就可以了。

首先我们先恢复之前完整备份的数据,

mysql -uroot -p123456 -v < /root/BAK.binlog.sql

最终可以看到

mysql中binlog怎么恢复数据库 mysql binlog 按时间恢复恢复_mysql中binlog怎么恢复数据库_04

接下来恢复我们mysql-bin.000004的日志,将mysql-bin.000004二进制日志文件导出

#按事件位置恢复
mysqlbinlog --stop-position=1869 mysql-bin.000004 | mysql -uroot -p123456 -v binlog

从binlog日志恢复数据
恢复语法格式:
# mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名
常用选项:
--start-position=953 起始pos点
–stop-position=1437 结束pos点
–start-datetime=“2013-11-29 13:18:54” 起始时间点
–stop-datetime=“2013-11-29 13:21:53” 结束时间点
–database=zyyshop 指定只恢复zyyshop数据库(一台主机上往往有多个数据库,只限本地log日志)

不常用选项:
-u --user=name Connect to the remote server as username.连接到远程主机的用户名
-p --password[=name] Password to connect to remote server.连接到远程主机的密码
-h --host=name Get the binlog from server.从远程主机上获取binlog日志
–read-from-remote-server Read binary logs from a MySQL server.从某个MySQL服务器上读取binlog日志
小结:实际是将读出的binlog日志内容,通过管道符传递给mysql命令。这些命令、文件尽量写成绝对路径;

最终,我们可以看到数据库又恢复到之前了。

mysql中binlog怎么恢复数据库 mysql binlog 按时间恢复恢复_日志文件_05

在后面我们还有很多种恢复方式,后续有机会补上。基本都一样,只不过恢复的数据具有一定的要求。