最近我們的MySQL數據庫出現了一個奇怪的問題,就是跑著跑著系統時間就慢了。在查詢數據時,我們發現許多記錄的時間戳比實際時間要晚很多。這個問題影響了我們的業務運行,因此我們開始著手解決它。
我們首先查看了系統時間,發現它與數據庫中的記錄相差較大。我們開始考慮MySQL如何獲取系統時間的。我們發現,MySQL會先嘗試從操作系統獲取時間,如果失敗了,它會使用自己的時鐘來維護時間。
/* 從系統獲取時間 */
if (pthread_getspecific(THR_THD) == &mysql_thread_id)
tv= get_cached_time(&mysql_sysclock);
else
gettimeofday(&tv,0);
因此,我們開始檢查操作系統的時間設置。我們發現,系統時間是正確的。我們進一步檢查了MySQL的時間設置。我們發現,MySQL默認會將系統時鐘同步到自己的時鐘。
[mysqld]
skip-slave-start
default-time-zone=SYSTEM
init-connect='SET NAMES utf8mb4'
log-error=/var/lib/mysql/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/lib/mysql/mysql.sock
# synchronize the internal clock with the OS
# this value should be adjusted according to system clock accuracy
# never lower to 1 or higher than 10
# beware of the consequences of clock adjustment
# for details see: http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_system_time_zone
system_time_zone=EST
我們發現,MySQL默認將系統時鐘同步到自己的時鐘,而MySQL的時鐘與真實的系統時鐘相差較大。因此,我們想到了一種解決辦法,就是將MySQL時鐘同步到系統時鐘。我們在MySQL命令行工具中執行以下命令:
SET GLOBAL time_zone = 'Asi/Shanghai';
我們重新查詢了數據,發現時間戳的問題得到了解決,現在已經與實際時間同步。這個問題的解決告訴我們,注意數據庫的時間設置非常重要,我們需要不斷地檢查和調整,確保系統正常運行。