适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
SQL Server 为管理员提供了一种特殊的诊断连接,以供在无法与服务器建立标准连接时使用。 即使在 SQL Server 不响应标准连接请求时,管理员也可以使用此诊断连接访问 SQL Server,以便执行诊断查询并解决问题。
此专用管理员连接 (DAC) 支持 SQL Server的加密功能和其他安全功能。 DAC 只允许将用户上下文切换到其他管理用户。
SQL Server 尝试使 DAC 连接成功,但在极端情况下,它可能不会成功。
通过 DAC 进行连接
默认情况下,只能从服务器上运行的客户端建立连接。 除非使用 sp_configure 存储过程和 远程管理员连接 服务器配置选项来配置网络连接,否则不允许网络连接。
只有 SQL Server sysadmin 角色的成员可以使用 DAC 进行连接。
通过使用专用的管理员开关 (sqlcmd) 的 -A 命令提示实用工具,可以支持和使用 DAC。 有关使用 sqlcmd的详细信息,请参阅 sqlcmd - 与脚本变量一起使用。 还可以将前缀 admin: 连接到实例名上,格式为 sqlcmd -S admin:<instance_name>。 还可以通过连接到 admin:<instance_name>,从 SQL Server Management Studio 查询编辑器启动 DAC。
从 SQL Server Management Studio 建立 DAC:
断开与相关 SQL Server 实例的所有连接,包括对象资源管理器和所有打开的查询窗口。
从菜单中,选择“文件”>“新建”>“数据库引擎查询”
在连接对话框的“服务器名称”字段中,输入
admin:<server_name>(如果使用默认实例)或admin:<server_name>\<instance_name>(如果使用命名实例)。
DAC 端口
SQL Server 在 TCP 端口 1434(如果可用)上侦听 DAC,或者在 数据库引擎 启动时动态分配的 TCP 端口上侦听 DAC。 错误日志包含所侦听的 DAC 所在的端口号。 默认情况下,DAC 侦听器只接受本地端口上的连接。 有关激活远程管理连接的代码示例,请参阅 服务器配置:远程管理员连接。
配置远程管理连接之后,无需重新启动 SQL Server 即可启动 DAC 侦听器,并且客户端可以立即远程连接到 DAC。 通过先在本地使用 DAC 连接到 SQL Server,然后再执行 sp_configure 存储过程接受远程连接,则即使 SQL Server 停止响应,DAC 侦听器仍然可以接受远程连接。
对于群集配置,DAC 在默认情况下是禁用的。 用户可以执行 sp_configure 的“远程管理连接”选项,使 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 -S tcp:<server>,<port>
SQL Server 错误日志列出了 DAC 的端口号,默认情况下为 1434。 如果将 SQL Server 配置为只接受本地 DAC 连接,请使用以下命令和环回适配器进行连接:
sqlcmd -S 127.0.0.1,1434
局限性
由于 DAC 仅用于在极少数情况下诊断服务器问题,因此对连接有一些限制:
为了保证有可用的连接资源,每个 SQL Server实例只允许使用一个 DAC。 如果 DAC 连接已经激活,则通过 DAC 进行连接的任何新请求都将被拒绝,并出现错误 17810。
为了节省资源,SQL Server Express 默认情况下不会侦听 DAC 端口,除非启用了跟踪标志 7806。
DAC 最初尝试连接到与登录帐户关联的默认数据库。 成功连接后,可以连接到
master数据库。 如果默认数据库脱机或不可用,则连接返回错误 4060。 但是,如果使用下面的命令覆盖默认数据库,改为连接到master数据库,则可以成功连接:sqlcmd -A -d master由于只要启动数据库引擎的实例就能保证
master处于可用状态,因此建议使用 DAC 连接到master数据库。SQL Server 禁止使用 DAC 运行并行查询或命令。 例如,如果使用 DAC 执行下列任何语句,都会生成错误 3637。
RESTORE...BACKUP...
DAC 只能使用有限的资源。 不要使用 DAC 来运行资源密集型查询或可以阻止其他查询的查询。 这有助于防止将 DAC 与任何现有的服务器问题混淆。 若要避免潜在的阻塞方案,如果必须运行可能阻止的查询,请在基于快照的隔离级别下运行查询(如果可能);否则,请将事务隔离级别
READ UNCOMMITTED设置为并将该值设置为LOCK_TIMEOUT短值,例如 2000 毫秒或两者。 这可以防止 DAC 会话被阻塞。 但是,根据 SQL Server 所处的状态,DAC 会话可能会在闩锁上被阻塞。 可以使用 CTRL-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 或 Azure SQL 托管实例的情况下重启实例。 下面是一般的指导原则:请通过查询
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,但执行命令后sys.dm_exec_sessions会话将保留在其中KILL,这意味着你没有可用的辅助角色。 选择当前正在运行的任务之一(视图中列出的sys.dm_os_tasks任务为 asessions_id <> NULL),并终止与其关联的会话以释放辅助角色。 它可能不足以终止单个会话:可能需要终止多个会话。
Azure SQL 数据库中的限制
连接到具有 DAC 的 Azure SQL 数据库时,还必须通过使用 -d 选项在连接字符串中指定数据库名称。
Azure SQL 托管实例中的限制
DAC 不适用于 Azure SQL 托管实例的专用终结点。 在 SQL 托管实例上,DAC 侦听端口 1434。 由于 SQL 托管实例的专用终结点仅允许端口 1433 上的连接,因此无法使用专用终结点建立 DAC 连接。 必须与 SQL 托管实例位于同一虚拟网络中才能使用 DAC 进行连接。
例子
在此示例中,管理员发现服务器 contoso-server 不响应,因此要诊断该问题。 为此,用户激活 sqlcmd 命令提示实用工具,并使用 contoso-server 指明 DAC 连接到服务器 -A 。
sqlcmd -S contoso-server -U sa -P <StrongPassword> -A
现在,管理员可以执行查询来诊断问题,并且可以终止停止响应的会话。
连接到 SQL 数据库的类似示例将使用以下命令(包括 -d 参数)来指定数据库:
sqlcmd -S serverName.database.windows.net,1434 -U sa -P <StrongPassword> -d AdventureWorks
相关内容
- 将 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)
- 服务器配置选项
- 与事务有关的动态管理视图和函数 (Transact-SQL)
- 使用 DBCC TRACEON 设置跟踪标志(Transact-SQL)