我怎么知道什么需要 DAC?

Eva*_*oll 3 sql-server dac

在玩 SQL Server 时,我遇到了一个半隐秘的错误。本质上,我只需要登录 DAC。对于何时需要 DAC,是否有任何一般性建议?我怎么知道我需要它来访问sys.sysobjvalues而不用谷歌搜索错误消息?

DAC 提供哪些访问权限?

小智 5

DAC(专用管理连接)是(元数据工具)仅用于故障排除目的。如果您无法访问或连接到 SQL Server ,SQL Server DBA会将其用作最后的手段。在某些情况下,某个进程或某人试图使用您所有的系统内存和 CPU,而没有人可以使用 SQL Server(没有新进程可以连接)。

DAC 内置于 SQL Server 2005 中,因为在 SQL Server 2005 之前,如果我们无法访问/连接到 SQL Server,我们要么终止所有会话并重新启动 SQL Server。在 SQL Server 2005 中,Microsoft 决定创建 DAC 用于故障排除(后门)。

当我们作为 DAC(特殊连接)连接时,我们得到了专用处理器(调度程序)和一个保留内存来运行简单的查询。我们需要系统管理员权限才能连接。我们只能通过登录本地服务器进行本地连接并连接(除非您需要对需要远程DAC的集群或AG进行故障排除)。只有 1 个会话可以在 SQL Server 中作为 DAC 连接,在我们断开 DAC 会话之前,没有人可以作为 DAC 连接。

我们可以通过查询来检查是否有人正在使用 DAC:

SELECT dese.session_id
FROM sys.tcp_endpoints as te
JOIN sys.dm_exec_sessions as dese ON te.endpoint_id = dese.endpoint_id
WHERE te.name ='Dedicated Admin Connection';
Run Code Online (Sandbox Code Playgroud)

当我们连接为 DAC 时,我们可以做什么:

  1. 访问隐藏的系统表(如 sys.sysobjvalues)
  2. 运行简单的查询以进行故障排除
  3. 高级故障排除(如修复损坏的系统表页)

我们不能做的:

  1. 运行复杂查询(禁止并行)
  2. 备份/恢复操作

我们无法在正常连接下查询系统表。

尝试

SELECT * FROM sys.objects WHERE type_desc='SYSTEM_TABLE';
Run Code Online (Sandbox Code Playgroud). 这些是您无法在正常连接中查询的表。 在此处输入图片说明

当我们作为 DAC 连接时,您可以访问系统表(例如 sys.sysrscols) 在此处输入图片说明

最后,作为最佳实践,使用后始终断开 DAC 连接。

我会建议使用SSMS读的书有关SQL Server的内部故障排除的SQL Server。它不是 SQL Server 2017 特定的,但大多数概念仍然适用于当前版本的 SQL Server。

来自微软

重要提示:系统基表仅在 SQL Server 数据库引擎中使用,不供一般客户使用。它们可能会发生变化,并且不保证兼容性。

使用 DAC 访问系统基表仅适用于 Microsoft 人员,它不是受支持的客户方案。