適用於:SQL Server
Azure SQL Database
Azure SQL 受控實例
SQL Server 為系統管理員提供了特殊的診斷連線,可在伺服器的標準連線失效時使用。 這個診斷連接可讓系統管理員存取 SQL Server 以執行診斷查詢和排解疑難問題,即使 SQL Server 未回應標準連接要求。
此專用管理員連接 (DAC) 支援加密以及 SQL Server 的其他安全性功能。 DAC 只允許將使用者內容變更為其他管理使用者。
SQL Server 會嘗試讓 DAC 連線成功,但在極端情況下可能不會成功。
與 DAC 連線
依預設,只能從執行於伺服器上的用戶端進行連接。 除非使用預存程式搭配sp_configure伺服器組態選項來設定,否則不允許網路連線。
只有 SQL Server 系統管理員 (sysadmin) 角色的成員可以使用 DAC 進行連接。
DAC 的存取與支援是使用特殊管理員參數 (sqlcmd),以透過 -A 命令提示字元公用程式來執行。 如需使用 sqlcmd的相關資訊,請參閱 sqlcmd - 與指令碼變數搭配使用。 您也可以在前面加上 admin: 來連線到執行個體名稱,其格式為 sqlcmd -S admin:<instance_name>。 您也可以藉由連線到 admin:<instance_name>,以便從 SQL Server Management Studio 查詢編輯器起始 DAC。
若要從 SQL Server Management Studio 建立 DAC:
中斷與相關 SQL Server 執行個體的所有連線,包括 [物件總管] 和所有開啟的查詢視窗。
從功能表中,選取 [檔案] > [新增] > [資料庫引擎查詢]
在 [伺服器名稱] 欄位的連線對話方塊中,如果使用預設執行個體,請輸入
admin:<server_name>;如果使用具名執行個體,則輸入admin:<server_name>\<instance_name>。
DAC 通訊埠
SQL Server 如果在啟動資料庫引擎之後有可用或動態指派的 TCP 通訊埠,會在 TCP 通訊埠 1434 上接聽 DAC。 錯誤記錄檔包含 DAC 接聽時所使用的通訊埠號碼。 依預設,DAC 接聽程式只接受本機通訊埠上的連接。 如需啟動遠端管理連線的程式碼範例,請參閱 伺服器組態:遠端系統管理連線。
一旦設定遠端管理連接之後,即會啟用 DAC 接聽程式而不需重新啟動 SQL Server,而且用戶端可以從遠端連接到 DAC。 您可以先在本機使用 DAC 連接到 SQL Server,然後執行 sp_configure 預存程序以接受遠端的連接,藉以啟用 DAC 接聽程式使其可接受遠端連接,即使 SQL Server 未回應仍可執行。
在叢集組態中,DAC 預設為關閉。 使用者可執行 sp_configure 的 remote admin connection 選項,啟用 DAC 接聽程式以存取遠端連接。 若 SQL Server 未回應且 DAC 接聽程式未啟用,您可能必須重新啟動 SQL Server 以連接 DAC。 因此,建議您在叢集系統上啟用 remote admin connections 組態選項。
SQL Server 會在啟動期間動態指定 DAC 通訊埠。 連接到預設執行個體時,DAC 會在連接時避免對 SQL Server Browser 服務使用 SQL Server 解析通訊協定 (SSRP) 要求。 它會先透過 TCP 通訊埠 1434 連接。 若失敗,則會發出 SSRP 呼叫以取得通訊埠。 若 SQL Server Browser 並未接聽 SSRP 要求,則連接要求會傳回錯誤。 請參閱錯誤記錄檔,以了解 DAC 接聽時所使用的通訊埠編號。 若 SQL Server 的組態可接受遠端管理連接,DAC 就必須以明確的通訊埠編號起始:
sqlcmd -S tcp:<server>,<port>
SQL Server 錯誤記錄檔會列出 DAC 的通訊埠編號,依預設為 1434。 若將 SQL Server 設定為只接受本機 DAC 連接,請利用下列命令使用回送配接器進行連接:
sqlcmd -S 127.0.0.1,1434
局限性
由於 DAC 僅在少數的情況下才會為了診斷伺服器問題而建立,因此這項連接有某些限制:
若要保證有足夠的資源可供連接使用,每個 SQL Server 執行個體只能有一個 DAC。 若已有作用中的 DAC 連接存在,則所有透過 DAC 建立連接的新要求都會遭到拒絕,並產生錯誤 17810。
為了節省資源,SQL Server Express 不會接聽 DAC 埠,除非以追蹤旗標 7806 啟動。
DAC 最初會嘗試連接到與登入相關聯的預設資料庫。 成功連線之後,您可以連線到
master資料庫。 如果預設資料庫離線或是無法使用,連接將會傳回錯誤 4060。 但是,若您使用下列命令來覆寫預設資料庫以連接到master資料庫,連接就會成功:sqlcmd -A -d master建議您使用 DAC 連接到
master資料庫,因為只要啟動資料庫引擎執行個體,就一定可以使用master。SQL Server 禁止以 DAC 執行平行查詢或命令。 例如,若您以 DAC 執行下列其中一項陳述式,就會產生錯誤 3637:
RESTORE...BACKUP...
只有某些限定的資源必定可透過 DAC 來使用。 請勿使用 DAC 來執行資源密集的查詢或可能封鎖其他查詢的查詢。 如此可防止 DAC 在現有的伺服器問題外衍生出其他問題。 若要避免潛在的封鎖案例,如果您必須執行可能封鎖的查詢,請盡可能在快照集型隔離層級下執行查詢;否則,請將交易隔離層級設定為
READ UNCOMMITTED,並將值設定LOCK_TIMEOUT為短值,例如 2000 毫秒,或兩者。 如此可防止 DAC 工作階段產生封鎖的情形。 但依照 SQL Server 所處的狀態,DAC 工作階段也可能會遭到閂鎖封鎖。 您可以使用 CTRL-C 來結束 DAC 工作階段,但不一定能成功。 在此情況下,您唯一的選擇可能是重新啟動 SQL Server。為了保證 DAC 連接與疑難排解能順利進行,SQL Server 會保留有限的資源來處理 DAC 所執行的命令。 通常,這些資源僅足夠用來執行簡單的診斷與疑難排解功能,如下表所示。
雖然,理論上您可以在 DAC 上執行任何不需要以平行方式執行的 Transact-SQL 陳述式,但我們還是強烈建議您將使用方式限定在下列診斷與疑難排解命令:
基本診斷的查詢動態管理檢視,例如 sys.dm_tran_locks 可了解封鎖狀態、sys.dm_os_memory_cache_counters 可檢查快取的健全狀態,而 sys.dm_exec_requests 和 sys.dm_exec_sessions 可了解作用中的工作階段與要求。 請避免使用會耗用大量資源 (例如 sys.dm_tran_version_store 會掃描完整版本存放區而產生大量 I/O) 或使用複雜聯結的動態管理檢視。 如需效能含意的資訊,請參閱特定 動態管理檢視的文件集。
查詢目錄檢視。
基本 DBCC 命令,例如 DBCC FREEPROCCACHE、DBCC FREESYSTEMCACHE、DBCC DROPCLEANBUFFERS 及 DBCC SQLPERF。 避免執行需要大量資源的命令,例如 DBCC CHECKDB、DBCC DBREINDEX 或 DBCC SHRINKDATABASE。
Transact-SQL
KILL <spid>命令(&C)。 視 SQL Server 的狀態而定,命令KILL可能不會成功。 唯一的選項可能是重新啟動執行個體,如果是 SQL Server 或 Azure SQL 受控執行個體。 下面是部分一般方針:藉由查詢
SELECT * FROM sys.dm_exec_sessions WHERE session_id = <spid>;,來確認是否已清除 SPID。 若未傳回資料列,表示已清除工作階段。若工作階段仍然存在,請執行
SELECT * FROM sys.dm_os_tasks WHERE session_id = <spid>;查詢,以確認此工作階段上是否有指定的工作。 若您在工作階段上看到工作,很可能表示工作階段正在清除中。 這可能需要相當長的時間,而且可能根本不會成功。如果工作
sys.dm_os_tasks階段中沒有與此工作階段相關聯的工作,但工作階段在執行sys.dm_exec_sessions命令後仍處於 狀態KILL,則表示您沒有可用的工作者。 選取其中一個目前執行中的工作 (檢視中sys.dm_os_tasks列出的任務,並以 )sessions_id <> NULL終止與其相關聯的工作階段,以釋放背景工作者。 殺死一個會話可能還不夠:你可能必須殺死多個會話。
Azure SQL 資料庫中的限制
當搭配 DAC 連接到 Azure SQL Database 時,您也必須使用 -d 選項在連接字串中指定資料庫名稱。
Azure SQL 受控執行個體中的限制
DAC 無法透過 Azure SQL 受控執行個體的私人端點運作。 在 SQL 受控執行個體上,DAC 會接聽連接埠 1434。 因為 SQL 受控執行個體的私人端點只允許連接埠 1433 上的連線,所以您無法使用私人端點來建立 DAC 連線。 您必須與 SQL 受控執行個體位於相同的虛擬網路中,才能連線到 DAC。
範例
在此範例中,系統管理員注意到伺服器 contoso-server 並未回應,而要診斷問題。 為了進行這項作業,使用者啟動 sqlcmd 命令提示字元公用程式,並使用 contoso-server 來表示 DAC,連接到伺服器 -A 。
sqlcmd -S contoso-server -U sa -P <StrongPassword> -A
此時,系統管理員可執行查詢以診斷問題,並盡可能結束未回應的工作階段。
連線到 SQL Database 的類似範例會使用下列命令,包括參數 -d 來指定資料庫:
sqlcmd -S serverName.database.windows.net,1434 -U sa -P <StrongPassword> -d AdventureWorks
相關內容
- 將 sqlcmd 與指令碼變數搭配使用
- sqlcmd 公用程式
- 選擇 (Transact-SQL)
- sp_who (Transact-SQL)
- sp_lock (Transact-SQL)
- 擊殺 (Transact-SQL)
- DBCC 檢查分配 (Transact-SQL)
- DBCC CHECKDB (Transact-SQL)
- DBCC OPENTRAN (Transact-SQL)
- DBCC INPUTBUFFER (Transact-SQL)
- 伺服器組態選項
- 交易相關的動態管理檢視和函數 (Transact-SQL)
- 使用 DBCC TRACEON 設定追蹤旗標 (Transact-SQL)