問
在 MySQL 執行時,我們調整系統時間,會造成什麼影響麼?
實驗
按慣例,我們造個資料庫:
在一個會話裡,進行vsleep:
在 sleep 的同時,我們將伺服器的時間向未來調整 10 秒:
我們會發現,sleep 立刻退出,只執行了0.82 秒:
我們在業務中很少會用到 sleep,那麼調整系統時間會有更大的影響麼?我們再來看看:
我們在一個會話中,鎖住一張表:
在另一個會話中, 我們做如下幾件事:
- 先列印一個時間戳
- 調整 lock_wait_timeout
- 訪問 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 的技術內容,你們還有什麼想知道的嗎?趕緊留言告訴小編吧!