1. 什么是DAC模式
DAC全称为“Database Administrator Connection”,即数据库管理员连接。DAC是在SQL Server 2005中引入的一个特殊的连接模式,用于在系统出现问题时提供一个“紧急通道”,允许DBA连接到实例并诊断和解决问题。DAC模式允许管理员绕过SQL Server上运行的其他进程,以最小的系统资源占用量连接到SQL Server实例。DAC连接不会使用已分配的连接池。
当SQL Server出现问题时,例如由于死锁或其他严重的相关问题导致所有可用连接都已用尽,此时仍可以使用DAC连接到实例,以执行以下任务:
处理已连接到SQL Server实例的会话
启动、停止或暂停SQL Server服务
在内存不足时关闭连接,以释放内存
数据库备份、维护、还原等操作
需要注意的是,在SQL Server 2012中,应该在启用DAC之前,为带有SQL Server的计算机启用远程链接和远程管理。
2. 如何启用DAC模式
要启用DAC连接,需要有管理员权限,在SQL Server配置管理器中进行以下配置:
2.1 配置启用DAC
首先,需要启用DAC连接。为此,在SQL Server配置管理器中的SQL Server网络配置下,选择SQL Server Services。在右侧窗口中,单击SQL Server服务的属性。在常规选项卡中,向下滚动到“区域配置”属性,并将“启用通过管理连接访问此SQL Server”设置为“是”。
EXEC sp_configure 'remote admin connections', 1
RECONFIGURE
另外,如果使用了SQL Server Express,需要使用以下命令进行配置:
EXEC sp_configure 'remote admin connections', 1
GO
RECONFIGURE WITH OVERRIDE
2.2 连接到DAC模式
在启用DAC之后,可以使用SQL Server Management Studio连接到她。在服务器地址前加上“admin:”,即“admin:server_name”,使用管理员帐户连接即可。
为了安全起见,不建议在网络上公开暴露DAC连接,因为它提供了极高的系统权限。取而代之的是,需要使用隧道协议(如VPN)将连接保护起来。
3. 使用DAC模式进行故障排除
3.1 如何查看SQL Server日志
在故障排除过程中,首先应该检查SQL Server错误日志,以查找有关与SQL Server相关的错误、不足和其他提示的信息。这些错误信息包括 SQL Server 本身的早期错误警告、错误消息、死锁异常、索引扫描和其他事件,可以通过SQL Server错误日志文件查看。
SQL Server错误日志文件位于SQL Server安装文件夹(通常是C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log)的ERRORLOG文件中。可以使用以下脚本将SQL Server错误日志文件输出到SSMS客户端:
EXEC sys.xp_readerrorlog
该脚本将输出包括错误、警告、有关还原和文件自动增长、有关服务启动和停止的记录,在故障排除中非常有用。
3.2 如何检查内存和CPU使用情况
在故障排除中,通常需要检查SQL Server的内存和CPU使用情况,也可以在运行速度较慢时进行此操作。在SSMS客户端中,可以通过以下脚本了解SQL服务器的内存使用情况:
SELECT
(SELECT CONVERT(INT, value) FROM sys.dm_os_sys_info WHERE name = 'physical_memory_in_bytes') / 1024 / 1024 AS [Physical Memory (MB)],
(SELECT CONVERT(INT, value) FROM sys.dm_os_sys_info WHERE name = 'committed_kb') / 1024 AS [Committed Memory (MB)],
(SELECT CONVERT(INT, value) FROM sys.dm_os_sys_info WHERE name = 'committed_target_kb') / 1024 AS [Committed Target Memory (MB)],
(SELECT CONVERT(INT, value) FROM sys.dm_os_sys_info WHERE name = 'system_cache_kb') / 1024 AS [System Cache (MB)],
(SELECT CONVERT(INT, value) FROM sys.dm_os_sys_info WHERE name = 'kernel_paged_pool_kb') / 1024 AS [Kernel Paged Pool (MB)],
(SELECT CONVERT(INT, value) FROM sys.dm_os_sys_info WHERE name = 'kernel_nonpaged_pool_kb') / 1024 AS [Kernel Nonpaged Pool (MB)],
(SELECT CONVERT(INT, value) FROM sys.dm_os_sys_info WHERE name = 'max_workers_count') AS [Max Workers Count],
(SELECT CONVERT(INT, value) FROM sys.dm_os_sys_info WHERE name = 'virtual_address_space_reserved_kb') / 1024 AS [Virtual Address Space Reserved (MB)],
(SELECT CONVERT(INT, value) FROM sys.dm_os_sys_info WHERE name = 'virtual_address_space_committed_kb') / 1024 AS [Virtual Address Space Committed (MB)]
可以使用下面的脚本查看SQL Server实例的CPU利用率:
SELECT TOP(1) record_id, dateadd(ms, -1 * (datepart(ms, [timestamp]) % 1000), [timestamp]) AS TimeStamp,
(SELECT CONVERT(INT, (SELECT cntr_value FROM sys.dm_os_performance_counters WHERE counter_name = 'Processor Time %' AND instance_name LIKE '%_Total'))) AS [Processor Time],
(SELECT CONVERT(INT, (SELECT cntr_value FROM sys.dm_os_performance_counters WHERE counter_name = 'SQLServer:SQL Statistics' AND instance_name = '_Total'))) AS [Total SQL Server CPU %],
(SELECT CONVERT(INT, (SELECT cntr_value FROM sys.dm_os_performance_counters WHERE counter_name = 'User Connections' AND instance_name = '_Total'))) AS [User Connections]
FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type = 'RING_BUFFER_SCHEDULER_MONITOR'
AND record_id > 0
ORDER BY record_id DESC
根据这些信息,可以判断SQL Server是否出现了内存或CPU瓶颈。