1. 程式人生 > >mysql誤刪庫恢復操作

mysql誤刪庫恢復操作

前提:對mysql庫進行全備和增量備份(全備就是對hive庫進行完全備份,增量備份就是將mysql的binlog日誌進行備份)

情景說明:由於誤操作,將包含有多張表的資料庫給誤刪了

要求:恢復誤刪的資料庫

 

具體模擬故障過程與恢復操作步驟如下:

(1)首先建立hive庫,建立一個before1表,插入一條記錄,建立一個after1表,插入3條記錄
mysql> use hive;
mysql> select * from after1;
+------+
| id   |
+------+
|   22 |
|   33 |
|   44 |
+------+
3 rows in set (0.00 sec)

mysql> select * from before1;
+------+
| id   |
+------+
|   11 |
+------+
1 row in set (0.00 sec)

(2)對hive庫做個完全備份(記錄日誌位置,並設定字符集)
mysqldump -uroot -pxxx -h10.191.22.247 -F -R --master-data=2 --default-character-set=utf8 --single-transaction -B hive |gzip >/tmp/mysql_$(date +%F).sql.gz
(3)在hive庫中的after1表新增2條記錄,並更新2條記錄,重新整理日誌
mysql> select * from after1;
+------+
| id   |
+------+
|   22 |
|   33 |
|   44 |
|  555 |
|  666 |
+------+
5 rows in set (0.00 sec)

mysql> select * from before1;
+------+
| id   |
+------+
|   11 |
+------+
1 row in set (0.00 sec)
mysql> flush logs;

(4)在hive庫中的after1表新增2條記錄,誤操作,drop資料庫hive
mysql> select * from after1;
+------+
| id   |
+------+
|   22 |
|   33 |
|   44 |
|  555 |
|  666 |
|   77 |
|   88 |
+------+
7 rows in set (0.00 sec)

mysql> select * from before1;
+------+
| id   |
+------+
|   11 |
+------+
1 row in set (0.00 sec)

mysql> drop database hive;

(5)恢復被誤刪除的hive庫
(5.1)先記錄下當前資料庫的日誌號,並重新整理日誌,當前最新日誌為29
(5.2)將沒有備份的日誌都備份到其他目錄下
cp /mnt/sata01/mysql/mysql-bin.000028 ./
cp /mnt/sata01/mysql/mysql-bin.000029 ./

(5.3)恢復hive的完全備份
gzip -d mysql_2018-12-18.sql.gz 
mysql -uroot -pxxx <mysql_2018-12-18.sql 

檢視完全備份時的日誌號和日誌位置:
more mysql_2018-12-18.sql     
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000028', MASTER_LOG_POS=154;   //可以看到完全備份時的日誌是28,位置是154.那麼可以從28日誌的154位置開始往後進行恢復
根據檢視到的日誌位置,對154後面剩餘的日誌進行應用:(注意--start-position=154引數的使用)
mysqlbinlog --start-position=154 --database hive mysql-bin.000028|mysql -uroot [email protected] -v hive
將刪除hive庫之前的日誌29,30都進行恢復:(還有一個問題,現在不確定drop庫的操作在不在29和30的日誌裡,所以需要在庫裡或庫外檢視一下日誌裡面的具體操作)
對於DCL操作,如建庫刪庫都能在庫裡檢視日誌的事件,如果是DDL操作,在庫裡看日誌事件是看不出來的  

在庫裡檢視:(發現該刪庫操作在End_log_pos 733之前)
mysql> show binlog events in 'mysql-bin.000029';
| mysql-bin.000029 |  597 | Write_rows     |       161 |         637 | table_id: 142243 flags: STMT_END_F                                                                      |
| mysql-bin.000029 |  637 | Xid            |       161 |         668 | COMMIT /* xid=13757124 */                                                                               |
| mysql-bin.000029 |  668 | Anonymous_Gtid |       161 |         733 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                    |
| mysql-bin.000029 |  733 | Query          |       161 |         825 | drop database hive                                                                                      |
| mysql-bin.000029 |  825 | Anonymous_Gtid |       161 |         890 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'     
 

在庫外檢視:如果想找DDL操作,需要到庫外,對日誌進行分析來查詢:
mysqlbinlog -d hive --base64-output=decode-rows -v mysql-bin.000029 >29.sql
vi 29.sql   //在裡面過濾查詢drop關鍵字,發現刪除位置操作在733處
【SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 733
#181218 11:51:53 server id 161  end_log_pos 825 CRC32 0xd623fa5d        Query   thread_id=83772 exec_time=0     error_code=0
SET TIMESTAMP=1545105113/*!*/;
drop database hive
/*!*/;
# at 825
#181218 11:53:28 server id 161  end_log_pos 890 CRC32 0xe5188448        Anonymous_GTID  last_committed=3        sequence_number=4       rbr_only=no

恢復所有資料到733前,即恢復hive庫到刪除操作之前:
mysqlbinlog --stop-position=733 --database hive mysql-bin.000029|mysql -uroot [email protected] -v hive  //注意stop-position引數的使用

(6)檢視資料庫,發現數據庫和裡面的表資料已經都回來了
mysql> select * from after1;
+------+
| id   |
+------+
|   22 |
|   33 |
|   44 |
|  555 |
|  666 |
|   77 |
|   88 |
+------+
7 rows in set (0.00 sec)

mysql> select * from before1;
+------+
| id   |
+------+
|   11 |
+------+
1 row in set (0.00 sec)