成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL斷電恢復的一點簡單分析

數據庫 MySQL
我首先是要確認是否為線上業務還是測試環境,線上業務來說這個影響還是很大的。如果數據庫無法啟動,首要任務還是把數據庫啟動,然后在這個基礎上查看丟失的數據程度,安排數據修復的事宜。

[[205074]]

今天有個網友問我一個MySQL的恢復問題。提供的截圖如下。

 

對于這個問題,在一些斷電的場景下還是可能出現的。我首先是要確認是否為線上業務還是測試環境,線上業務來說這個影響還是很大的。如果數據庫無法啟動,首要任務還是把數據庫啟動,然后在這個基礎上查看丟失的數據程度,安排數據修復的事宜。

當然從我的角度來說,怎么去快速復現這個問題呢。我用自己寫的快速搭建測試主從環境的腳本(https://github.com/jeanron100/mysql_slaves,后期有一位大牛建議用Python來做,最近在考慮),分分鐘即可搞定。

我們創建一個表test,指定id,name兩個字段。然后開啟顯式事務。

  1. create table test(id int primary key,name varchar(30) not null); 

顯式開啟一個事務:

  1. begin
  2. insert into test values(1,'a'); 
  3. insert into test values(2,'b'); 
  4. insert into test values(3,'c');  

不提交,我們直接查看mysql的服務進程,直接Kill掉。默認情況下雙1指標是開啟的,我們直接模擬斷電重啟,看看后臺的處理情況:

  1. 2017-09-13 15:05:11 35556 [Note] InnoDB: Highest supported file format is Barracuda. 
  2.  
  3. 2017-09-13 15:05:11 35556 [Note] InnoDB: The log sequence numbers 1625987 and 1625987 in ibdata files do not match the log sequence number 1640654 in the ib_logfiles! 
  4.  
  5. 2017-09-13 15:05:11 35556 [Note] InnoDB: Database was not shutdown normally! 
  6.  
  7. 2017-09-13 15:05:11 35556 [Note] InnoDB: Starting crash recovery. 
  8.  
  9. 2017-09-13 15:05:11 35556 [Note] InnoDB: Reading tablespace information from the .ibd files... 
  10.  
  11. 2017-09-13 15:05:11 35556 [Note] InnoDB: Restoring possible half-written data pages 
  12.  
  13. 2017-09-13 15:05:11 35556 [Note] InnoDB: from the doublewrite buffer... 
  14.  
  15. InnoDB: 1 transaction(s) which must be rolled back or cleaned up 
  16.  
  17. InnoDB: in total 3 row operations to undo 
  18.  
  19. InnoDB: Trx id counter is 2304 
  20.  
  21. 2017-09-13 15:05:11 35556 [Note] InnoDB: 128 rollback segment(s) are active. 
  22.  
  23. InnoDB: Starting in background the rollback of uncommitted transactions 
  24.  
  25. 2017-09-13 15:05:11 7f5ccc3d1700 InnoDB: Rolling back trx with id 1806, 3 rows to undo 
  26.  
  27. 2017-09-13 15:05:11 35556 [Note] InnoDB: Rollback of trx with id 1806 completed 
  28.  
  29. 2017-09-13 15:05:11 7f5ccc3d1700 InnoDB: Rollback of non-prepared transactions completed 
  30.  
  31. 2017-09-13 15:05:11 35556 [Note] InnoDB: Waiting for purge to start 
  32.  
  33. 2017-09-13 15:05:11 35556 [Note] InnoDB: Percona XtraDB (http://www.percona.com) 5.6.14-rel62.0 started; log sequence number 1640654 
  34.  
  35. 2017-09-13 15:05:11 35556 [Note] Recovering after a crash using binlog 
  36.  
  37. 2017-09-13 15:05:11 35556 [Note] Starting crash recovery... 
  38.  
  39. 2017-09-13 15:05:11 35556 [Note] Crash recovery finished.  

可以看到后臺檢測到了上次的異常宕機,然后開啟崩潰恢復,InnoDB檢測到日志LSN是1625987 而系統數據文件ibd的LSN為1625987 ,和ib_logfiles里面的LSN不匹配。后面就是一系列的恢復,前滾,恢復,回滾。***表里的數據為空,證明之前的事務都已經回滾了。

所以基于上面的情況,我們明白開啟了事務,基本情況下這個問題是不會出現的,什么時候會拋出開始的錯誤呢。

我們繼續測試,開啟一個顯式事務,不提交。

  1. begin
  2.  
  3. insert into test values(1,'a'); 
  4.  
  5. insert into test values(2,'b'); 
  6.  
  7. insert into test values(3,'c');  

然后殺掉mysql的服務進程,找到mysql的數據目錄下,刪除redo文件。完成后我們重啟數據庫。

這個時候就拋出了和截圖類似的錯誤。

  1. 2017-09-13 16:05:14 36896 [Note] InnoDB: Highest supported file format is Barracuda. 
  2.  
  3. 2017-09-13 16:05:14 7f73450a97e0 InnoDB: Error: page 7 log sequence number 1627722 
  4.  
  5. InnoDB: is in the future! Current system log sequence number 1626124. 
  6.  
  7. InnoDB: Your database may be corrupt or you may have copied the InnoDB 
  8.  
  9. InnoDB: tablespace but not the InnoDB log files. See 
  10.  
  11. InnoDB: http://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html 
  12.  
  13. InnoDB: for more information.  

這個問題目前的影響范圍其實還不明顯,因為盡管如此,我們還是能夠寫入數據的。 

  1. mysql> insert into test values(1,'a'); 
  2.  
  3. Query OK, 1 row affected (0.04 sec) 
  4.  
  5. mysql> select *from test; 
  6.  
  7. +----+------+ 
  8.  
  9. | id | name | 
  10.  
  11. +----+------+ 
  12.  
  13. | 1 | a | 
  14.  
  15. +----+------+ 
  16.  
  17. 1 row in set (0.00 sec)  

關于崩潰恢復,有一個數據參數尤其需要注意,那就是innodb_force_recovery,這個參數默認值為0,如果為非0的值(范圍為1-6),會有下面的影響范圍。

1 (SRV_FORCE_IGNORE_CORRUPT): 忽略檢查到的corrupt頁。

2 (SRV_FORCE_NO_BACKGROUND): 阻止主線程的運行,如主線程需要執行full purge操作,會導致crash。

3 (SRV_FORCE_NO_TRX_UNDO): 不執行事務回滾操作。

4 (SRV_FORCE_NO_IBUF_MERGE): 不執行插入緩沖的合并操作。

5 (SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存儲引擎會將未提交的事務視為已提交。

6 (SRV_FORCE_NO_LOG_REDO): 不執行前滾的操作。

當然這個參數的設置修改是需要重啟MySQL服務的。

  1. mysql> set global innodb_force_recovery=2; 
  2.  
  3. ERROR 1238 (HY000): Variable 'innodb_force_recovery' is a read only variable  

在此假設我們設置為2,再次復現這個問題問題,你就會發現,數據庫暫時是可以啟動的,但是數據只能查詢,DML操作都會拋錯。

  1. mysql> select *from test; 
  2.  
  3. Empty set (0.00 sec) 
  4.  
  5. mysql> 
  6.  
  7. mysql> insert into test values(1,'a'); 
  8.  
  9. ERROR 1030 (HY000): Got error -1 from storage engine  

按照這個影響的范圍來評估force_recovery的值,我們就可以做相應的取舍了。如果MySQL服務無法正常啟動,就可以修改這個參數值來調整,先滿足服務可持續性的基本問題。然后評估后導出重要的數據來。 

責任編輯:龐桂玉 來源: 楊建榮的學習筆記
相關推薦

2013-01-08 10:06:43

創業創業方法

2016-04-05 10:12:58

HiveSQLHadoop

2011-07-12 17:55:28

尾日志備份

2009-11-09 13:56:15

WCF Stream對

2010-05-20 15:29:43

優化IIS

2011-11-30 09:26:25

項目管理

2012-03-27 08:49:19

Json

2009-07-09 15:09:05

JDK卸載

2009-09-14 19:44:27

LINQ To SQL

2024-05-31 08:40:09

2020-11-26 10:16:31

MIUI廣告

2025-05-29 00:00:00

UI 庫前端模塊化

2011-12-02 09:39:22

項目管理

2012-11-23 16:46:12

LinuxVim

2009-09-14 20:17:05

并行LINQ

2014-06-04 10:48:38

Swift蘋果iOS

2012-07-12 10:49:53

項目管理

2011-07-04 09:33:04

惠普轉型李艾科

2016-01-06 09:49:59

青云/SDN

2011-03-15 10:41:05

內部類
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区免费 | 午夜视频一区 | 国产日韩精品久久 | 黄色日本片 | 草草视频在线免费观看 | 日韩精品一区二区三区中文在线 | 日本久久久久久 | 一区二区免费视频 | 亚洲国产一区视频 | 国产精品久久久久久久久久久久久 | 欧美伊人久久久久久久久影院 | 国产激情精品一区二区三区 | 午夜视频一区二区 | 精品国产欧美一区二区 | av在线免费观看网站 | 欧美午夜影院 | 在线观看成人 | 亚洲高清网 | 中文字幕 在线观看 | 网站黄色av | 韩日av片| 97精品超碰一区二区三区 | 亚洲一级淫片 | 999热在线视频 | 精品精品 | 一区二区精品 | 成人精品在线 | 成人国产精品免费观看视频 | 日本五月婷婷 | 伊人精品国产 | 九九九久久国产免费 | 国产成人精品a视频一区www | 中文字幕第一页在线 | 日韩在线小视频 | 久久久久无码国产精品一区 | 第四色影音先锋 | 一区二区三区四区在线视频 | 国产资源在线视频 | 一区二区三区四区在线 | 欧美一区二区三区在线观看视频 | 精产国产伦理一二三区 |