1. 程式人生 > 實用技巧 >4.2.5 案例:通過mysqldump全備+binlog實現PIT資料恢復

4.2.5 案例:通過mysqldump全備+binlog實現PIT資料恢復

環境背景: 小型的業務資料庫,50G,每天23:00全備,定期binlog異地備份。
故障場景: 週三下午2點,開發Navicat連線資料庫例項錯誤,導致生產資料被誤刪除(DROP)
  • 恢復思路:
   	 1.  掛維護頁。
   	 2.  檢查備份、日誌可用。
   	 3.  如果只是部分損壞,建議找一個應急庫進行恢復
   		 a. 全備恢復 
   		 b. 日誌擷取並恢復 
   	 4.  恢復後資料校驗	(業務測試部門驗證)
   	 5.  立即備份(停機冷備) 
   	 6.  恢復架構系統
   	 7.  撤維護頁,恢復業務 
  • 模擬故障:

	     1. 模擬測試資料
	     mysql> create database pit;
	     mysql> use pit 
	     mysql> create table t1 (id int);
	     mysql> insert into t1 values(1),(2),(3);
	     mysql> commit;
	     2. 全備 
	        [root@db01 tmp]# mysqldump -uroot -p -A --master-data=2 --single-transaction -R -E --triggers --max_allowed_packet=64M >/tmp/full_2300.sql 
	     3. 模擬週三白天的操作 
	        mysql> use pit
	        mysql> insert into t1 values(11),(22),(33);
	        mysql> commit;
	     4. 模擬週三下午2:00,刪庫操作
	        mysql> drop database pit;
  • 恢復過程
	
	     1. 恢復全備 
	     source /tmp/full_2300.sql 
	     2. 擷取二進位制日誌
	        起點:  21105555
	        [root@db01 tmp]# grep "\-- CHANGE MASTER TO" /tmp/full_2300.sql 
	        -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=21105555;
	
	
	終點:21105836
	
	a. show master status ;
	b.  mysql> pager grep -i "drop database pit" -B 10                       
	
	| mysql-bin.000009 | 21105805 | Xid        51 |    21105836 | COMMIT /* xid=6232 */                                                                                                
	| mysql-bin.000009 | 21105836 | Gtid       51 |    21105913 | SET @@SESSION.GTID_NEXT= '95972e36-43fe-11eb-a366-000c2905f029:70'                                                 
	| mysql-bin.000009 | 21105913 | Query      51 |    21106014 | drop database pit /* xid=6234 */                                                                                                                                            
	
	[root@db01 tmp]# mysqlbinlog --skip-gtids --start-position=21105555 --stop-position=21105836 /data/3306/binlog/mysql-bin.000009 >/tmp/bin.sql

        3. 恢復日誌
        mysql> set sql_log_bin=0;
        mysql> source /tmp/bin.sql
        mysql> set sql_log_bin=1;