天天看點

MS SQL專用管理者連接配接DAC

在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

MS SQL專用管理者連接配接DAC

sql server 2008

用sql server 2008 管理工具啟用專用管理者連接配接特性,右鍵單擊sql server執行個體,然後從下拉的選項中選擇方面(facets)選項,進入檢視方面視窗。

MS SQL專用管理者連接配接DAC

資料庫專用管理者連接配接方式

dac 連接配接到資料庫伺服器可以通過sql server management studio,也可以通過sqlcmd方式連接配接伺服器,我們先看看sqlcmd方式:

sqlcmd方式:

sqlcmd –s [sql server name] –u [user name] –p [password] –a

sqlcmd的文法提示如下,你可以用sqlcmd /?來檢視

MS SQL專用管理者連接配接DAC

例如,我本機環境,機器名kerry-pc,sa賬号密碼為123456,現在我要從本地用dac連接配接到資料庫

MS SQL專用管理者連接配接DAC

其實參數和參數值之間可以不用空格,伺服器可用localhost或ip替換。

MS SQL專用管理者連接配接DAC

錯誤情況1:錯誤截圖如下

MS SQL專用管理者連接配接DAC

錯誤解惑:為了保證有可用的連接配接資源,

每個 sql server 執行個體隻允許使用一個 dac。如果 dac 連接配接已經激活,則通過 dac

進行連接配接的任何新請求都将被拒絕,實際上上面的錯誤是我開了兩個指令視窗,第一個使用dac連接配接到資料庫,第二個連接配接的啥時候就報如上錯誤。

管理工具連接配接

使用ssms以dac連接配接到伺服器時需要在伺服器前面加上admin:,通常為admin:主機名\執行個體名,如果執行個體使預設執行個體則 admin:主機名

MS SQL專用管理者連接配接DAC

錯誤情況1:

MS SQL專用管理者連接配接DAC

錯誤解惑:出現這個錯誤,是因為資料庫已經有一個dac連接配接了,此時再通過dac連接配接到資料庫,就會報如上錯誤。

錯誤情況2:出現下面錯誤,可以在sql server management studio的菜單“檔案 --> 建立 --> 資料庫引擎查詢”,再輸入admin:主機名\執行個體名。這樣就不會有下面錯誤了。

MS SQL專用管理者連接配接DAC

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')