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)