日前管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秒,此時我們就可以判讀為異常。
我是ROCK
rockchang@mails.fju.edu.tw