當前位置:成語大全網 - 新華字典 - mysql重啟之後首次查詢很慢,求問是什麽原因引起的

mysql重啟之後首次查詢很慢,求問是什麽原因引起的

MySQL 在崩潰恢復時,會遍歷打開所有 ibd 文件的 header page 驗證數據字典的準確性,如果 MySQL 中包含了大量表,這個校驗過程就會比較耗時。 MySQL 下崩潰恢復確實和表數量有關,表總數越大,崩潰恢復時間越長。另外磁盤 IOPS 也會影響崩潰恢復時間,像這裏開發庫的 HDD IOPS 較低,因此面對大量的表空間,校驗速度就非常緩慢。另外壹個發現,MySQL 8 下正常啟用時居然也會進行表空間校驗,而故障恢復時則會額外再進行壹次表空間校驗,等於校驗了 2 遍。不過 MySQL 8.0 裏多了壹個特性,即表數量超過 5W 時,會啟用多線程掃描,加快表空間校驗過程。

如何跳過校驗MySQL 5.7 下有方法可以跳過崩潰恢復時的表空間校驗過程嘛?查閱了資料,方法主要有兩種:

1. 配置 innodb_force_recovery可以使 srv_force_recovery != 0 ,那麽 validate = false,即可以跳過表空間校驗。實際測試的時候設置 innodb_force_recovery =1,也就是強制恢復跳過壞頁,就可以跳過校驗,然後重啟就是正常啟動了。通過這種臨時方式可以避免崩潰恢復後非常耗時的表空間校驗過程,快速啟動 MySQL,個人目前暫時未發現有什麽隱患。2. 使用***享表空間替代獨立表空間這樣就不需要打開 N 個 ibd 文件了,只需要打開壹個 ibdata 文件即可,大大節省了校驗時間。自從聽了姜老師講過使用***享表空間替代獨立表空間解決 drop 大表時性能抖動的原理後,感覺***享表空間在很多業務環境下,反而更有優勢。

臨時冒出另外壹種解決想法,即用 GDB 調試崩潰恢復,通過臨時修改 validate 變量值讓 MySQL 跳過表空間驗證過程,然後讓 MySQL 正常關閉,重新啟動就可以正常啟動了。但是實際測試發現,如果以 debug 模式運行,確實可以臨時修改 validate 變量,跳過表空間驗證過程,但是 debug 模式下代碼運行效率大打折扣,反而耗時更長。而以非 debug 模式運行,則無法修改 validate 變量,想法破滅。