在sql server
2005中,微軟引入了一個叫做資料庫專用管理者連接配接方式(dac dedicated administrator
connection)的特性,使用這個新特性,資料庫管理者可以在資料庫引擎不能響應正常連接配接時,可以通過dac連接配接到資料庫,執行診斷函數或t-
sql語句,對資料庫伺服器進行問題診斷和故障排除(即使資料庫執行個體以鎖定或非正常狀态下運作)。其實dac還有一個非常有用的用途,用來研究資料庫内部
的表、目錄視圖等。
啟用遠端dac連接配接
預設情況下,在sql server 中遠端專用管理者連接配接特性是禁用的。如果要啟用其遠端專用管理者連接配接特性,可以通過t-sql或microsoft sql server management studio工具兩種方式來實作。
t-sql方式:
code snippet
use master;
go
sp_configure'remote admin connections';
sp_configure 'remote admin connections', 1; --0 表示僅允許本地連接配接使用 dac,1表示允許遠端連接配接使用 dac
reconfigure with override;
管理工具:
sql server 2005
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuMmZmRjYyQWN2EGNzYTN1ImYhBDNmlTN3EmN1kTN0EWZtUTM0QTMxgjMvwVOwMTMwIzLcJDN1MzNvw1ZvxmYvwVbvNmLn9GbiRXauNmLzV2Zh1Wavw1LcpDc0RHaiojIsJye.gif)
sql server 2008
用sql server 2008 管理工具啟用專用管理者連接配接特性,右鍵單擊sql server執行個體,然後從下拉的選項中選擇方面(facets)選項,進入檢視方面視窗。
資料庫專用管理者連接配接方式
dac 連接配接到資料庫伺服器可以通過sql server management studio,也可以通過sqlcmd方式連接配接伺服器,我們先看看sqlcmd方式:
sqlcmd方式:
sqlcmd –s [sql server name] –u [user name] –p [password] –a
sqlcmd的文法提示如下,你可以用sqlcmd /?來檢視
例如,我本機環境,機器名kerry-pc,sa賬号密碼為123456,現在我要從本地用dac連接配接到資料庫
其實參數和參數值之間可以不用空格,伺服器可用localhost或ip替換。
錯誤情況1:錯誤截圖如下
錯誤解惑:為了保證有可用的連接配接資源,
每個 sql server 執行個體隻允許使用一個 dac。如果 dac 連接配接已經激活,則通過 dac
進行連接配接的任何新請求都将被拒絕,實際上上面的錯誤是我開了兩個指令視窗,第一個使用dac連接配接到資料庫,第二個連接配接的啥時候就報如上錯誤。
管理工具連接配接
使用ssms以dac連接配接到伺服器時需要在伺服器前面加上admin:,通常為admin:主機名\執行個體名,如果執行個體使預設執行個體則 admin:主機名
錯誤情況1:
錯誤解惑:出現這個錯誤,是因為資料庫已經有一個dac連接配接了,此時再通過dac連接配接到資料庫,就會報如上錯誤。
錯誤情況2:出現下面錯誤,可以在sql server management studio的菜單“檔案 --> 建立 --> 資料庫引擎查詢”,再輸入admin:主機名\執行個體名。這樣就不會有下面錯誤了。
dac的特殊用途
由于 dac 僅用于在極少數情況下診斷伺服器問題,是以對連接配接有一些限制,具體參考msdn,這裡不做過多的叙說。下面簡單說說dac的另外一個用途:
在預設連接配接下,有很多内部表和目錄試圖是無法擷取,往往需要深入研究的時候,非常想知道它内部的實作,那麼dac絕對就是一件利器,我下面舉一個例子,有興趣的可以試試:
目錄試圖sys.databases,這個大家都很熟悉,那麼這個目錄視圖的資料是從那些表擷取的呢,那麼我們找到sys.databases的sql腳本,
從sql腳本可以看出這個目錄的資料來自sys.sysdbreg、 sys.syspalvalues、sys.syssingleobjrefs内部表,但是如果你去檢視這些内部表的資料,你回發現這些對象都不存在
然而通過查詢sys.objects你會發現,其實是有這樣的系統表的,但是查詢的時候就會報對象不存在錯誤,其實你隻需要通過dac連接配接到資料庫,上面的sql就能順利執行,很多系統内部表都可以檢視了。是以不得不說,dac也是了解資料庫内部實作機制的神器啊!
select * from sys.objects where name in ('sysdbreg','syspalvalues','syssingleobjrefs')