经过我们之前学习的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日志来记录备份之后的数据库“增删改”操作,查看一下:
然后早上8点半我们对数据库进行了一系列的操作。增删改查,建表等。。。
然后在中午下班前我们不小心将数据库binlog删除了
这时候就用到我们的数据库备份了,我们将其进行恢复。
先仔细查看最后一个binlog日志,并记录下关键的pos点,到底是哪个pos点的操作导致了数据库的破坏(通常在最后几步);
备份一下最后一个binlog日志文件:
查看日志文件,备份最后一个操作binlog日志文件
然后我们刷新日志索引操作,重新开始binlog日志文件的记录
我们可以看到日志文件编号从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-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命令。这些命令、文件尽量写成绝对路径;
最终,我们可以看到数据库又恢复到之前了。
在后面我们还有很多种恢复方式,后续有机会补上。基本都一样,只不过恢复的数据具有一定的要求。