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

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:错误截图如下

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 : 由于预登录失败,客户端无

法建立连接。

错误解惑:为了保证有可用的连接资源,
每个 SQL Server 实例只允许使用一个 DAC。如果 DAC 连接已经激活,则通过 DAC
进行连接的任何新请求都将被拒绝,实际上上面的错误是我开了两个命令窗口,第一个使用DAC连接到数据库,第二个连接的啥时候就报如上错误。

管理工具连接

使用SSMS以DAC连接到服务器时需要在服务器前面加上ADMIN:,通常为ADMIN:主机名\实例名,如果实例使默认实例则 ADMIN:主机名

错误情况1:

 

错误解惑:出现这个错误,是因为数据库已经有一个DAC连接了,此时再通过DAC连接到数据库,就会报如上错误。

错误情况2:出现下面错误,可以在SQL Server Management Studio的菜单“文件 --> 新建 --> 数据库引擎查询”,再输入admin:主机名\实例名。这样就不会有下面错误了。

 

标题: 连接到数据库引擎

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

无法连接到 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

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

时间: 2024-10-08 01:17:31

MS SQL专用管理员连接DAC的相关文章

SQL 2005使用专用管理员连接(DAC)的技巧及修改系统表的方法_mssql2005

Server 2005 专用管理员连接 (DAC) 使用技巧 1 什么是专用管理员连接? SQL Server 2005 为管理员提供了一种特殊的诊断连接,以供在无法与服务器建立标准连接时使用. 2 专用管理员连接有什么用? 即使在 SQL Server 不响应标准连接请求时,管理员也可以使用这种连接访问 SQL Server,以便执行诊断查询并解决问题. 管理员可以通过 DAC 访问正在运行的 SQL Server Database Engine 实例来排除服务器的故障(即使该服务器已停止响应

Sql Server 2005 专用管理员连接 (DAC) 使用技巧

                                        Sql Server 2005 专用管理员连接 (DAC) 使用技巧     1 什么是专用管理员连接?SQL Server 2005 为管理员提供了一种特殊的诊断连接,以供在无法与服务器建立标准连接时使用. 2 专用管理员连接有什么用?即使在 SQL Server 不响应标准连接请求时,管理员也可以使用这种连接访问 SQL Server,以便执行诊断查询并解决问题.管理员可以通过 DAC 访问正在运行的 SQL S

MS SQL数据库的连接处理解决方案

解决|数据|数据库 情景描述:为什么打包出来的程序,客户端连接数据库总是提示连接不上数据库.只有当客户机装上SQL就可以连接了. 我在包里包进了DBmsSHRn.dll,ntwdblib.dll,DBMSSOCN.DLL,DBnetlib.dll,libjcc.dll,ntwdblib.DLL,dbmsspxn.dll,Dbnmpntw.dll,pbdwe80.dll,pbmss80.dll,pbrtc80.dll pbsyc80.dll,pbtra80.dll,pbvm80.dll,可是安装到

SQL Server数据库专用管理员DAC连接方式

SQL Server 提供了专用管理员链接(DAC).DAC允许管理员访问运行的服务器以执行诊断函数或Transact-SQL语句,或对服务器上的问题进行故障排除,即使服务器以锁定或在非正常状态下运行.   DAC默认情况下只有服务器上可以使用DAC,但是你可以通过 SQL Server 2005 外围应用配置器设置允许远程计算机上的客户端应用程序使用 DAC,如下图所示     你也可以通过下面的SP_CONFIGURE命令更改数据库服务器配置  --0 - 指明仅允许本地连接使用 DAC -

MS SQL Server入门教程

SQL Server 是一个关系数据库管理系统,它最初是由Microsoft,Sybase和Ashton-Tate三家公司共同开发的,于1988年推出了第一个OS/2版本.在Windows NT推出后,Microsoft与Sybase在SQL Server的开发上就分道扬镳了,Microsoft将SQL Server 移植到Windows NT. MS SQL基础教程:SQL Server 2000 简介 MS SQL基础教程:SQL Server 2000 的新特性 MS SQL基础教程:SQ

SQL Server管理员专用连接的使用

作为一名DBA,经常会处理一些比较棘手的服务无响应问题,鉴于事态的严重性,多数DBA可能直接用"重启"大法,以便尽快的恢复生产环境的正常运转,但是多数情况下我们却无法究其原因,即使产生了dump文件,没有微软的支持,我们同样被蒙在鼓里,幸好微软给我们留了一条"后路",供我们在SQL服务无法连接时,使用它连接并查看"病因",那就是DAC, dedicated administrator connection,管理员专用连接. 有关管理员专用连接请查

利用JDBC连接MS SQL Ser2000+sp2

我在学习j2ee的时候使用jdbc连接过ms sql server 2000,开始的时候一切都正常,但是后来遇到了一个很头痛的问题,就是我们在从表中读取数据放到ResultSet中后,读取列值的时候一定的按照列的顺序读取. 比如如果表中有三列id, name, address,按条件查询得到的结果放到ResultSet中,显示结果时如果这样写代码: java.sql.ResultSet employees; while(employees.next()){ employees.getString

MS SQL基础教程:连接与断开服务器

在Enterprise Manager 的SQL Server Group 中用左键单击所要连接的服务器,或在所要启动的服务器上单击右键后从快捷菜单中选择"Connect" 项,即可启动.如果在注册服务器时选择了在SQL Server 启动时输入账号和口令选项(如图5-8 所示),则会提示输入它们,如图5-12 所示. 在所要断开的服务器上单击右键后从快捷菜单中选择"Disconnect" 选项就可以断开服务器.在关闭Enterprise Manager 时,也会自

MS SQL基础教程:数据库中的连接查询

数据库中的各个表中存放着不同的数据,用户往往需要用多个表中的数据来组合.提炼出所需要的信息.如果一个查询需要对多个表进行操作,就称为连接查询.连接查询的结果集或结果表,称为表之间的连接连接.查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系数据库查询最主要的特征. 连接查询分为等值连接查询.非等值连接查询.自连接查询.外部连接查询和复合条件连接查询. 10.3.1 等值与非等值连接查询 表之间的连接是通过相等的字段值连接起来的查询称为等值连接查询.可以用两种方式来指定连接条件.下面例