第48問:為什麼 MySQL 執行時, 不鼓勵調整系統時間

愛可生雲資料庫發表於2021-11-09

在 MySQL 執行時,我們調整系統時間,會造成什麼影響麼?

實驗

按慣例,我們造個資料庫:

在一個會話裡,進行vsleep:

在 sleep 的同時,我們將伺服器的時間向未來調整 10 秒:

我們會發現,sleep 立刻退出,只執行了0.82 秒:

我們在業務中很少會用到 sleep,那麼調整系統時間會有更大的影響麼?我們再來看看:

我們在一個會話中,鎖住一張表:

在另一個會話中, 我們做如下幾件事:

  1. 先列印一個時間戳
  2. 調整 lock_wait_timeout
  3. 訪問 test.a 表

此時, 我們調整系統時間, 向過去調整 10 秒:

過一會,等訪問 test.a 的請求超時了,我們來檢視輸出:

我們將兩個時間戳相減,算出這個鎖持續了多久:

5375908 - 5375891 = 17 秒

由此我們知道:調整系統時間,會影響 MDL 的等待時間的計算

小貼士

此處我們獲取系統時間的方法有點奇怪,是從 /proc/timer_list 中獲取, 而並非使用date之類的函式

主要原因是: 當系統時間被調整, date等命令的輸出也會受到影響.

我們想客觀的評估 MySQL實際等待了多久, 除了手動掐秒錶, 還可以利用 單調時鐘 (monotonic clock) 來進行計算.

單調時鐘 不會受到系統時間變化的影響, /proc/timer_list中的輸出就是單調時鐘的一種

除了以上的實驗, 調整系統時間, 對正在執行的MySQL還會有其他影響, 比如說 半同步的等待時間計算、 延時複製的延時時間計算 等等

我們不建議在 MySQL 執行時調整系統時間, 如需調整, 應及時重啟 MySQL

思考題

本文中我們測試了 MDL 的等待時間, 大家可以設計一個實驗, 測試一下 InnoDB lock 的等待時間, 會發現很大的不同.

大家可以查閱資料, 來解釋其中的不同.


關於 MySQL 的技術內容,你們還有什麼想知道的嗎?趕緊留言告訴小編吧!

相關文章