基於mysql-binlog的恢復實驗

fei890910發表於2016-04-22
1,首先生成一張表
mysql> select * from t;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.01 sec)

2,備份這張表所在的資料庫
[root@node1 backup]# mysqldump -u root -p  --master-data=2 --databases testdb > test2.sql
Enter password: 
[root@node1 backup]# ll
total 4
-rw-r--r-- 1 root root 2053 Apr 22 05:28 test2.sql
[root@node1 backup]# more test2.sql 
-- MySQL dump 10.13  Distrib 5.7.11, for Linux (i686)
--
-- Host: localhost    Database: testdb
-- ------------------------------------------------------
-- Server version       5.7.11-log




/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;




--
-- Position to start replication or point-in-time recovery from
--




-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=2198;




--
-- Current Database: `testdb`
--




CREATE DATABASE /*!32312 IF NOT EXISTS*/ `testdb` /*!40100 DEFAULT CHARACTER SET latin1 */;




USE `testdb`;




--
-- Table structure for table `t`
--




DROP TABLE IF EXISTS `t`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t` (
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;




--
-- Dumping data for table `t`
--




LOCK TABLES `t` WRITE;
/*!40000 ALTER TABLE `t` DISABLE KEYS */;
INSERT INTO `t` VALUES (1),(2);
/*!40000 ALTER TABLE `t` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;




/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;


-- Dump completed on 2016-04-22  5:28:41
[root@node1 backup]#  


3,插入資料,並刪除表


mysql> insert into t values(3);
Query OK, 1 row affected (0.01 sec)


mysql> insert into t values(4);
Query OK, 1 row affected (0.00 sec)


mysql> 
mysql> 
mysql> 
mysql> drop table t;
Query OK, 0 rows affected (0.01 sec)

4,檢視當前binlog位置,並得到刪除操作的位置
mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000003 |       201 |
| mysql-bin.000004 |       201 |
| mysql-bin.000005 |   3841844 |
| mysql-bin.000006 |       177 |
| mysql-bin.000007 |       177 |
| mysql-bin.000008 |       177 |
| mysql-bin.000009 |   7683463 |
| mysql-bin.000010 |      1908 |
| mysql-bin.000011 |       657 |
| mysql-bin.000012 |      4159 |
| mysql-bin.000013 |      2893 |
+------------------+-----------+
11 rows in set (0.01 sec)


mysql> show binlog events in 'mysql-bin.000013';
+------------------+------+----------------+-----------+-------------+---------------------------------------------------------+
| Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info                                                    |
+------------------+------+----------------+-----------+-------------+---------------------------------------------------------+
| mysql-bin.000013 |    4 | Format_desc    |         1 |         123 | Server ver: 5.7.11-log, Binlog ver: 4                   |
| mysql-bin.000013 |  123 | Previous_gtids |         1 |         154 |                                                         |
| mysql-bin.000013 |  154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                    |
| mysql-bin.000013 |  219 | Query          |         1 |         337 | use `testdb`; DROP TABLE `t` /* generated by server */  |
| mysql-bin.000013 |  337 | Anonymous_Gtid |         1 |         402 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                    |
| mysql-bin.000013 |  402 | Query          |         1 |         521 | use `testdb`; DROP TABLE `t2` /* generated by server */ |
| mysql-bin.000013 |  521 | Anonymous_Gtid |         1 |         586 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                    |
| mysql-bin.000013 |  586 | Query          |         1 |         701 | use `test`; DROP TABLE `t2` /* generated by server */   |
| mysql-bin.000013 |  701 | Anonymous_Gtid |         1 |         766 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                    |
| mysql-bin.000013 |  766 | Query          |         1 |         881 | use `test`; DROP TABLE `t3` /* generated by server */   |
| mysql-bin.000013 |  881 | Anonymous_Gtid |         1 |         946 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                    |
| mysql-bin.000013 |  946 | Query          |         1 |        1052 | use `testdb`; DROP TABLE IF EXISTS `test2`              |
| mysql-bin.000013 | 1052 | Anonymous_Gtid |         1 |        1117 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                    |
| mysql-bin.000013 | 1117 | Query          |         1 |        1206 | drop database testdb                                    |
| mysql-bin.000013 | 1206 | Anonymous_Gtid |         1 |        1271 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                    |
| mysql-bin.000013 | 1271 | Query          |         1 |        1356 | drop database test                                      |
| mysql-bin.000013 | 1356 | Anonymous_Gtid |         1 |        1421 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                    |
| mysql-bin.000013 | 1421 | Query          |         1 |        1521 | create database testdb                                  |
| mysql-bin.000013 | 1521 | Anonymous_Gtid |         1 |        1586 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                    |
| mysql-bin.000013 | 1586 | Query          |         1 |        1686 | use `testdb`; create table t(id int)                    |
| mysql-bin.000013 | 1686 | Anonymous_Gtid |         1 |        1751 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                    |
| mysql-bin.000013 | 1751 | Query          |         1 |        1825 | BEGIN                                                   |
| mysql-bin.000013 | 1825 | Table_map      |         1 |        1871 | table_id: 152 (testdb.t)                                |
| mysql-bin.000013 | 1871 | Write_rows     |         1 |        1911 | table_id: 152 flags: STMT_END_F                         |
| mysql-bin.000013 | 1911 | Xid            |         1 |        1942 | COMMIT /* xid=298 */                                    |
| mysql-bin.000013 | 1942 | Anonymous_Gtid |         1 |        2007 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                    |
| mysql-bin.000013 | 2007 | Query          |         1 |        2081 | BEGIN                                                   |
| mysql-bin.000013 | 2081 | Table_map      |         1 |        2127 | table_id: 152 (testdb.t)                                |
| mysql-bin.000013 | 2127 | Write_rows     |         1 |        2167 | table_id: 152 flags: STMT_END_F                         |
| mysql-bin.000013 | 2167 | Xid            |         1 |        2198 | COMMIT /* xid=299 */                                    |
| mysql-bin.000013 | 2198 | Anonymous_Gtid |         1 |        2263 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                    |
| mysql-bin.000013 | 2263 | Query          |         1 |        2337 | BEGIN                                                   |
| mysql-bin.000013 | 2337 | Table_map      |         1 |        2383 | table_id: 172 (testdb.t)                                |
| mysql-bin.000013 | 2383 | Write_rows     |         1 |        2423 | table_id: 172 flags: STMT_END_F                         |
| mysql-bin.000013 | 2423 | Xid            |         1 |        2454 | COMMIT /* xid=564 */                                    |
| mysql-bin.000013 | 2454 | Anonymous_Gtid |         1 |        2519 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                    |
| mysql-bin.000013 | 2519 | Query          |         1 |        2593 | BEGIN                                                   |
| mysql-bin.000013 | 2593 | Table_map      |         1 |        2639 | table_id: 172 (testdb.t)                                |
| mysql-bin.000013 | 2639 | Write_rows     |         1 |        2679 | table_id: 172 flags: STMT_END_F                         |
| mysql-bin.000013 | 2679 | Xid            |         1 |        2710 | COMMIT /* xid=565 */                                    |
| mysql-bin.000013 | 2710 | Anonymous_Gtid |         1 |        2775 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                    |
| mysql-bin.000013 | 2775 | Query          |         1 |        2893 | use `testdb`; DROP TABLE `t` /* generated by server */  |
+------------------+------+----------------+-----------+-------------+---------------------------------------------------------+
42 rows in set (0.00 sec)


mysql> 
5,安全起見,在生產中最好在測試庫上做恢復,此處我直接在本機恢復
mysql> 
mysql> 
mysql> 
mysql> drop database testdb;
Query OK, 0 rows affected (0.01 sec)

[root@node1 backup]# 
[root@node1 backup]# 
[root@node1 backup]# mysql -u root -p <test2.sql 
Enter password: 
[root@node1 backup]# 

mysql> 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)


mysql> 
mysql> 
mysql> 
mysql> use testdb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A


Database changed
mysql> 
mysql> 
mysql> 
mysql> select * from t;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.01 sec)


mysql> 

6,從上面的日誌中可以看到,我備份的pos是2198,刪除的pos是2775,恢復完成後,表中擁有四條資料
root@node1 mysql]# 
[root@node1 mysql]# mysqlbinlog --start-position=2198 --stop-position=2775  mysql-bin.000013 |mysql -u root -p
Enter password: 
[root@node1 mysql]# 
mysql>  select * from t;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)


mysql> 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29108064/viewspace-2086337/,如需轉載,請註明出處,否則將追究法律責任。

相關文章