用于数据库管理员的诊断连接

如果无法与服务器建立标准连接,SQL Server 将为管理员提供特殊的诊断连接。 此诊断连接允许管理员访问 SQL Server 来执行诊断查询,并排查问题,即使 SQL Server 未响应标准连接请求。

此专用管理员连接 (DAC) 支持 SQL Server的加密功能和其他安全功能。 DAC 只允许将用户上下文切换到其他管理用户。

SQL Server 尽力使 DAC 连接成功,但在非常特殊的情况下也可能会出现连接失败。

适用于:SQL Server(SQL Server 2008 到当前版本),SQL 数据库 V12。

使用 DAC 连接

默认情况下,只能从服务器上运行的客户端建立连接。 不允许进行网络连接,除非它们是使用带 remote admin connections 选项的 sp_configure 存储过程配置的。

只有 SQL Server sysadmin 角色的成员可以使用 DAC 进行连接。

通过使用专用的管理员开关 ( -A ) 的sqlcmd命令提示实用工具,可以支持和使用 DAC。 有关使用 sqlcmd 的详细信息,请参阅将 sqlcmd 与脚本变量结合使用。 还可以使用 sqlcmd -Sadmin:<instance_name> 格式将前缀admin:连接到实例名称。还可以通过连接到admin:<instance_name>从 SQL Server Management Studio 查询编辑器启动 DAC。

限制

由于 DAC 仅用于在极少数情况下诊断服务器问题,因此对连接有一些限制:

  • 为了保证有可用的连接资源,每个 SQL Server实例只允许使用一个 DAC。 如果 DAC 连接已经激活,则通过 DAC 进行连接的任何新请求都将被拒绝,并出现错误 17810。

  • 为了节省资源,除非以跟踪标志 7806 开头,否则 SQL Server Express 不会侦听 DAC 端口。

  • DAC 最初尝试连接到与登录帐户关联的默认数据库。 连接成功后,可以连接到 master 数据库。 如果默认数据库脱机或不可用,则连接返回错误 4060。 但是,如果使用以下命令覆盖默认数据库,改为连接到 master 数据库,则连接会成功:

    sqlcmd -A -d master

    建议使用 DAC 连接到 master 数据库,因为如果启动数据库引擎实例,则保证 master 可用。

  • SQL Server 禁止使用 DAC 运行并行查询或命令。 例如,如果使用 DAC 执行下列任何语句,都会生成错误 3637。

    • RESTORE

    • BACKUP

  • DAC 只能使用有限的资源。 请勿使用 DAC 运行资源密集型查询(例如,大型表上的复杂联接)或可能阻止的查询。 这有助于防止将 DAC 与任何现有的服务器问题混淆。 为了避免发生潜在的阻塞情况,如果必须执行可能会发生阻塞的查询,则尽可能在基于快照的隔离级别下运行查询;或者,将事务隔离级别设置为 READ UNCOMMITTED,将 LOCK_TIMEOUT 值设置为较短的值(如 2000 毫秒),或者同时执行这两种操作。 这可以防止 DAC 会话被阻塞。 但是,根据 SQL Server 所处的状态,DAC 会话可能会在闩锁上被阻塞。 可以使用 CNTRL-C 终止 DAC 会话,但不能保证一定成功。 如果失败,唯一的选择是重新启动 SQL Server。

  • 为保证连接成功并排除 DAC 故障, SQL Server 保留了一定的资源用于处理 DAC 上运行的命令。 通常这些资源只够执行简单的诊断和故障排除功能,如下所示。

虽然理论上可以运行任何不必在 DAC 上并行执行的 Transact-SQL 语句,但极力建议你限制使用下列诊断和故障排除命令:

  • 查询动态管理视图以进行基本的诊断,例如查询 sys.dm_tran_locks 以了解锁定状态,查询 sys.dm_os_memory_cache_counters 以检查缓存运行状况,查询 sys.dm_exec_requests 和 sys.dm_exec_sessions 以了解活动的会话和请求。 避免使用需要消耗大量资源的动态管理视图(例如,sys.dm_tran_version_store 扫描整个版本存储区,并且会导致大量的 I/O)或使用复杂联接的动态管理视图。 有关性能影响的信息,请参阅特定 动态管理视图的文档。

  • 查询目录视图。

  • 基本 DBCC 命令,例如 DBCC FREEPROCCACHE、DBCC FREESYSTEMCACHE、DBCC DROPCLEANBUFFERS, 和 DBCC SQLPERF。 请勿运行需要消耗大量资源的命令,如 DBCC CHECKDB、DBCC DBREINDEX 或 DBCC SHRINKDATABASE。

  • Transact-SQL KILL*<spid>* 命令。 根据 SQL Server的状态,KILL 命令并非一定会成功;如果失败,则唯一的选择是重新启动 SQL Server。 下面是一般的指导原则:

    • 请通过查询 SELECT * FROM sys.dm_exec_sessions WHERE session_id = <spid>来验证 SPID 是否已被实际终止。 如果没有返回任何行,则表明会话已被终止。

    • 如果会话仍在运行,则通过运行查询 SELECT * FROM sys.dm_os_tasks WHERE session_id = <spid>来验证是否为此会话分配了任务。 如果发现还有任务,则很可能当前正在终止会话。 注意,此操作可能会持续很长时间,也可能根本不会成功。

    • 如果在与此会话关联的 sys.dm_os_tasks 中没有任何任务,但是在执行 KILL 命令后该会话仍然出现在 sys.dm_exec_sessions 中,则表明没有可用的工作线程。 选择某个当前正在运行的任务(在 sys.dm_os_tasks 视图中列出的 sessions_id <> NULL的任务),并终止与其关联的会话以释放工作线程。 请注意,终止单个会话可能不够,可能需要终止多个会话。

DAC 端口

SQL Server 在 TCP 端口 1434(如果可用)上侦听 DAC,或者在 数据库引擎 启动时动态分配的 TCP 端口上侦听 DAC。 错误日志包含所侦听的 DAC 所在的端口号。 默认情况下,DAC 侦听器只接受本地端口上的连接。 有关激活远程管理连接的代码示例的详细信息,请参阅 remote admin connections 服务器配置选项

配置远程管理连接后,将启用 DAC 侦听器,无需重启 SQL Server,客户端现在可以远程连接到 DAC。 即使 SQL Server 在本地使用 DAC 连接到 SQL Server,然后执行sp_configure存储过程以接受来自远程连接的连接,也可以使 DAC 侦听器能够远程接受连接。

对于群集配置,DAC 在默认情况下是禁用的。 用户可以执行 sp_configure 的 remote admin connection 选项,使 DAC 侦听器能够访问远程连接。 如果 SQL Server 无响应且 DAC 侦听器未启用,则可能需要重启 SQL Server 才能与 DAC 连接。 因此,建议在群集系统上启用 remote admin connections 配置选项。

DAC 端口由 SQL Server 在启动时动态分配。 当连接到默认实例时,DAC 会避免在连接时对 SQL Server Browser 服务使用 SQL Server 解决协议 (SSRP) 请求。 它先通过 TCP 端口 1434 进行连接。 如果失败,则通过 SSRP 调用来获取端口。 如果 SQL Server Browser 未侦听 SSRP 请求,连接请求将返回错误。 若要了解 DAC 所侦听的端口号,请参阅错误日志。 如果将 SQL Server 配置为接受远程管理连接,则必须使用显式端口号启动 DAC:

sqlcmd-Stcp: <server,port><>

SQL Server 错误日志列出了 DAC 的端口号,默认情况下为 1434。 如果将 SQL Server 配置为只接受本地 DAC 连接,请使用以下命令和环回适配器进行连接:

sqlcmd-S127.0.0.11434

示例

在此示例中,管理员发现服务器 URAN123 不响应,因此要诊断该问题。 为此,用户激活 sqlcmd 命令提示实用工具,并使用 URAN123 指明 DAC 连接到服务器 -A

sqlcmd -S URAN123 -U sa -P <xxx> -A

现在,管理员可以执行查询来诊断问题,并且可以终止停止响应的会话。

将 sqlcmd 与脚本变量结合使用

sqlcmd 实用工具

SELECT (Transact-SQL)

sp_who (Transact-SQL)

sp_lock (Transact-SQL)

KILL (Transact-SQL)

DBCC CHECKALLOC (Transact-SQL)

DBCC CHECKDB (Transact-SQL)

DBCC OPENTRAN (Transact-SQL)

DBCC INPUTBUFFER (Transact-SQL)

服务器配置选项 (SQL Server)

与事务有关的动态管理视图和函数 (Transact-SQL)

跟踪标志 (Transact-SQL)