MS SQL專用管理員連接DAC


在SQL SERVER 2005中,微軟引入了一個叫做數據庫專用管理員連接方式(DAC Dedicated Administrator Connection)的特性,使用這個新特性,數據庫管理員可以在數據庫引擎不能響應正常連接時,可以通過DAC連接到數據庫,執行診斷函數或T-SQL語句,對數據庫服務器進行問題診斷和故障排除(即使數據庫實例以鎖定或非正常狀態下運行)。其實DAC還有一個非常有用的用途,用來研究數據庫內部的表、目錄視圖等。

以前我也寫過關於DAC的一篇文章SQL Server數據庫專用管理員DAC連接方式,當時的實驗環境是SQL Server 2005,現在來看,感覺有些側重點和問題都忽略了。

 

啟用遠程DAC連接

默認情況下,在SQL SERVER 中遠程專用管理員連接特性是禁用的。如果要啟用其遠程專用管理員連接特性,可以通過T-SQL或Microsoft  SQL Server Management Studio工具兩種方式來實現。

T-SQL方式:

Code Snippet
  1. USE master;
  2.  
  3. GO
  4.  
  5. SP_CONFIGURE'remote admin connections';
  6. SP_CONFIGURE 'remote admin connections', 1; --0 表示僅允許本地連接使用 DAC,1表示允許遠程連接使用 DAC
  7. GO
  8. RECONFIGURE WITH OVERRIDE;
  9. GO

管理工具:

SQL Server 2005

clip_image002

SQL Server 2008

用SQL Server 2008 管理工具啟用專用管理員連接特性,右鍵單擊SQL Server實例,然后從下拉的選項中選擇方面(Facets)選項,進入查看方面窗口。

clip_image004

 

數據庫專用管理員連接方式

DAC 連接到數據庫服務器可以通過SQL Server Management Studio,也可以通過sqlcmd方式連接服務器,我們先看看sqlcmd方式:

sqlcmd方式:

SQLCMD –S [SQL Server Name] –U [User Name] –P [Password] –A

sqlcmd的語法提示如下,你可以用sqlcmd /?來查看

clip_image006

例如,我本機環境,機器名Kerry-PC,sa賬號密碼為123456,現在我要從本地用DAC連接到數據庫

clip_image008

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

clip_image010

 

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

clip_image012

C:\Users\Kerry>sqlcmd -S Kerry-Pc -U sa -P 123456 -A

HResult 0x1A,級別 16,狀態 1

因為在登錄之前握手期間出現錯誤,所以客戶端無法建立連接。最常見原因包括客戶端試圖

連接到不受支持的 SQL Server 版本、服務器太忙無法接受新連接或服務器上的資源受到限

制(內存或允許的最大連接數)。

Sqlcmd: 錯誤: Microsoft SQL Server Native Client 10.0 : 客戶端無法建立連接。

HResult 0x40,級別 16,狀態 1

TCP 提供程序: 指定的網絡名不再可用。

Sqlcmd: 錯誤: Microsoft SQL Server Native Client 10.0 : 由於預登錄失敗,客戶端無

法建立連接。
View Code

 

錯誤解惑:為了保證有可用的連接資源,每個 SQL Server 實例只允許使用一個 DAC。如果 DAC 連接已經激活,則通過 DAC 進行連接的任何新請求都將被拒絕,實際上上面的錯誤是我開了兩個命令窗口,第一個使用DAC連接到數據庫,第二個連接的啥時候就報如上錯誤。

管理工具連接

使用SSMS以DAC連接到服務器時需要在服務器前面加上ADMIN:,通常為ADMIN:主機名\實例名,如果實例使默認實例則 ADMIN:主機名

clip_image014

錯誤情況1:

clip_image016

 

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

錯誤情況2:出現下面錯誤,可以在SQL Server Management Studio的菜單“文件 --> 新建 --> 數據庫引擎查詢”,再輸入admin:主機名\實例名。這樣就不會有下面錯誤了。

clip_image018

 

標題: 連接到數據庫引擎

------------------------------

無法連接到 ADMIN:Kerry-PC。

------------------------------

其他信息:

已成功與服務器建立連接,但是在登錄過程中發生錯誤。 (provider: TCP 提供程序, error: 0 - 您的主機中的軟件中止了一個已建立的連接。) (Microsoft SQL Server,錯誤: 10053)

有關幫助信息,請單擊: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&EvtSrc=MSSQLServer&EvtID=10053&LinkId=20476

------------------------------

按鈕:

確定

------------------------------
錯誤詳細信息

 

DAC的特殊用途 

由於 DAC 僅用於在極少數情況下診斷服務器問題,因此對連接有一些限制,具體參考MSDN,這里不做過多的敘說。下面簡單說說DAC的另外一個用途:

在默認連接下,有很多內部表和目錄試圖是無法獲取,往往需要深入研究的時候,非常想知道它內部的實現,那么DAC絕對就是一件利器,我下面舉一個例子,有興趣的可以試試:

目錄試圖sys.databases,這個大家都很熟悉,那么這個目錄視圖的數據是從那些表獲取的呢,那么我們找到sys.databases的SQL腳本,

SET QUOTED_IDENTIFIER ON 
SET ANSI_NULLS ON 
GO 
CREATE VIEW sys.databases AS 
    SELECT d.name, d.id AS database_id, 
        r.indepid AS source_database_id, 
        d.sid AS owner_sid, 
        d.crdate AS create_date, 
        d.cmptlevel AS compatibility_level, 
        convert(sysname, CollationPropertyFromID(p.cid, 'name')) AS collation_name, 
        p.user_access, ua.name AS user_access_desc, 
        sysconv(bit, d.status & 0x400) AS is_read_only,            -- DBR_RDONLY 
        sysconv(bit, d.status & 1) AS is_auto_close_on,            -- DBR_CLOSE_ON_EXIT 
        sysconv(bit, d.status & 0x400000) AS is_auto_shrink_on,        -- DBR_AUTOSHRINK 
        p.state, st.name AS state_desc, 
        sysconv(bit, d.status & 0x200000) AS is_in_standby,        -- DBR_STANDBY 
        sysconv(bit, d.status & 0x40000000) AS is_cleanly_shutdown,    -- DBR_CLEANLY_SHUTDOWN 
        sysconv(bit, d.status & 0x80000000) AS is_supplemental_logging_enabled,    -- DBR_SUPPLEMENT_LOG 
        p.snapshot_isolation_state, si.name AS snapshot_isolation_state_desc, 
        sysconv(bit, d.status & 0x800000) AS is_read_committed_snapshot_on,        -- DBR_READCOMMITTED_SNAPSHOT 
        p.recovery_model, ro.name AS recovery_model_desc, 
        p.page_verify_option, pv.name AS page_verify_option_desc, 
        sysconv(bit, d.status2 & 0x1000000) AS is_auto_create_stats_on,            -- DBR_AUTOCRTSTATS 
        sysconv(bit, d.status2 & 0x40000000) AS is_auto_update_stats_on,        -- DBR_AUTOUPDSTATS 
        sysconv(bit, d.status2 & 0x80000000) AS is_auto_update_stats_async_on,    -- DBR_AUTOUPDSTATSASYNC 
        sysconv(bit, d.status2 & 0x4000) AS is_ansi_null_default_on,            -- DBR_ANSINULLDFLT 
        sysconv(bit, d.status2 & 0x4000000) AS is_ansi_nulls_on,                -- DBR_ANSINULLS 
        sysconv(bit, d.status2 & 0x2000) AS is_ansi_padding_on,                    -- DBR_ANSIPADDING 
        sysconv(bit, d.status2 & 0x10000000) AS is_ansi_warnings_on,            -- DBR_ANSIWARNINGS 
        sysconv(bit, d.status2 & 0x1000) AS is_arithabort_on,                    -- DBR_ARITHABORT 
        sysconv(bit, d.status2 & 0x10000) AS is_concat_null_yields_null_on,        -- DBR_CATNULL 
        sysconv(bit, d.status2 & 0x800) AS is_numeric_roundabort_on,            -- DBR_NUMEABORT 
        sysconv(bit, d.status2 & 0x800000) AS is_quoted_identifier_on,            -- DBR_QUOTEDIDENT 
        sysconv(bit, d.status2 & 0x20000) AS is_recursive_triggers_on,            -- DBR_RECURTRIG 
        sysconv(bit, d.status2 & 0x2000000) AS is_cursor_close_on_commit_on,    -- DBR_CURSCLOSEONCOM 
        sysconv(bit, d.status2 & 0x100000) AS is_local_cursor_default,            -- DBR_DEFLOCALCURS 
        sysconv(bit, d.status2 & 0x20000000) AS is_fulltext_enabled,            -- DBR_FTENABLED 
        sysconv(bit, d.status2 & 0x200) AS is_trustworthy_on,                -- DBR_TRUSTWORTHY 
        sysconv(bit, d.status2 & 0x400) AS is_db_chaining_on,                -- DBR_DBCHAINING 
        sysconv(bit, d.status2 & 0x08000000) AS is_parameterization_forced,    -- DBR_UNIVERSALAUTOPARAM 
        sysconv(bit, d.status2 & 64) AS is_master_key_encrypted_by_server,    -- DBR_MASTKEY 
        sysconv(bit, d.category & 1) AS is_published, 
        sysconv(bit, d.category & 2) AS is_subscribed, 
        sysconv(bit, d.category & 4) AS is_merge_published, 
        sysconv(bit, d.category & 16) AS is_distributor, 
        sysconv(bit, d.category & 32) AS is_sync_with_backup, 
        d.svcbrkrguid AS service_broker_guid, 
        sysconv(bit, case when d.scope = 0 then 1 else 0 end) AS is_broker_enabled, 
        p.log_reuse_wait, lr.name AS log_reuse_wait_desc, 
        sysconv(bit, d.status2 & 4) AS is_date_correlation_on,         -- DBR_DATECORRELATIONOPT 
        sysconv(bit, d.category & 64) AS is_cdc_enabled, 
        sysconv(bit, d.status2 & 0x100) AS is_encrypted,                        -- DBR_ENCRYPTION 
        sysconv(bit, d.status2 & 0x8) AS is_honor_broker_priority_on                -- DBR_HONORBRKPRI 
    FROM master.sys.sysdbreg d OUTER APPLY OpenRowset(TABLE DBPROP, d.id) p 
    LEFT JOIN sys.syssingleobjrefs r ON r.depid = d.id AND r.class = 96 AND r.depsubid = 0    -- SRC_VIEWPOINTDB 
    LEFT JOIN sys.syspalvalues st ON st.class = 'DBST' AND st.value = p.state 
    LEFT JOIN sys.syspalvalues ua ON ua.class = 'DBUA' AND ua.value = p.user_access 
    LEFT JOIN sys.syspalvalues si ON si.class = 'DBSI' AND si.value = p.snapshot_isolation_state 
    LEFT JOIN sys.syspalvalues ro ON ro.class = 'DBRO' AND ro.value = p.recovery_model 
    LEFT JOIN sys.syspalvalues pv ON pv.class = 'DBPV' AND pv.value = p.page_verify_option 
    LEFT JOIN sys.syspalvalues lr ON lr.class = 'LRWT' AND lr.value = p.log_reuse_wait 
    WHERE d.id < 0x7fff 
        AND has_access('DB', d.id) = 1 
GO
View Code

從SQL腳本可以看出這個目錄的數據來自sys.sysdbreg、 sys.syspalvalues、sys.syssingleobjrefs內部表,但是如果你去查看這些內部表的數據,你回發現這些對象都不存在

SELECT * FROM sys.sysdbreg

SELECT * FROM sys.syspalvalues

SELECT * FROM sys.syssingleobjrefs

消息 208,級別 16,狀態 1,第 1 行
對象名 'sys.sysdbreg' 無效。

 

然而通過查詢sys.objects你會發現,其實是有這樣的系統表的,但是查詢的時候就會報對象不存在錯誤,其實你只需要通過DAC連接到數據庫,上面的SQL就能順利執行,很多系統內部表都可以查看了。所以不得不說,DAC也是了解數據庫內部實現機制的神器啊!

select * from sys.objects where name in ('sysdbreg','syspalvalues','syssingleobjrefs')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM