您有監控SQL Server系統時間是否正確嗎 ? 該相信GETDATE()得到的資料嗎?

日前管Infra的同仁將一堆SQL的VM轉到另一部實體機上

而該實體機並無對外校時,所以時間一直是錯誤的

當VM轉過去後又同步該實體機的時間,導致所有的SQL系統時間是錯的.....

以前從未考慮過監控系統時間,直到這一次發生這一個問題導致所有SQL的JOB都亂了套。該執行的時段沒執行,而不該執行的時段卻在跑報表,還好無意間即時發現讓損失降到最低。

因此我開始思考應該要將系統時間納入監控,好立即發現問題。這時有一個DMV就很好用,那就是sys.dm_os_sys_info,其中有三個欄位是我們監控會使用到的,如下表。

ms_ticks

bigint

指定自電腦啟動之後的毫秒數。 不可為 Null。

sqlserver_start_time_ms_ticks

bigint

代表上一次啟動 SQL Server 時的 ms_tick 數字。 請與目前的 ms_ticks 資料行相比較。 不可為 Null。

sqlserver_start_time

datetime

指定上一次啟動 SQL Server 的日期和時間。 不可為 Null。

我的測試語法如下

Select
GETDATE() As [系統時間],
Dateadd(ss,((ms_ticks-sqlserver_start_time_ms_ticks)/1000),sqlserver_start_time) As [計算出的系統時間], 
ABS(DATEDIFF(ss,sqlserver_start_time,getdate()) 
- ((ms_ticks-sqlserver_start_time_ms_ticks)/1000)) As [時間差 / 秒]
From sys.dm_os_sys_info;

 

測試如下,下圖是我們正常狀況下。我們可以看見系統時間跟我們透過sys.dm_os_sys_info的三個欄位計算出來的時間秒差只有2秒。

接下來我們手動更動該SQL的OS系統時間,如下圖。

 

經過故意異動時間後我們重新執行該語法,就可以看見秒差為3641秒,此時我們就可以判讀為異常。

以上語法只能在SQL2008 UP上執行。朋友們可以利用此語法搭配JOB來定時檢驗系統時間是否異常。
參考資料來源 : sys.dm_os_sys_info 

我是ROCK

rockchang@mails.fju.edu.tw