一. 什麼是跟蹤標記 SQL Server 跟蹤標記(Trace Flag),像是一個開關,可用來自定義SQL Server的某種行為或特性,在性能診斷,系統調試等方面較為常用。比如:開啟1204或1222跟蹤標記,可在errorlog里記錄死鎖信息的明細。 跟蹤標記有會話級和實例級兩種。 二. 如 ...
一. 什麼是跟蹤標記
SQL Server 跟蹤標記(Trace Flag),像是一個開關,可用來自定義SQL Server的某種行為或特性,在性能診斷,系統調試等方面較為常用。比如:開啟1204或1222跟蹤標記,可在errorlog里記錄死鎖信息的明細。
跟蹤標記有會話級和實例級兩種。
二. 如何開啟跟蹤標記
1. 在SQL Server 服務啟動時開啟
SQL Server服務從類似如下路徑啟動程式:
C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQL2016\MSSQL\Binn\sqlservr.exe
而sqlservr.exe接受一些啟動參數,其中就包含了跟蹤標記。
以命名實例MSSQL2016,跟蹤標記610 為例:
1.1 使用sqlservr.exe來啟動
(1) 先停掉服務 (以管理員身份運行cmd命令視窗)
預設實例:net stop MSSQLSERVER / net stop "SQL Server (MSSQLSERVER)"
命名實例:net stop MSSQL$MSSQL2016 / net stop "SQL Server (MSSQL2016)"
(2) 啟動服務 (先cd切換到sqlservr.exe目錄)
預設實例:sqlservr.exe –T610
命名實例:sqlservr.exe -sMSSQL2016 –T610
命令行舉例:
C:\Windows\system32>net stop MSSQL$MSSQL2016 The SQL Server (MSSQL2016) service is stopping. The SQL Server (MSSQL2016) service was stopped successfully. C:\Windows\system32>cd C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQL2016\MSSQL\Binn\ C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQL2016\MSSQL\Binn>sqlservr -sMSSQL2016 -T610
在資料庫里執行SQL語句,可看到已啟動的跟蹤標記:
dbcc tracestatus(-1) --TraceFlag Status Global Session --610 1 1 0
註:
(1) 以這種方式啟動的SQL Server,服務狀態仍然是停止,但是SSMS/SQLCMD均可以連接並執行SQL語句,通常用於系統故障診斷/維護時,不作為常規啟動方式使用;
(2) 關閉當前的cmd視窗,即可關閉該次啟動;
1.2使用net命令來啟動
(1) 先停掉服務 (以管理員身份運行cmd命令視窗)
預設實例:net stop MSSQLSERVER 或 net stop "SQL Server (MSSQLSERVER)"
命名實例:net stop MSSQL$MSSQL2016或 net stop "SQL Server (MSSQL2016)"
(2) 啟動服務(以管理員身份運行cmd命令視窗)
預設實例:net start MSSQLSERVER /T610 或net start "SQL Server (MSSQLSERVER)" /T610
命名實例:net start MSSQL$MSSQL2016 /T610 或net start "SQL Server (MSSQL2016)" /T610
命令行舉例:
C:\Windows\system32>net stop MSSQL$MSSQL2016 The SQL Server (MSSQL2016) service is stopping. The SQL Server (MSSQL2016) service was stopped successfully. C:\Windows\system32>net start MSSQL$MSSQL2016 /T610 The SQL Server (MSSQL2016) service is starting. The SQL Server (MSSQL2016) service was started successfully.
在資料庫里執行SQL語句,可看到已啟動的跟蹤標記:
dbcc tracestatus(-1) --TraceFlag Status Global Session --610 1 1 0
註:
(1) 以net命令啟動SQL Server服務時,exe程式的參數通過斜線(/)來傳遞而不是橫線(-):/T610;
1.3 使用配置管理器 (Configuration Manager) 來啟動
打開SQL Server 配置管理器\SQL Server 服務\選擇相應實例:
(1) 停止相應實例的服務
(2) 屬性\啟動參數, 輸入-T610 並添加
(3) 啟動相應實例的服務
在資料庫里執行SQL語句,可看到已啟動的跟蹤標記:
dbcc tracestatus(-1) --TraceFlag Status Global Session --610 1 1 0
註:
(1) 啟動參數被保存在註冊表裡,在服務啟動時載入,所以會一直有效,直到在啟動參數中刪除該項並保存;
(2) 在配置管理器中修改SQL Server服務相關的參數為最佳實踐(Best Practice),推薦;
2. 在SQL Server 服務啟動後開啟
在SQL Server服務啟動後,可通過DBCC命令來開/關跟蹤標記
--開啟會話級跟蹤標記 dbcc traceon(610) --會話級跟蹤標記,只能在所在會話關閉 dbcc traceoff(610) --開啟實例級跟蹤標記 dbcc traceon(610,-1) --實例級跟蹤標記,在所有會話都可關閉 dbcc traceoff(610,-1) --指定-1,顯示所有已開啟跟蹤標記 dbcc tracestatus(-1)
註:
(1) 會話級跟蹤標記,只對當前會話有效,其他會話不受影響;
(2) 實例級跟蹤標記,整個實例有效;
小結:
(1) 以上幾種方式,只有在SQL Server配置管理器里修改啟動參數添加跟蹤標記,會被保存到註冊表,從而每次啟動服務時跟蹤標記都可以生效,其他幾種方式只是在當前的命令行里開啟了跟蹤標記選項,正常重啟服務後,跟蹤標記就不見了;
(2) 只有DBCC traceon 可開啟會話級跟蹤標記,其他開啟方式均為實例級;
(3) 如果要在生產環境使用,請儘可能多的測試,尤其是非文檔記載的跟蹤標記;