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