以下按 SQL Server 2012--2022(Windows / Linux) 整理,共 500 条,按 14 类连续编号。默认以 sqlcmd 执行 T-SQL;标注"2016+ / 2017+ / 2019+"的条目需目标版本支持,低版本请跳过或改用等价 DMV。
说明:数据库名、文件路径、登录名等请替换为实际值;生产环境执行
DBCC、RESTORE、SHRINK类命令前先评估影响。
一、实例与版本基础信息(1--35)
- 查看完整版本:
SELECT @@VERSION; - 版本号/补丁级别/版本类型:
SELECT SERVERPROPERTY('ProductVersion') AS product_version, SERVERPROPERTY('ProductLevel') AS product_level, SERVERPROPERTY('Edition') AS edition, SERVERPROPERTY('EngineEdition') AS engine_edition; - 实例名与主机名:
SELECT SERVERPROPERTY('ServerName') AS server_name, SERVERPROPERTY('InstanceName') AS instance_name, SERVERPROPERTY('MachineName') AS machine_name; - 实例排序规则:
SELECT SERVERPROPERTY('Collation') AS server_collation, DATABASEPROPERTYEX(N'master', N'Collation') AS master_collation; - 是否集群/是否启用 AlwaysOn:
SELECT SERVERPROPERTY('IsClustered') AS is_clustered, SERVERPROPERTY('IsHadrEnabled') AS is_hadr_enabled; - 启动时间与运行时长:
SELECT sqlserver_start_time, DATEDIFF(HOUR, sqlserver_start_time, GETDATE()) AS uptime_hours FROM sys.dm_os_sys_info; - CPU 核数与调度器:
SELECT cpu_count, scheduler_count, max_workers_count, hyperthread_ratio FROM sys.dm_os_sys_info; - 物理内存与提交内存:
SELECT physical_memory_kb/1024 AS physical_mb, committed_kb/1024 AS committed_mb, committed_target_kb/1024 AS target_mb FROM sys.dm_os_sys_info; - 进程工作集与大页内存:
SELECT physical_memory_in_use_kb/1024 AS working_set_mb, large_page_allocations_kb/1024 AS large_page_mb, locked_page_allocations_kb/1024 AS locked_page_mb FROM sys.dm_os_process_memory; - 服务状态:
SELECT servicename, startup_type_desc, status_desc, service_account, last_startup_time, is_clustered FROM sys.dm_server_services; - 服务可执行文件路径:
SELECT servicename, filename FROM sys.dm_server_services; - 实例注册表信息:
SELECT * FROM sys.dm_server_registry WHERE registry_key LIKE N'%MSSQLServer%'; - 数据库清单:
SELECT name, database_id, state_desc, recovery_model_desc, compatibility_level, collation_name FROM sys.databases ORDER BY database_id; - 数据库状态统计:
SELECT state_desc, COUNT(*) AS db_count FROM sys.databases GROUP BY state_desc; - 兼容级别分布:
SELECT compatibility_level, COUNT(*) AS db_count FROM sys.databases GROUP BY compatibility_level; - 实例配置概览:
SELECT name, value, value_in_use, is_dynamic, is_advanced FROM sys.configurations ORDER BY name; - 启动参数:
SELECT * FROM sys.dm_server_registry WHERE registry_key LIKE N'%Parameters%'; - 错误日志路径:
SELECT SERVERPROPERTY('ErrorLogFileName') AS errorlog_path; - 默认备份目录:
SELECT SERVERPROPERTY('InstanceDefaultBackupPath') AS backup_path; - 默认数据/日志目录:
SELECT SERVERPROPERTY('InstanceDefaultDataPath') AS data_path, SERVERPROPERTY('InstanceDefaultLogPath') AS log_path; - 当前连接端口与加密:
SELECT local_tcp_port, net_transport, auth_scheme, encrypt_option FROM sys.dm_exec_connections WHERE session_id = @@SPID; - TCP 端点:
SELECT name, protocol_desc, type_desc, port, is_admin_endpoint FROM sys.tcp_endpoints; - 端点状态:
SELECT name, protocol_desc, state_desc, is_admin_endpoint FROM sys.endpoints; - 当前会话身份:
SELECT @@SPID AS spid, SUSER_SNAME() AS login_name, DB_NAME() AS dbname, @@SERVERNAME AS server_name; - 本地时间与 UTC:
SELECT SYSDATETIME() AS local_time, SYSDATETIMEOFFSET() AS local_offset, GETUTCDATE() AS utc_time; - 语言与区域:
SELECT @@LANGUAGE AS language, SERVERPROPERTY('LCID') AS lcid; - 授权信息:
SELECT SERVERPROPERTY('LicenseType') AS license_type, SERVERPROPERTY('NumLicenses') AS num_licenses; - 引擎形态(5=Azure SQL DB,8=托管实例):
SELECT SERVERPROPERTY('EngineEdition') AS engine_edition; - 资源调控器配置:
SELECT * FROM sys.resource_governor_configuration; - 资源池:
SELECT pool_id, name, min_cpu_percent, max_cpu_percent, cap_cpu_percent, min_memory_percent, max_memory_percent FROM sys.dm_resource_governor_resource_pools; - 工作负载组:
SELECT group_id, name, pool_id, importance, max_dop FROM sys.dm_resource_governor_workload_groups; - 跟踪标志状态:
DBCC TRACESTATUS(-1) WITH NO_INFOMSGS; - 用户连接上限:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'user connections'; - 最大工作线程:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'max worker threads'; - 会话总数与用户会话数:
SELECT COUNT(*) AS session_count, SUM(CASE WHEN is_user_process = 1 THEN 1 ELSE 0 END) AS user_sessions FROM sys.dm_exec_sessions;
二、配置参数与实例设置(36--70)
- 最小/最大服务器内存:
SELECT name, value, value_in_use FROM sys.configurations WHERE name IN (N'min server memory (MB)', N'max server memory (MB)'); - 最大并行度:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'max degree of parallelism'; - 并行开销阈值:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'cost threshold for parallelism'; - 即席工作负载优化:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'optimize for ad hoc workloads'; - 默认备份压缩:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'backup compression default'; - 恢复间隔:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'recovery interval (min)'; - 远程登录超时:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'remote login timeout (s)'; - 远程查询超时:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'remote query timeout (s)'; - 最大锁数:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'locks'; - 阻塞进程阈值:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'blocked process threshold (s)'; - 默认跟踪:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'default trace enabled'; - 网络包大小:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'network packet size (B)'; - 默认填充因子:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'fill factor (%)'; - 轻量池:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'lightweight pooling'; - 优先级提升:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'priority boost'; - 自动创建统计信息:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'auto create statistics'; - 自动更新统计信息:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'auto update statistics'; - 异步更新统计信息:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'auto update statistics asynchronously'; - 游标阈值:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'cursor threshold'; - 嵌套触发器:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'nested triggers'; - 递归触发器:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'recursive triggers'; - CLR 启用状态:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'clr enabled'; - 即席分布式查询:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'Ad Hoc Distributed Queries'; - xp_cmdshell 状态:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'xp_cmdshell'; - OLE 自动化:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'Ole Automation Procedures'; - 数据库邮件:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'Database Mail XPs'; - 代理扩展:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'Agent XPs'; - 高级选项可见性:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'show advanced options'; - 全文检索是否安装:
SELECT SERVERPROPERTY('IsFullTextInstalled') AS is_fulltext_installed; - 运行值与配置值不一致项:
SELECT name, value, value_in_use, is_dynamic FROM sys.configurations WHERE value <> value_in_use; - 服务账号与权限核对:
SELECT servicename, service_account FROM sys.dm_server_services WHERE servicename LIKE N'SQL Server%'; - 默认跟踪中的配置/对象变更:
DECLARE @p nvarchar(260); SELECT @p = CAST(value AS nvarchar(260)) FROM sys.fn_trace_getinfo(NULL) WHERE traceid = 1 AND property = 2; SELECT * FROM sys.fn_trace_gettable(@p, DEFAULT) WHERE EventClass IN (46,47,164,92,93,94,95); - 最大内存占物理内存比例:
SELECT CAST(value_in_use AS decimal(10,2))*100.0/(physical_memory_kb/1024) AS max_mem_pct FROM sys.configurations CROSS JOIN sys.dm_os_sys_info WHERE name = N'max server memory (MB)'; - 并行相关配置组合:
SELECT name, value_in_use FROM sys.configurations WHERE name IN (N'max degree of parallelism', N'cost threshold for parallelism', N'max worker threads'); - 高风险安全配置组合:
SELECT name, value_in_use FROM sys.configurations WHERE name IN (N'xp_cmdshell', N'Ole Automation Procedures', N'Ad Hoc Distributed Queries', N'clr enabled');
三、数据库状态与容量空间(71--110)
- 数据库状态总览:
SELECT name, state_desc, user_access_desc, is_read_only, is_in_standby FROM sys.databases ORDER BY name; - 非在线数据库:
SELECT name, state_desc FROM sys.databases WHERE state <> 0; - 只读数据库:
SELECT name FROM sys.databases WHERE is_read_only = 1; - 自动关闭数据库:
SELECT name FROM sys.databases WHERE is_auto_close_on = 1; - 自动收缩数据库:
SELECT name FROM sys.databases WHERE is_auto_shrink_on = 1; - 页面校验方式:
SELECT name, page_verify_option_desc FROM sys.databases; - 快照隔离状态:
SELECT name, snapshot_isolation_state_desc FROM sys.databases; - 已提交读快照:
SELECT name, is_read_committed_snapshot_on FROM sys.databases; - 延迟持久化(2014+):
SELECT name, delayed_durability_desc FROM sys.databases; - 包含数据库:
SELECT name, containment_desc FROM sys.databases; - 用户访问模式:
SELECT name, user_access_desc FROM sys.databases; - 数据库完整属性:
SELECT * FROM sys.databases ORDER BY database_id; - 数据库总大小排名:
SELECT DB_NAME(database_id) AS dbname, SUM(size)*8/1024 AS total_mb FROM sys.master_files GROUP BY database_id ORDER BY total_mb DESC; - 数据文件大小:
SELECT DB_NAME(database_id) AS dbname, name, size*8/1024 AS size_mb FROM sys.master_files WHERE type_desc = N'ROWS'; - 日志文件大小:
SELECT DB_NAME(database_id) AS dbname, name, size*8/1024 AS size_mb FROM sys.master_files WHERE type_desc = N'LOG'; - 每库数据与日志汇总:
SELECT DB_NAME(database_id) AS dbname, SUM(CASE WHEN type_desc = N'ROWS' THEN size END)*8/1024 AS data_mb, SUM(CASE WHEN type_desc = N'LOG' THEN size END)*8/1024 AS log_mb FROM sys.master_files GROUP BY database_id; - 文件已用与剩余空间:
SELECT DB_NAME(database_id) AS dbname, name, size*8/1024 AS size_mb, FILEPROPERTY(name,'SpaceUsed')*8/1024 AS used_mb, (size-FILEPROPERTY(name,'SpaceUsed'))*8/1024 AS free_mb FROM sys.master_files; - 文件空间使用率:
SELECT DB_NAME(database_id) AS dbname, name, CAST(FILEPROPERTY(name,'SpaceUsed')*100.0/NULLIF(size,0) AS decimal(5,2)) AS used_pct FROM sys.master_files; - 卷剩余空间:
SELECT DISTINCT DB_NAME(mf.database_id) AS dbname, vs.volume_mount_point, vs.total_bytes/1073741824 AS total_gb, vs.available_bytes/1073741824 AS free_gb FROM sys.master_files mf CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.file_id) vs; - 卷剩余百分比:
SELECT DISTINCT vs.volume_mount_point, CAST(100.0*vs.available_bytes/NULLIF(vs.total_bytes,0) AS decimal(5,2)) AS free_pct FROM sys.master_files mf CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.file_id) vs; - tempdb 总大小:
SELECT SUM(size)*8/1024 AS tempdb_mb FROM tempdb.sys.database_files; - tempdb 文件明细:
SELECT name, physical_name, size*8/1024 AS size_mb, growth, is_percent_growth FROM tempdb.sys.database_files; - tempdb 版本存储空间:
SELECT * FROM sys.dm_tran_version_store_space_usage; - tempdb 会话占用:
SELECT session_id, user_objects_alloc_page_count*8/1024 AS user_mb, internal_objects_alloc_page_count*8/1024 AS internal_mb FROM tempdb.sys.dm_db_session_space_usage ORDER BY user_objects_alloc_page_count DESC; - tempdb 任务占用:
SELECT session_id, request_id, user_objects_alloc_page_count*8/1024 AS user_mb, internal_objects_alloc_page_count*8/1024 AS internal_mb FROM tempdb.sys.dm_db_task_space_usage ORDER BY internal_objects_alloc_page_count DESC; - 表空间占用 Top20:
SELECT TOP 20 OBJECT_SCHEMA_NAME(p.object_id)+'.'+OBJECT_NAME(p.object_id) AS table_name, SUM(p.used_page_count)*8/1024 AS used_mb FROM sys.dm_db_partition_stats p GROUP BY p.object_id ORDER BY used_mb DESC; - 表行数 Top20:
SELECT TOP 20 OBJECT_SCHEMA_NAME(object_id)+'.'+OBJECT_NAME(object_id) AS table_name, SUM(row_count) AS row_count FROM sys.dm_db_partition_stats WHERE index_id IN (0,1) GROUP BY object_id ORDER BY row_count DESC; - 分区行数与页数:
SELECT OBJECT_NAME(object_id) AS table_name, partition_number, row_count, used_page_count FROM sys.dm_db_partition_stats WHERE index_id IN (0,1) ORDER BY object_id, partition_number; - 分配单元统计:
SELECT type_desc, COUNT(*) AS allocation_units, SUM(total_pages)*8/1024 AS total_mb FROM sys.allocation_units GROUP BY type_desc; - 文件最大大小设置:
SELECT DB_NAME(database_id) AS dbname, name, max_size, CASE WHEN max_size = -1 THEN 'UNLIMITED' WHEN max_size = 0 THEN 'NOGROWTH' ELSE CAST(max_size*8/1024 AS varchar(20))+' MB' END AS max_size_desc FROM sys.master_files; - 文件增长设置:
SELECT DB_NAME(database_id) AS dbname, name, growth, is_percent_growth FROM sys.master_files; - 百分比增长或禁止增长:
SELECT DB_NAME(database_id) AS dbname, name, growth, is_percent_growth FROM sys.master_files WHERE is_percent_growth = 1 OR growth = 0; - 文件所在卷:
SELECT DISTINCT DB_NAME(mf.database_id) AS dbname, mf.name, vs.volume_mount_point FROM sys.master_files mf CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.file_id) vs; - 日志空间使用(所有库):
DBCC SQLPERF(LOGSPACE) WITH NO_INFOMSGS; - 日志空间 DMV:
SELECT DB_NAME(database_id) AS dbname, total_log_size_in_bytes/1048576 AS total_mb, used_log_space_in_bytes/1048576 AS used_mb, used_log_space_in_percent FROM sys.dm_db_log_space_usage; - VLF 数量与大小(2016 SP2+):
SELECT DB_NAME(database_id) AS dbname, COUNT(*) AS vlf_count, SUM(vlf_size_mb) AS vlf_total_mb FROM sys.dm_db_log_info(NULL) GROUP BY database_id; - 日志统计(2016 SP2+):
SELECT DB_NAME(database_id) AS dbname, recovery_model, total_vlf_count, active_vlf_count, active_log_size_mb, log_truncation_holdup_reason FROM sys.dm_db_log_stats(NULL); - 日志截断等待原因:
SELECT name, log_reuse_wait_desc FROM sys.databases; - VLF 明细:
DBCC LOGINFO WITH NO_INFOMSGS; - 数据库快照:
SELECT name, source_database_id, snapshot_isolation_state_desc FROM sys.databases WHERE source_database_id IS NOT NULL;
四、文件、日志与恢复模式管理(111--150)
- 恢复模式总览:
SELECT name, recovery_model_desc FROM sys.databases; - 简单恢复模式业务库:
SELECT name FROM sys.databases WHERE recovery_model_desc = N'SIMPLE' AND database_id > 4; - 大容量日志模式库:
SELECT name FROM sys.databases WHERE recovery_model_desc = N'BULK_LOGGED'; - 完整模式但近 7 天无日志备份:
SELECT d.name FROM sys.databases d WHERE d.recovery_model_desc = N'FULL' AND d.database_id > 4 AND NOT EXISTS (SELECT 1 FROM msdb.dbo.backupset bs WHERE bs.database_name = d.name AND bs.type = 'L' AND bs.backup_finish_date >= DATEADD(DAY,-7,GETDATE())); - 日志文件增长设置:
SELECT DB_NAME(database_id) AS dbname, name, growth, is_percent_growth FROM sys.master_files WHERE type_desc = N'LOG'; - 数据文件增长设置:
SELECT DB_NAME(database_id) AS dbname, name, growth, is_percent_growth FROM sys.master_files WHERE type_desc = N'ROWS'; - 百分比自动增长文件:
SELECT DB_NAME(database_id) AS dbname, name, growth FROM sys.master_files WHERE is_percent_growth = 1; - 增长值小于 64MB:
SELECT DB_NAME(database_id) AS dbname, name, growth*8/1024 AS growth_mb FROM sys.master_files WHERE is_percent_growth = 0 AND growth > 0 AND growth < 8192; - 无最大大小限制:
SELECT DB_NAME(database_id) AS dbname, name FROM sys.master_files WHERE max_size = -1; - 数据与日志同卷:
SELECT vs.volume_mount_point, COUNT(DISTINCT mf.type_desc) AS file_types FROM sys.master_files mf CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.file_id) vs GROUP BY vs.volume_mount_point HAVING COUNT(DISTINCT mf.type_desc) > 1; - 文件物理路径清单:
SELECT DB_NAME(database_id) AS dbname, name, physical_name FROM sys.master_files; - 文件组:
SELECT name, type_desc, is_default, is_read_only FROM sys.filegroups; - 文件组与文件分布:
SELECT fg.name AS filegroup_name, mf.name AS file_name, mf.size*8/1024 AS size_mb FROM sys.filegroups fg JOIN sys.master_files mf ON fg.data_space_id = mf.data_space_id AND mf.database_id = DB_ID(); - 只读文件组:
SELECT name FROM sys.filegroups WHERE is_read_only = 1; - 文件平均读延迟:
SELECT DB_NAME(vfs.database_id) AS dbname, mf.physical_name, CASE WHEN vfs.num_of_reads = 0 THEN 0 ELSE vfs.io_stall_read_ms/vfs.num_of_reads END AS avg_read_ms FROM sys.dm_io_virtual_file_stats(NULL,NULL) vfs JOIN sys.master_files mf ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id ORDER BY avg_read_ms DESC; - 文件平均写延迟:
SELECT DB_NAME(vfs.database_id) AS dbname, mf.physical_name, CASE WHEN vfs.num_of_writes = 0 THEN 0 ELSE vfs.io_stall_write_ms/vfs.num_of_writes END AS avg_write_ms FROM sys.dm_io_virtual_file_stats(NULL,NULL) vfs JOIN sys.master_files mf ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id ORDER BY avg_write_ms DESC; - 文件吞吐量:
SELECT DB_NAME(vfs.database_id) AS dbname, mf.physical_name, vfs.num_of_bytes_read/1048576 AS read_mb, vfs.num_of_bytes_written/1048576 AS write_mb FROM sys.dm_io_virtual_file_stats(NULL,NULL) vfs JOIN sys.master_files mf ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id ORDER BY vfs.io_stall DESC; - IO 等待最严重文件:
SELECT TOP 10 DB_NAME(vfs.database_id) AS dbname, mf.physical_name, vfs.io_stall AS total_stall_ms, vfs.io_stall_read_ms, vfs.io_stall_write_ms FROM sys.dm_io_virtual_file_stats(NULL,NULL) vfs JOIN sys.master_files mf ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id ORDER BY vfs.io_stall DESC; - 待处理 IO 请求:
SELECT COUNT(*) AS pending_io, MAX(io_pending_ms_ticks) AS max_pending_ms FROM sys.dm_io_pending_io_requests; - 文件 IO 按数据库汇总:
SELECT DB_NAME(database_id) AS dbname, SUM(num_of_reads) AS reads, SUM(num_of_writes) AS writes, SUM(io_stall) AS total_stall_ms FROM sys.dm_io_virtual_file_stats(NULL,NULL) GROUP BY database_id ORDER BY total_stall_ms DESC; - 可疑页数量:
SELECT DB_NAME(database_id) AS dbname, COUNT(*) AS suspect_pages FROM msdb.dbo.suspect_pages GROUP BY database_id; - 文件只读/稀疏属性:
SELECT DB_NAME(database_id) AS dbname, name, is_media_read_only, is_read_only, is_sparse FROM sys.master_files; - 缓冲池脏页总数:
SELECT COUNT(*) AS dirty_pages FROM sys.dm_os_buffer_descriptors WHERE is_modified = 1; - 每库脏页数量:
SELECT DB_NAME(database_id) AS dbname, COUNT(*) AS dirty_pages FROM sys.dm_os_buffer_descriptors WHERE is_modified = 1 GROUP BY database_id ORDER BY dirty_pages DESC; - 每库缓冲页占比:
SELECT DB_NAME(database_id) AS dbname, COUNT(*)*8/1024 AS cached_mb FROM sys.dm_os_buffer_descriptors GROUP BY database_id ORDER BY cached_mb DESC; - 日志写入等待:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type = N'WRITELOG'; - 日志文件刷新延迟:
SELECT DB_NAME(vfs.database_id) AS dbname, mf.physical_name, vfs.io_stall_write_ms, vfs.num_of_writes FROM sys.dm_io_virtual_file_stats(NULL,NULL) vfs JOIN sys.master_files mf ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id WHERE mf.type_desc = N'LOG' ORDER BY vfs.io_stall_write_ms DESC; - 日志自动增长事件:
DECLARE @p nvarchar(260); SELECT @p = CAST(value AS nvarchar(260)) FROM sys.fn_trace_getinfo(NULL) WHERE traceid = 1 AND property = 2; SELECT * FROM sys.fn_trace_gettable(@p, DEFAULT) WHERE EventClass = 93; - 数据文件自动增长事件:
DECLARE @p nvarchar(260); SELECT @p = CAST(value AS nvarchar(260)) FROM sys.fn_trace_getinfo(NULL) WHERE traceid = 1 AND property = 2; SELECT * FROM sys.fn_trace_gettable(@p, DEFAULT) WHERE EventClass = 92; - 文件自动收缩事件:
DECLARE @p nvarchar(260); SELECT @p = CAST(value AS nvarchar(260)) FROM sys.fn_trace_getinfo(NULL) WHERE traceid = 1 AND property = 2; SELECT * FROM sys.fn_trace_gettable(@p, DEFAULT) WHERE EventClass IN (94,95); - 数据库所有者:
SELECT name, SUSER_SNAME(owner_sid) AS owner FROM sys.databases; - 数据库创建时间:
SELECT name, create_date FROM sys.databases ORDER BY create_date; - 每库最后全备时间:
SELECT d.name, MAX(bs.backup_finish_date) AS last_full FROM sys.databases d LEFT JOIN msdb.dbo.backupset bs ON d.name = bs.database_name AND bs.type = 'D' GROUP BY d.name; - 每库最后日志备份时间:
SELECT d.name, MAX(bs.backup_finish_date) AS last_log FROM sys.databases d LEFT JOIN msdb.dbo.backupset bs ON d.name = bs.database_name AND bs.type = 'L' GROUP BY d.name; - 从未备份的数据库:
SELECT d.name FROM sys.databases d WHERE d.database_id > 4 AND NOT EXISTS (SELECT 1 FROM msdb.dbo.backupset bs WHERE bs.database_name = d.name AND bs.type = 'D'); - 备份链完整性检查:
SELECT d.name, MAX(CASE WHEN bs.type='D' THEN bs.backup_finish_date END) AS last_full, MAX(CASE WHEN bs.type='L' THEN bs.backup_finish_date END) AS last_log FROM sys.databases d LEFT JOIN msdb.dbo.backupset bs ON d.name = bs.database_name GROUP BY d.name HAVING MAX(CASE WHEN bs.type='D' THEN bs.backup_finish_date END) IS NULL OR MAX(CASE WHEN bs.type='L' THEN bs.backup_finish_date END) < DATEADD(DAY,-1,GETDATE()); - 恢复模式与备份策略匹配:
SELECT name, recovery_model_desc, log_reuse_wait_desc FROM sys.databases WHERE database_id > 4; - 数据库兼容级别:
SELECT name, compatibility_level FROM sys.databases ORDER BY compatibility_level; - 数据库排序规则:
SELECT name, collation_name FROM sys.databases; - 排序规则与实例不一致:
SELECT name, collation_name FROM sys.databases WHERE collation_name <> CONVERT(sysname, SERVERPROPERTY('Collation'));
五、错误日志与诊断日志(151--180)
- 读取当前错误日志:
EXEC sys.xp_readerrorlog 0, 1, NULL, NULL, NULL, NULL, N'DESC'; - 错误日志中的 Error 记录:
EXEC sys.xp_readerrorlog 0, 1, N'Error', NULL, NULL, NULL, N'DESC'; - 操作系统 I/O 错误:
EXEC sys.xp_readerrorlog 0, 1, N'operating system error', NULL, NULL, NULL, N'DESC'; - 内存相关错误:
EXEC sys.xp_readerrorlog 0, 1, N'memory', NULL, NULL, NULL, N'DESC'; - 登录失败:
EXEC sys.xp_readerrorlog 0, 1, N'Login failed', NULL, NULL, NULL, N'DESC'; - 死锁记录:
EXEC sys.xp_readerrorlog 0, 1, N'deadlock', NULL, NULL, NULL, N'DESC'; - 备份失败:
EXEC sys.xp_readerrorlog 0, 1, N'BACKUP failed', NULL, NULL, NULL, N'DESC'; - 损坏相关记录:
EXEC sys.xp_readerrorlog 0, 1, N'corrupt', NULL, NULL, NULL, N'DESC'; - 还原记录:
EXEC sys.xp_readerrorlog 0, 1, N'RESTORE', NULL, NULL, NULL, N'DESC'; - 错误日志轮转列表:
EXEC sys.xp_enumerrorlogs; - 错误日志文件大小(Windows):
Get-ChildItem 'C:\Program Files\Microsoft SQL Server\MSSQL*\MSSQL\Log\ERRORLOG*' | Select-Object Name,Length,LastWriteTime;Linux:ls -lh /var/opt/mssql/log/errorlog* - 默认跟踪文件:
SELECT * FROM sys.traces WHERE is_default = 1; - 默认跟踪内容:
DECLARE @p nvarchar(260); SELECT @p = CAST(value AS nvarchar(260)) FROM sys.fn_trace_getinfo(NULL) WHERE traceid = 1 AND property = 2; SELECT * FROM sys.fn_trace_gettable(@p, DEFAULT); - Agent 错误日志:
EXEC sys.xp_readerrorlog 0, 2, NULL, NULL, NULL, NULL, N'DESC'; - Agent 日志中的作业失败:
EXEC sys.xp_readerrorlog 0, 2, N'failed', NULL, NULL, NULL, N'DESC'; - Windows 应用程序日志(MSSQLSERVER):
Get-WinEvent -FilterHashtable @{LogName='Application'; ProviderName='MSSQLSERVER'} -MaxEvents 100 - Windows 系统日志:
Get-WinEvent -LogName System -MaxEvents 100 - Linux 服务日志:
sudo journalctl -u mssql-server -n 200 --no-pager - Linux 错误日志:
sudo tail -n 200 /var/opt/mssql/log/errorlog - Linux 日志中的错误关键字:
sudo grep -iE 'error|fail|corrupt' /var/opt/mssql/log/errorlog | tail -100 - Linux 内核 OOM 记录:
sudo dmesg -T | grep -iE 'oom|killed process' - 扩展事件会话列表:
SELECT s.name, s.start_time, t.target_name, CAST(t.target_data AS xml) AS target_data FROM sys.dm_xe_sessions s JOIN sys.dm_xe_session_targets t ON s.address = t.event_session_address; - 扩展事件目标:
SELECT s.name, t.target_name, t.file_name FROM sys.dm_xe_sessions s JOIN sys.dm_xe_session_targets t ON s.address = t.event_session_address; - system_health 会话状态:
SELECT name, create_time FROM sys.dm_xe_sessions WHERE name = N'system_health'; - system_health 环形缓冲区:
SELECT CAST(t.target_data AS xml) AS target_data FROM sys.dm_xe_session_targets t JOIN sys.dm_xe_sessions s ON t.event_session_address = s.address WHERE s.name = N'system_health' AND t.target_name = N'ring_buffer'; - 连接环形缓冲区:
SELECT CAST(record AS xml) AS rb FROM sys.dm_os_ring_buffers WHERE ring_buffer_type = N'RING_BUFFER_CONNECTIVITY'; - 调度器监视环形缓冲区:
SELECT CAST(record AS xml) AS rb FROM sys.dm_os_ring_buffers WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'; - 资源监视环形缓冲区:
SELECT CAST(record AS xml) AS rb FROM sys.dm_os_ring_buffers WHERE ring_buffer_type = N'RING_BUFFER_RESOURCE_MONITOR'; - 内存不足环形缓冲区:
SELECT CAST(record AS xml) AS rb FROM sys.dm_os_ring_buffers WHERE ring_buffer_type = N'RING_BUFFER_OOM'; - 可疑页明细:
SELECT database_id, file_id, page_id, event_type, error_count, last_update_date FROM msdb.dbo.suspect_pages ORDER BY last_update_date DESC;
六、CPU / 内存 / IO 性能(181--235)
- 实例 CPU 使用率:
SELECT TOP 5 record.value('(./Record/@id)[1]','int') AS record_id, 100 - record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]','int') AS cpu_usage_pct FROM (SELECT CONVERT(xml, record) AS record FROM sys.dm_os_ring_buffers WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' AND record LIKE N'%<SystemHealth>%') AS x ORDER BY record_id DESC; - 调度器负载:
SELECT scheduler_id, current_tasks_count, runnable_tasks_count, work_queue_count, pending_disk_io_count FROM sys.dm_os_schedulers WHERE status = N'VISIBLE ONLINE'; - 工作队列积压:
SELECT scheduler_id, work_queue_count FROM sys.dm_os_schedulers WHERE work_queue_count > 0; - CPU 压力相关等待:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type IN (N'SOS_SCHEDULER_YIELD', N'CXPACKET', N'CXCONSUMER', N'THREADPOOL'); - 存在可运行任务的调度器数:
SELECT COUNT(*) AS schedulers_with_runnable FROM sys.dm_os_schedulers WHERE runnable_tasks_count > 0; - CPU 消耗最高 SQL:
SELECT TOP 20 qs.total_worker_time/1000 AS total_cpu_ms, qs.execution_count, qs.total_worker_time/qs.execution_count/1000 AS avg_cpu_ms, qs.total_elapsed_time/1000 AS total_elapsed_ms, SUBSTRING(st.text, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) AS sql_text, qp.query_plan FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp ORDER BY qs.total_worker_time DESC; - CPU 消耗最高存储过程:
SELECT TOP 20 OBJECT_NAME(ps.object_id) AS proc_name, ps.execution_count, ps.total_worker_time/1000 AS total_cpu_ms, ps.total_elapsed_time/1000 AS total_elapsed_ms FROM sys.dm_exec_procedure_stats ps ORDER BY ps.total_worker_time DESC; - CPU 消耗最高触发器:
SELECT TOP 20 OBJECT_NAME(ts.object_id) AS trigger_name, ts.execution_count, ts.total_worker_time/1000 AS total_cpu_ms FROM sys.dm_exec_trigger_stats ts ORDER BY ts.total_worker_time DESC; - 编译与重编译次数:
SELECT counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE counter_name IN (N'SQL Compilations/sec', N'SQL Re-Compilations/sec') AND object_name LIKE N'%SQL Statistics%'; - 计划缓存总大小:
SELECT SUM(size_in_bytes)/1024/1024 AS plan_cache_mb FROM sys.dm_exec_cached_plans; - 计划缓存命中率:
SELECT counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE counter_name IN (N'Cache Hit Ratio', N'Cache Hit Ratio Base') AND object_name LIKE N'%Plan Cache%'; - 单次使用计划数:
SELECT COUNT(*) AS single_use_plans FROM sys.dm_exec_cached_plans WHERE usecounts = 1; - 计划缓存占用 Top:
SELECT TOP 20 objtype, COUNT(*) AS plans, SUM(size_in_bytes)/1024/1024 AS mb, SUM(usecounts) AS total_uses FROM sys.dm_exec_cached_plans GROUP BY objtype ORDER BY mb DESC; - 内存 Clerk 占用:
SELECT TOP 20 type, SUM(pages_kb)/1024 AS mb FROM sys.dm_os_memory_clerks GROUP BY type ORDER BY mb DESC; - 缓冲池大小:
SELECT COUNT(*)*8/1024 AS buffer_pool_mb FROM sys.dm_os_buffer_descriptors; - 页生命周期:
SELECT object_name, counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE counter_name = N'Page life expectancy' AND object_name LIKE N'%Buffer Manager%'; - 内存授予等待:
SELECT session_id, wait_type, wait_time, wait_resource FROM sys.dm_exec_requests WHERE wait_type LIKE N'RESOURCE_SEMAPHORE%'; - 内存授予 Top:
SELECT TOP 20 session_id, requested_memory_kb/1024 AS requested_mb, granted_memory_kb/1024 AS granted_mb, max_used_memory_kb/1024 AS max_used_mb, dop, wait_time_ms FROM sys.dm_exec_query_memory_grants ORDER BY granted_memory_kb DESC; - 目标内存与提交内存:
SELECT committed_kb/1024 AS committed_mb, committed_target_kb/1024 AS target_mb, committed_kb - committed_target_kb AS diff_mb FROM sys.dm_os_sys_info; - 系统可用物理内存:
SELECT total_physical_memory_kb/1024 AS total_mb, available_physical_memory_kb/1024 AS available_mb, system_memory_state_desc FROM sys.dm_os_sys_memory; - 系统内存状态:
SELECT system_memory_state_desc FROM sys.dm_os_sys_memory; - 缓冲池扩展:
SELECT * FROM sys.dm_os_buffer_pool_extension_configuration; - 内存优化表内存:
SELECT OBJECT_NAME(object_id) AS table_name, memory_used_by_table_kb/1024 AS table_mb, memory_used_by_indexes_kb/1024 AS index_mb FROM sys.dm_db_xtp_table_memory_stats ORDER BY memory_used_by_table_kb DESC; - 列存储行组状态(2016+):
SELECT OBJECT_NAME(object_id) AS table_name, state_desc, total_rows, deleted_rows FROM sys.dm_db_column_store_row_group_physical_stats; - 锁内存占用:
SELECT SUM(pages_kb)/1024 AS lock_mb FROM sys.dm_os_memory_clerks WHERE type = N'LOCK_MANAGER'; - 连接内存占用:
SELECT SUM(pages_kb)/1024 AS connection_mb FROM sys.dm_os_memory_clerks WHERE type LIKE N'%CONNECTION%'; - 每库缓存页:
SELECT DB_NAME(database_id) AS dbname, COUNT(*)*8/1024 AS cached_mb FROM sys.dm_os_buffer_descriptors GROUP BY database_id ORDER BY cached_mb DESC; - 脏页总数:
SELECT COUNT(*) AS dirty_pages FROM sys.dm_os_buffer_descriptors WHERE is_modified = 1; - 检查点写入页:
SELECT counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE counter_name IN (N'Checkpoint pages/sec', N'Page writes/sec') AND object_name LIKE N'%Buffer Manager%'; - 惰性写入:
SELECT counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE counter_name = N'Lazy writes/sec' AND object_name LIKE N'%Buffer Manager%'; - 文件 IO 延迟明细:
SELECT DB_NAME(vfs.database_id) AS dbname, mf.physical_name, vfs.io_stall_read_ms, vfs.io_stall_write_ms, vfs.num_of_reads, vfs.num_of_writes FROM sys.dm_io_virtual_file_stats(NULL,NULL) vfs JOIN sys.master_files mf ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id; - 数据库 IO 延迟汇总:
SELECT DB_NAME(database_id) AS dbname, SUM(io_stall_read_ms) AS read_stall_ms, SUM(io_stall_write_ms) AS write_stall_ms FROM sys.dm_io_virtual_file_stats(NULL,NULL) GROUP BY database_id ORDER BY read_stall_ms + write_stall_ms DESC; - 数据库 IO 吞吐:
SELECT DB_NAME(database_id) AS dbname, SUM(num_of_bytes_read)/1048576 AS read_mb, SUM(num_of_bytes_written)/1048576 AS write_mb FROM sys.dm_io_virtual_file_stats(NULL,NULL) GROUP BY database_id; - 读等待排名:
SELECT TOP 10 DB_NAME(database_id) AS dbname, file_id, io_stall_read_ms FROM sys.dm_io_virtual_file_stats(NULL,NULL) ORDER BY io_stall_read_ms DESC; - 写等待排名:
SELECT TOP 10 DB_NAME(database_id) AS dbname, file_id, io_stall_write_ms FROM sys.dm_io_virtual_file_stats(NULL,NULL) ORDER BY io_stall_write_ms DESC; - 待处理 IO:
SELECT COUNT(*) AS pending_io FROM sys.dm_io_pending_io_requests; - IO 总 stall:
SELECT TOP 10 DB_NAME(database_id) AS dbname, file_id, io_stall FROM sys.dm_io_virtual_file_stats(NULL,NULL) ORDER BY io_stall DESC; - 读延迟超过 20ms 的文件:
SELECT DB_NAME(database_id) AS dbname, file_id, io_stall_read_ms/NULLIF(num_of_reads,0) AS avg_read_ms FROM sys.dm_io_virtual_file_stats(NULL,NULL) WHERE num_of_reads > 0 AND io_stall_read_ms/NULLIF(num_of_reads,0) > 20; - 写延迟超过 20ms 的文件:
SELECT DB_NAME(database_id) AS dbname, file_id, io_stall_write_ms/NULLIF(num_of_writes,0) AS avg_write_ms FROM sys.dm_io_virtual_file_stats(NULL,NULL) WHERE num_of_writes > 0 AND io_stall_write_ms/NULLIF(num_of_writes,0) > 20; - 每库 IO stall 占比:
SELECT DB_NAME(database_id) AS dbname, SUM(io_stall) AS stall_ms, CAST(100.0*SUM(io_stall)/SUM(SUM(io_stall)) OVER() AS decimal(5,2)) AS pct FROM sys.dm_io_virtual_file_stats(NULL,NULL) GROUP BY database_id; - 缓冲页占比:
SELECT DB_NAME(database_id) AS dbname, COUNT(*) AS pages, CAST(100.0*COUNT(*)/SUM(COUNT(*)) OVER() AS decimal(5,2)) AS pct FROM sys.dm_os_buffer_descriptors GROUP BY database_id; - NUMA 节点:
SELECT node_id, node_state_desc, memory_node_id, processor_group, online_scheduler_count, active_worker_count FROM sys.dm_os_nodes; - CPU 亲和性:
SELECT parent_node_id, scheduler_id, cpu_id, is_online, is_idle FROM sys.dm_os_schedulers WHERE status = N'VISIBLE ONLINE'; - 软 NUMA:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'soft-numa'; - 处理器信息:
SELECT cpu_count, hyperthread_ratio, scheduler_count, numa_node_count FROM sys.dm_os_sys_info; - SQL Server 工作集:
SELECT physical_memory_in_use_kb/1024 AS working_set_mb FROM sys.dm_os_process_memory; - 虚拟地址空间:
SELECT virtual_address_space_reserved_kb/1024 AS reserved_mb, virtual_address_space_committed_kb/1024 AS committed_mb, virtual_address_space_available_kb/1024 AS available_mb FROM sys.dm_os_process_memory; - 内存转储配置:
SELECT name, value_in_use FROM sys.configurations WHERE name IN (N'max dump count', N'min memory per query (KB)'); - 最大服务器内存建议值:
SELECT physical_memory_kb/1024 AS physical_mb, CAST(physical_memory_kb/1024*0.8 AS int) AS suggested_max_memory_mb FROM sys.dm_os_sys_info; - 缓冲缓存命中率:
SELECT counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE counter_name IN (N'Buffer cache hit ratio', N'Buffer cache hit ratio base') AND object_name LIKE N'%Buffer Manager%'; - 页生命周期当前值:
SELECT cntr_value AS page_life_expectancy FROM sys.dm_os_performance_counters WHERE counter_name = N'Page life expectancy' AND object_name LIKE N'%Buffer Manager%'; - 内存授予超时:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type IN (N'RESOURCE_SEMAPHORE', N'RESOURCE_SEMAPHORE_QUERY_COMPILE'); - 资源信号量:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type LIKE N'RESOURCE_SEMAPHORE%'; - 内存压力等待:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type IN (N'RESOURCE_MEMPHYSICAL_LOW', N'RESOURCE_MEMVIRTUAL_LOW', N'CMEMTHREAD'); - 单次使用计划占比:
SELECT CAST(100.0*SUM(CASE WHEN usecounts = 1 THEN 1 ELSE 0 END)/COUNT(*) AS decimal(5,2)) AS single_use_pct FROM sys.dm_exec_cached_plans;
七、等待事件、阻塞与死锁(236--275)
- 等待统计 Top20:
SELECT TOP 20 wait_type, waiting_tasks_count, wait_time_ms, max_wait_time_ms, CAST(100.0*wait_time_ms/SUM(wait_time_ms) OVER() AS decimal(5,2)) AS pct FROM sys.dm_os_wait_stats ORDER BY wait_time_ms DESC; - 排除良性等待后的 Top:
SELECT TOP 20 wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type NOT IN (N'CLR_SEMAPHORE', N'LAZYWRITER_SLEEP', N'RESOURCE_QUEUE', N'SLEEP_TASK', N'SLEEP_SYSTEMTASK', N'SQLTRACE_BUFFER_FLUSH', N'WAITFOR', N'LOGMGR_QUEUE', N'CHECKPOINT_QUEUE', N'REQUEST_FOR_DEADLOCK_SEARCH', N'XE_TIMER_EVENT', N'BROKER_TO_FLUSH', N'BROKER_TASK_STOP', N'CLR_MANUAL_EVENT', N'CLR_AUTO_EVENT', N'DISPATCHER_QUEUE_SEMAPHORE', N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'XE_DISPATCHER_WAIT', N'XE_DISPATCHER_JOIN', N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP') ORDER BY wait_time_ms DESC; - 当前等待任务:
SELECT session_id, wait_type, wait_duration_ms, blocking_session_id, resource_description FROM sys.dm_os_waiting_tasks WHERE session_id > 50 ORDER BY wait_duration_ms DESC; - 当前阻塞链:
SELECT r.session_id, r.blocking_session_id, r.wait_type, r.wait_time, r.wait_resource, r.status, r.command, DB_NAME(r.database_id) AS dbname FROM sys.dm_exec_requests r WHERE r.blocking_session_id <> 0 ORDER BY r.wait_time DESC; - 头阻塞会话:
SELECT blocking_session_id, COUNT(*) AS blocked_count, MAX(wait_time) AS max_wait_ms FROM sys.dm_exec_requests WHERE blocking_session_id <> 0 GROUP BY blocking_session_id ORDER BY blocked_count DESC; - 阻塞源 SQL:
SELECT s.session_id, s.login_name, s.host_name, s.program_name, t.text AS sql_text FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t JOIN sys.dm_exec_sessions s ON r.blocking_session_id = s.session_id WHERE r.blocking_session_id <> 0; - 被阻塞 SQL:
SELECT r.session_id, r.blocking_session_id, r.wait_time, SUBSTRING(t.text, (r.statement_start_offset/2)+1, ((CASE r.statement_end_offset WHEN -1 THEN DATALENGTH(t.text) ELSE r.statement_end_offset END - r.statement_start_offset)/2)+1) AS current_stmt FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t WHERE r.blocking_session_id <> 0; - 当前锁列表:
SELECT request_session_id, resource_type, resource_database_id, resource_description, request_mode, request_status FROM sys.dm_tran_locks WHERE request_status = N'WAIT'; - 锁等待:
SELECT request_session_id, resource_type, request_mode, request_status FROM sys.dm_tran_locks WHERE request_status IN (N'WAIT', N'CONVERT'); - 锁升级:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type LIKE N'LCK_M_%'; - 意向锁冲突:
SELECT request_session_id, resource_type, request_mode, COUNT(*) AS cnt FROM sys.dm_tran_locks GROUP BY request_session_id, resource_type, request_mode HAVING COUNT(*) > 100; - 死锁计数:
SELECT counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE counter_name = N'Number of Deadlocks/sec' AND object_name LIKE N'%Locks%'; - 死锁图(system_health):
SELECT xdr.value('@timestamp','datetime') AS ts, xdr.query('.').value('(event/data[@name="xml_report"]/value/deadlock)[1]','nvarchar(max)') AS deadlock_graph FROM (SELECT CAST(target_data AS xml) AS td FROM sys.dm_xe_session_targets t JOIN sys.dm_xe_sessions s ON t.event_session_address = s.address WHERE s.name = N'system_health' AND t.target_name = N'ring_buffer') AS x CROSS APPLY td.nodes('//RingBufferTarget/event[@name="xml_deadlock_report"]') AS X(xdr); - 死锁受害者与资源:
SELECT request_session_id, resource_type, request_mode, request_status FROM sys.dm_tran_locks WHERE request_status = N'WAIT'; - 活动事务:
SELECT transaction_id, name, transaction_begin_time, transaction_type, transaction_state FROM sys.dm_tran_active_transactions ORDER BY transaction_begin_time; - 长事务:
SELECT transaction_id, name, transaction_begin_time, DATEDIFF(MINUTE, transaction_begin_time, GETDATE()) AS minutes FROM sys.dm_tran_active_transactions WHERE DATEDIFF(MINUTE, transaction_begin_time, GETDATE()) > 30; - 最老活动事务:
SELECT TOP 1 transaction_id, name, transaction_begin_time FROM sys.dm_tran_active_transactions ORDER BY transaction_begin_time; - 当前库打开事务:
DBCC OPENTRAN WITH NO_INFOMSGS; - 会话事务:
SELECT session_id, transaction_id, is_local, is_enlisted FROM sys.dm_tran_session_transactions; - 数据库事务:
SELECT database_transaction_id, transaction_id, database_id, database_transaction_begin_time, database_transaction_state FROM sys.dm_tran_database_transactions; - 事务日志使用:
SELECT DB_NAME(database_id) AS dbname, database_transaction_log_bytes_used/1048576 AS log_used_mb FROM sys.dm_tran_database_transactions GROUP BY database_id; - 版本存储:
SELECT DB_NAME(database_id) AS dbname, reserved_space_kb/1024 AS reserved_mb FROM sys.dm_tran_version_store_space_usage; - 快照隔离冲突:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type IN (N'ROWGROUP_UPDATE', N'VERSION_RECORD'); - 行版本等待:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type LIKE N'%VERSION%'; - 锁等待类型:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type LIKE N'LCK_M_%' ORDER BY wait_time_ms DESC; - 页 IO 闩锁等待:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type LIKE N'PAGEIOLATCH_%' ORDER BY wait_time_ms DESC; - 并行等待:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type IN (N'CXPACKET', N'CXCONSUMER'); - 调度器让出等待:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type = N'SOS_SCHEDULER_YIELD'; - 内存信号量等待:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type LIKE N'RESOURCE_SEMAPHORE%'; - 异步 IO 等待:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type IN (N'ASYNC_IO_COMPLETION', N'IO_COMPLETION'); - 日志写入等待:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type = N'WRITELOG'; - AlwaysOn 同步提交等待:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type = N'HADR_SYNC_COMMIT'; - 线程池等待:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type = N'THREADPOOL'; - 内存分配等待:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type IN (N'MEMORY_ALLOCATION_EXT', N'CMEMTHREAD'); - 等待类别汇总:
SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_time_ms > 0 ORDER BY wait_time_ms DESC; - 闩锁统计:
SELECT TOP 20 latch_class, waiting_requests_count, wait_time_ms, max_wait_time_ms FROM sys.dm_os_latch_stats ORDER BY wait_time_ms DESC; - 自旋锁统计:
SELECT TOP 20 name, collisions, spins, spins_per_collision FROM sys.dm_os_spinlock_stats ORDER BY spins DESC; - 锁超时错误:
SELECT wait_type, waiting_tasks_count FROM sys.dm_os_wait_stats WHERE wait_type IN (N'LCK_M_S', N'LCK_M_X', N'LCK_M_U'); - 阻塞进程报告配置:
SELECT name, value_in_use FROM sys.configurations WHERE name = N'blocked process threshold (s)'; - 会话死锁优先级:
SELECT session_id, deadlock_priority FROM sys.dm_exec_sessions WHERE is_user_process = 1;
八、会话、连接与请求(276--305)
- 会话总览:
SELECT session_id, login_name, host_name, program_name, status, login_time FROM sys.dm_exec_sessions WHERE is_user_process = 1; - 活动请求:
SELECT session_id, status, command, wait_type, wait_time, cpu_time, total_elapsed_time, reads, writes FROM sys.dm_exec_requests WHERE session_id > 50; - 长时间运行请求:
SELECT session_id, status, command, total_elapsed_time/1000 AS elapsed_sec, cpu_time, wait_type FROM sys.dm_exec_requests WHERE total_elapsed_time > 60000 ORDER BY total_elapsed_time DESC; - 按登录名统计会话:
SELECT login_name, COUNT(*) AS sessions FROM sys.dm_exec_sessions WHERE is_user_process = 1 GROUP BY login_name ORDER BY sessions DESC; - 按程序名统计会话:
SELECT program_name, COUNT(*) AS sessions FROM sys.dm_exec_sessions WHERE is_user_process = 1 GROUP BY program_name ORDER BY sessions DESC; - 按主机名统计会话:
SELECT host_name, COUNT(*) AS sessions FROM sys.dm_exec_sessions WHERE is_user_process = 1 GROUP BY host_name ORDER BY sessions DESC; - 连接数统计:
SELECT net_transport, COUNT(*) AS connections FROM sys.dm_exec_connections GROUP BY net_transport; - 客户端 IP 分布:
SELECT client_net_address, COUNT(*) AS connections FROM sys.dm_exec_connections GROUP BY client_net_address ORDER BY connections DESC; - 加密连接:
SELECT encrypt_option, COUNT(*) AS connections FROM sys.dm_exec_connections GROUP BY encrypt_option; - 认证方式:
SELECT auth_scheme, COUNT(*) AS connections FROM sys.dm_exec_connections GROUP BY auth_scheme; - 会话内存使用:
SELECT session_id, login_name, memory_usage*8/1024 AS memory_mb FROM sys.dm_exec_sessions WHERE is_user_process = 1 ORDER BY memory_usage DESC; - 会话 CPU 使用:
SELECT session_id, login_name, cpu_time, total_elapsed_time FROM sys.dm_exec_sessions WHERE is_user_process = 1 ORDER BY cpu_time DESC; - 会话读写量:
SELECT session_id, login_name, reads, writes, logical_reads FROM sys.dm_exec_sessions WHERE is_user_process = 1 ORDER BY logical_reads DESC; - 请求等待明细:
SELECT session_id, wait_type, wait_time, wait_resource, blocking_session_id FROM sys.dm_exec_requests WHERE wait_type IS NOT NULL; - 请求执行进度:
SELECT session_id, command, percent_complete, estimated_completion_time/1000 AS eta_sec FROM sys.dm_exec_requests WHERE percent_complete > 0; - 并行度:
SELECT session_id, dop, command FROM sys.dm_exec_requests WHERE dop > 1; - 授予内存:
SELECT session_id, granted_memory_kb/1024 AS granted_mb, requested_memory_kb/1024 AS requested_mb FROM sys.dm_exec_query_memory_grants; - 会话打开事务数:
SELECT session_id, COUNT(*) AS open_transactions FROM sys.dm_tran_session_transactions GROUP BY session_id; - 会话隔离级别:
SELECT session_id, transaction_isolation_level FROM sys.dm_exec_sessions WHERE is_user_process = 1; - 会话锁超时:
SELECT session_id, lock_timeout FROM sys.dm_exec_sessions WHERE is_user_process = 1; - 会话死锁优先级:
SELECT session_id, deadlock_priority FROM sys.dm_exec_sessions WHERE is_user_process = 1; - 会话状态:
SELECT status, COUNT(*) AS sessions FROM sys.dm_exec_sessions WHERE is_user_process = 1 GROUP BY status; - 空闲会话:
SELECT session_id, login_name, status, last_request_end_time FROM sys.dm_exec_sessions WHERE status = N'sleeping' AND is_user_process = 1; - 睡眠会话时长:
SELECT session_id, login_name, DATEDIFF(MINUTE, last_request_end_time, GETDATE()) AS idle_minutes FROM sys.dm_exec_sessions WHERE status = N'sleeping' AND is_user_process = 1; - 会话登录时间:
SELECT session_id, login_name, login_time, DATEDIFF(HOUR, login_time, GETDATE()) AS hours_connected FROM sys.dm_exec_sessions WHERE is_user_process = 1 ORDER BY login_time; - 会话最后请求时间:
SELECT session_id, login_name, last_request_start_time, last_request_end_time FROM sys.dm_exec_sessions WHERE is_user_process = 1; - 连接传输类型:
SELECT net_transport, protocol_type, protocol_version, num_reads, num_writes FROM sys.dm_exec_connections; - 异常程序名:
SELECT program_name, COUNT(*) AS sessions FROM sys.dm_exec_sessions WHERE is_user_process = 1 AND program_name IS NULL GROUP BY program_name; - 每数据库会话数:
SELECT DB_NAME(database_id) AS dbname, COUNT(*) AS sessions FROM sys.dm_exec_sessions WHERE database_id > 0 GROUP BY database_id ORDER BY sessions DESC; - 会话按状态与登录汇总:
SELECT login_name, status, COUNT(*) AS sessions FROM sys.dm_exec_sessions WHERE is_user_process = 1 GROUP BY login_name, status ORDER BY sessions DESC;
九、索引、统计信息与碎片(306--345)
- 碎片率超过 30% 的索引:
SELECT OBJECT_SCHEMA_NAME(ips.object_id)+'.'+OBJECT_NAME(ips.object_id) AS table_name, i.name AS index_name, ips.index_type_desc, ips.avg_fragmentation_in_percent, ips.page_count FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'SAMPLED') ips JOIN sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id WHERE ips.page_count > 1000 AND ips.avg_fragmentation_in_percent > 30 ORDER BY ips.avg_fragmentation_in_percent DESC; - 碎片率 10%--30% 的索引:
SELECT OBJECT_SCHEMA_NAME(ips.object_id)+'.'+OBJECT_NAME(ips.object_id) AS table_name, i.name AS index_name, ips.avg_fragmentation_in_percent, ips.page_count FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'SAMPLED') ips JOIN sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id WHERE ips.page_count > 1000 AND ips.avg_fragmentation_in_percent BETWEEN 10 AND 30 ORDER BY ips.avg_fragmentation_in_percent DESC; - 页密度低于 70% 的索引:
SELECT OBJECT_NAME(ips.object_id) AS table_name, i.name AS index_name, ips.avg_page_space_used_in_percent FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'SAMPLED') ips JOIN sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id WHERE ips.avg_page_space_used_in_percent < 70; - 从未使用的索引:
SELECT OBJECT_NAME(i.object_id) AS table_name, i.name AS index_name, ius.user_seeks, ius.user_scans, ius.user_lookups, ius.user_updates FROM sys.indexes i LEFT JOIN sys.dm_db_index_usage_stats ius ON i.object_id = ius.object_id AND i.index_id = ius.index_id AND ius.database_id = DB_ID() WHERE i.index_id > 0 AND i.is_primary_key = 0 AND i.is_unique_constraint = 0 AND ISNULL(ius.user_seeks,0) + ISNULL(ius.user_scans,0) + ISNULL(ius.user_lookups,0) = 0; - 索引查找与扫描次数:
SELECT OBJECT_NAME(object_id) AS table_name, index_id, user_seeks, user_scans, user_lookups FROM sys.dm_db_index_usage_stats WHERE database_id = DB_ID() ORDER BY user_scans DESC; - 索引更新次数:
SELECT OBJECT_NAME(object_id) AS table_name, index_id, user_updates, user_seeks FROM sys.dm_db_index_usage_stats WHERE database_id = DB_ID() ORDER BY user_updates DESC; - 缺失索引:
SELECT TOP 20 DB_NAME(mid.database_id) AS dbname, OBJECT_NAME(mid.object_id, mid.database_id) AS table_name, mid.equality_columns, mid.inequality_columns, mid.included_columns FROM sys.dm_db_missing_index_details mid JOIN sys.dm_db_missing_index_groups mig ON mid.index_handle = mig.index_handle JOIN sys.dm_db_missing_index_group_stats migs ON mig.index_group_handle = migs.group_handle ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC; - 缺失索引开销:
SELECT TOP 20 migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) AS score, migs.user_seeks, migs.user_scans, migs.avg_total_user_cost, migs.avg_user_impact FROM sys.dm_db_missing_index_groups mig JOIN sys.dm_db_missing_index_group_stats migs ON mig.index_group_handle = migs.group_handle ORDER BY score DESC; - 重复索引:
SELECT OBJECT_NAME(i1.object_id) AS table_name, i1.name AS index1, i2.name AS index2 FROM sys.indexes i1 JOIN sys.indexes i2 ON i1.object_id = i2.object_id AND i1.index_id < i2.index_id AND i1.type = i2.type WHERE i1.is_primary_key = 0 AND i2.is_primary_key = 0 AND i1.key_columns = i2.key_columns; - 重叠索引:
SELECT OBJECT_NAME(i.object_id) AS table_name, i.name AS index_name, i.type_desc, i.is_unique, i.is_primary_key FROM sys.indexes i WHERE i.object_id IN (SELECT object_id FROM sys.indexes WHERE type = 2 GROUP BY object_id HAVING COUNT(*) > 5); - 写多读少的索引:
SELECT OBJECT_NAME(object_id) AS table_name, index_id, user_updates, user_seeks, user_scans FROM sys.dm_db_index_usage_stats WHERE database_id = DB_ID() AND user_updates > user_seeks + user_scans ORDER BY user_updates DESC; - 索引行锁等待:
SELECT TOP 20 OBJECT_NAME(object_id) AS table_name, index_id, row_lock_count, row_lock_wait_count, row_lock_wait_in_ms FROM sys.dm_db_index_operational_stats(DB_ID(), NULL, NULL, NULL) ORDER BY row_lock_wait_in_ms DESC; - 索引页闩锁等待:
SELECT TOP 20 OBJECT_NAME(object_id) AS table_name, index_id, page_io_latch_wait_count, page_io_latch_wait_in_ms FROM sys.dm_db_index_operational_stats(DB_ID(), NULL, NULL, NULL) ORDER BY page_io_latch_wait_in_ms DESC; - 索引 IO 等待:
SELECT TOP 20 OBJECT_NAME(object_id) AS table_name, index_id, range_scan_count, singleton_lookup_count FROM sys.dm_db_index_operational_stats(DB_ID(), NULL, NULL, NULL) ORDER BY range_scan_count DESC; - 统计信息更新时间:
SELECT OBJECT_NAME(s.object_id) AS table_name, s.name AS stats_name, sp.last_updated, sp.rows, sp.rows_sampled, sp.modification_counter FROM sys.stats s CROSS APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) sp WHERE OBJECTPROPERTY(s.object_id,'IsUserTable') = 1 ORDER BY sp.last_updated; - 统计信息过期:
SELECT OBJECT_NAME(s.object_id) AS table_name, s.name AS stats_name, sp.last_updated, sp.modification_counter, sp.rows FROM sys.stats s CROSS APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) sp WHERE sp.modification_counter > sp.rows * 0.2 ORDER BY sp.modification_counter DESC; - 统计信息采样率:
SELECT OBJECT_NAME(s.object_id) AS table_name, s.name AS stats_name, sp.rows, sp.rows_sampled, CAST(100.0*sp.rows_sampled/NULLIF(sp.rows,0) AS decimal(5,2)) AS sample_pct FROM sys.stats s CROSS APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) sp; - 统计信息直方图(2016 SP1 CU2+):
SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID(N'dbo.YourTable'), 1); - 自动创建统计信息:
SELECT name, is_auto_create_stats_on FROM sys.databases; - 自动更新统计信息:
SELECT name, is_auto_update_stats_on, is_auto_update_stats_async_on FROM sys.databases; - 统计信息行数与实际行数偏差:
SELECT OBJECT_NAME(s.object_id) AS table_name, s.name AS stats_name, sp.rows AS stats_rows, p.rows AS actual_rows FROM sys.stats s CROSS APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) sp JOIN sys.partitions p ON s.object_id = p.object_id AND p.index_id IN (0,1) WHERE p.partition_number = 1; - 索引压缩:
SELECT OBJECT_NAME(p.object_id) AS table_name, i.name AS index_name, p.partition_number, p.data_compression_desc FROM sys.partitions p JOIN sys.indexes i ON p.object_id = i.object_id AND p.index_id = i.index_id WHERE p.data_compression_desc <> N'NONE'; - 压缩收益评估:
EXEC sys.sp_estimate_data_compression_savings @schema_name = N'dbo', @object_name = N'YourTable', @index_id = NULL, @partition_number = NULL, @data_compression = N'PAGE'; - 分区索引:
SELECT OBJECT_NAME(i.object_id) AS table_name, i.name AS index_name, i.type_desc FROM sys.indexes i JOIN sys.partition_schemes ps ON i.data_space_id = ps.data_space_id; - 分区边界:
SELECT OBJECT_NAME(pf.object_id) AS function_name, pf.type_desc, pv.boundary_id, pv.value FROM sys.partition_functions pf JOIN sys.partition_range_values pv ON pf.function_id = pv.function_id ORDER BY pv.boundary_id; - 索引填充因子:
SELECT OBJECT_NAME(object_id) AS table_name, name AS index_name, fill_factor FROM sys.indexes WHERE fill_factor <> 0; - 禁用索引:
SELECT OBJECT_NAME(object_id) AS table_name, name AS index_name, type_desc FROM sys.indexes WHERE is_disabled = 1; - 索引状态:
SELECT OBJECT_NAME(object_id) AS table_name, name AS index_name, is_unique, is_primary_key, is_unique_constraint, is_padded, is_disabled FROM sys.indexes WHERE index_id > 0; - 索引键列:
SELECT OBJECT_NAME(ic.object_id) AS table_name, i.name AS index_name, ic.key_ordinal, c.name AS column_name, ic.is_descending_key FROM sys.index_columns ic JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id WHERE ic.is_included_column = 0 ORDER BY ic.object_id, ic.index_id, ic.key_ordinal; - 包含列:
SELECT OBJECT_NAME(ic.object_id) AS table_name, i.name AS index_name, c.name AS included_column FROM sys.index_columns ic JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id WHERE ic.is_included_column = 1; - 筛选索引:
SELECT OBJECT_NAME(object_id) AS table_name, name AS index_name, filter_definition FROM sys.indexes WHERE has_filter = 1; - 列存储索引:
SELECT OBJECT_NAME(object_id) AS table_name, name AS index_name, type_desc FROM sys.indexes WHERE type IN (5,6); - 全文索引:
SELECT OBJECT_NAME(object_id) AS table_name, name, is_enabled, change_tracking_state_desc FROM sys.fulltext_indexes; - 索引重建/变更记录:
DECLARE @p nvarchar(260); SELECT @p = CAST(value AS nvarchar(260)) FROM sys.fn_trace_getinfo(NULL) WHERE traceid = 1 AND property = 2; SELECT * FROM sys.fn_trace_gettable(@p, DEFAULT) WHERE EventClass = 164; - 索引维护作业:
SELECT j.name, j.enabled FROM msdb.dbo.sysjobs j WHERE j.name LIKE N'%Index%' OR j.name LIKE N'%索引%'; - 堆碎片:
SELECT OBJECT_NAME(ips.object_id) AS table_name, ips.page_count, ips.avg_fragmentation_in_percent FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'SAMPLED') ips JOIN sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id WHERE i.type = 0 AND ips.page_count > 1000; - 堆转发记录:
SELECT OBJECT_NAME(object_id) AS table_name, index_id, forwarded_record_count FROM sys.dm_db_index_operational_stats(DB_ID(), NULL, NULL, NULL) WHERE forwarded_record_count > 0 ORDER BY forwarded_record_count DESC; - 鬼影记录:
SELECT OBJECT_NAME(object_id) AS table_name, index_id, ghost_record_count FROM sys.dm_db_index_operational_stats(DB_ID(), NULL, NULL, NULL) WHERE ghost_record_count > 0 ORDER BY ghost_record_count DESC; - 表索引一致性检查:
DBCC CHECKTABLE(N'dbo.YourTable') WITH NO_INFOMSGS, ALL_ERRORMSGS; - 索引物理统计明细:
SELECT * FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID(N'dbo.YourTable'), NULL, NULL, 'DETAILED');
十、备份与恢复(346--405)
- 全备历史:
SELECT bs.database_name, bs.backup_start_date, bs.backup_finish_date, bs.backup_size/1048576 AS size_mb, bmf.physical_device_name FROM msdb.dbo.backupset bs LEFT JOIN msdb.dbo.backupmediafamily bmf ON bs.media_set_id = bmf.media_set_id WHERE bs.type = 'D' AND bs.backup_finish_date >= DATEADD(DAY,-7,GETDATE()) ORDER BY bs.backup_finish_date DESC; - 差异备份历史:
SELECT bs.database_name, bs.backup_start_date, bs.backup_finish_date, bs.backup_size/1048576 AS size_mb FROM msdb.dbo.backupset bs WHERE bs.type = 'I' AND bs.backup_finish_date >= DATEADD(DAY,-7,GETDATE()) ORDER BY bs.backup_finish_date DESC; - 日志备份历史:
SELECT bs.database_name, bs.backup_start_date, bs.backup_finish_date, bs.backup_size/1048576 AS size_mb FROM msdb.dbo.backupset bs WHERE bs.type = 'L' AND bs.backup_finish_date >= DATEADD(DAY,-7,GETDATE()) ORDER BY bs.backup_finish_date DESC; - 每库最后全备:
SELECT d.name, MAX(bs.backup_finish_date) AS last_full FROM sys.databases d LEFT JOIN msdb.dbo.backupset bs ON d.name = bs.database_name AND bs.type = 'D' GROUP BY d.name ORDER BY last_full; - 每库最后差异备份:
SELECT d.name, MAX(bs.backup_finish_date) AS last_diff FROM sys.databases d LEFT JOIN msdb.dbo.backupset bs ON d.name = bs.database_name AND bs.type = 'I' GROUP BY d.name; - 每库最后日志备份:
SELECT d.name, MAX(bs.backup_finish_date) AS last_log FROM sys.databases d LEFT JOIN msdb.dbo.backupset bs ON d.name = bs.database_name AND bs.type = 'L' GROUP BY d.name ORDER BY last_log; - 备份失败记录:
SELECT bs.database_name, bs.backup_start_date, bs.backup_finish_date, bs.is_damaged FROM msdb.dbo.backupset bs WHERE bs.is_damaged = 1 ORDER BY bs.backup_finish_date DESC; - 备份大小趋势:
SELECT database_name, CAST(backup_start_date AS date) AS backup_date, backup_size/1048576 AS size_mb FROM msdb.dbo.backupset WHERE type = 'D' AND backup_start_date >= DATEADD(DAY,-30,GETDATE()) ORDER BY database_name, backup_start_date; - 备份压缩率:
SELECT database_name, backup_start_date, backup_size/1048576 AS size_mb, compressed_backup_size/1048576 AS compressed_mb, CAST(100.0*(backup_size-compressed_backup_size)/NULLIF(backup_size,0) AS decimal(5,2)) AS compression_pct FROM msdb.dbo.backupset WHERE type = 'D' AND backup_start_date >= DATEADD(DAY,-7,GETDATE()); - 备份耗时:
SELECT database_name, backup_start_date, DATEDIFF(MINUTE, backup_start_date, backup_finish_date) AS duration_min FROM msdb.dbo.backupset WHERE backup_start_date >= DATEADD(DAY,-7,GETDATE()) ORDER BY duration_min DESC; - 备份设备:
SELECT name, physical_name, type_desc, is_default FROM sys.backup_devices; - 备份物理路径:
SELECT bs.database_name, bs.backup_start_date, bmf.physical_device_name FROM msdb.dbo.backupset bs JOIN msdb.dbo.backupmediafamily bmf ON bs.media_set_id = bmf.media_set_id WHERE bs.backup_start_date >= DATEADD(DAY,-7,GETDATE()) ORDER BY bs.backup_start_date DESC; - 备份文件是否存在:
EXEC master.dbo.xp_fileexist N'D:\Backup\YourDB_FULL.bak'; - 备份校验和:
SELECT database_name, backup_start_date, has_backup_checksums FROM msdb.dbo.backupset WHERE backup_start_date >= DATEADD(DAY,-7,GETDATE()); - 备份过期时间:
SELECT database_name, backup_start_date, expires_on FROM msdb.dbo.backupset WHERE expires_on IS NOT NULL AND expires_on < GETDATE(); - 备份加密:
SELECT database_name, backup_start_date, key_algorithm, encryptor_thumbprint FROM msdb.dbo.backupset WHERE key_algorithm IS NOT NULL; - 仅复制备份:
SELECT database_name, backup_start_date, is_copy_only FROM msdb.dbo.backupset WHERE is_copy_only = 1; - 备份链 LSN:
SELECT database_name, type, backup_start_date, first_lsn, last_lsn, checkpoint_lsn, database_backup_lsn, differential_base_lsn FROM msdb.dbo.backupset WHERE database_name = N'YourDB' ORDER BY backup_start_date DESC; - 备份介质集:
SELECT media_set_id, media_family_count, family_count, mirror_count FROM msdb.dbo.backupmediaset ORDER BY media_set_id DESC; - 备份到 URL:
SELECT database_name, backup_start_date, bmf.physical_device_name FROM msdb.dbo.backupset bs JOIN msdb.dbo.backupmediafamily bmf ON bs.media_set_id = bmf.media_set_id WHERE bmf.physical_device_name LIKE N'https://%'; - 备份作业状态:
SELECT j.name, j.enabled, h.run_status, h.run_date, h.run_time FROM msdb.dbo.sysjobs j LEFT JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id WHERE j.name LIKE N'%Backup%' OR j.name LIKE N'%备份%'; - 备份作业历史:
SELECT j.name, h.step_name, h.run_status, h.run_date, h.run_time, h.message FROM msdb.dbo.sysjobhistory h JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id WHERE j.name LIKE N'%Backup%' ORDER BY h.run_date DESC, h.run_time DESC; - 恢复历史:
SELECT restore_date, destination_database_name, user_name, backup_set_id, restore_type FROM msdb.dbo.restorehistory ORDER BY restore_date DESC; - 恢复失败:
SELECT restore_date, destination_database_name, restore_type FROM msdb.dbo.restorehistory WHERE restore_type = 'D' AND restore_date >= DATEADD(DAY,-7,GETDATE()) ORDER BY restore_date DESC; - 恢复耗时:
SELECT rh.destination_database_name, rh.restore_date, DATEDIFF(MINUTE, bs.backup_finish_date, rh.restore_date) AS restore_min FROM msdb.dbo.restorehistory rh JOIN msdb.dbo.backupset bs ON rh.backup_set_id = bs.backup_set_id WHERE rh.restore_date >= DATEADD(DAY,-7,GETDATE()); - 备份验证:
RESTORE VERIFYONLY FROM DISK = N'D:\Backup\YourDB_FULL.bak' WITH CHECKSUM; - 备份头信息:
RESTORE HEADERONLY FROM DISK = N'D:\Backup\YourDB_FULL.bak'; - 备份文件列表:
RESTORE FILELISTONLY FROM DISK = N'D:\Backup\YourDB_FULL.bak'; - 备份介质标签:
RESTORE LABELONLY FROM DISK = N'D:\Backup\YourDB_FULL.bak'; - 数据库完整性检查:
DBCC CHECKDB(N'YourDB') WITH NO_INFOMSGS, ALL_ERRORMSGS; - 物理一致性检查:
DBCC CHECKDB(N'YourDB') WITH PHYSICAL_ONLY, NO_INFOMSGS; - 表一致性检查:
DBCC CHECKTABLE(N'dbo.YourTable') WITH NO_INFOMSGS; - 文件组一致性检查:
DBCC CHECKFILEGROUP WITH NO_INFOMSGS; - 分配一致性检查:
DBCC CHECKALLOC(N'YourDB') WITH NO_INFOMSGS; - 系统目录一致性检查:
DBCC CHECKCATALOG(N'YourDB') WITH NO_INFOMSGS; - 可疑页:
SELECT database_id, file_id, page_id, event_type, error_count FROM msdb.dbo.suspect_pages; - 页自动修复:
SELECT * FROM sys.dm_hadr_auto_page_repair; - 页还原:
RESTORE DATABASE YourDB PAGE = N'1:1234' FROM DISK = N'D:\Backup\YourDB_FULL.bak' WITH NORECOVERY; - 尾日志备份:
BACKUP LOG YourDB TO DISK = N'D:\Backup\YourDB_TAIL.trn' WITH NORECOVERY, NO_TRUNCATE; - 日志链断裂检查:
SELECT database_name, type, backup_start_date, first_lsn, last_lsn FROM msdb.dbo.backupset WHERE database_name = N'YourDB' ORDER BY backup_start_date; - 恢复模式切换:
ALTER DATABASE YourDB SET RECOVERY FULL; - 简单模式日志截断:
SELECT name, log_reuse_wait_desc FROM sys.databases WHERE recovery_model_desc = N'SIMPLE'; - 日志备份频率检查:
SELECT database_name, COUNT(*) AS log_backups, MIN(backup_finish_date) AS first_backup, MAX(backup_finish_date) AS last_backup FROM msdb.dbo.backupset WHERE type = 'L' AND backup_finish_date >= DATEADD(DAY,-1,GETDATE()) GROUP BY database_name; - 日志空间不足:
SELECT DB_NAME(database_id) AS dbname, used_log_space_in_percent FROM sys.dm_db_log_space_usage WHERE used_log_space_in_percent > 80; - 日志增长:
SELECT DB_NAME(database_id) AS dbname, name, size*8/1024 AS size_mb FROM sys.master_files WHERE type_desc = N'LOG' ORDER BY size_mb DESC; - 日志收缩:
DBCC SHRINKFILE (N'YourDB_log', 1024); - 数据文件收缩:
DBCC SHRINKFILE (N'YourDB_Data', 10240); - 自动增长事件:
DECLARE @p nvarchar(260); SELECT @p = CAST(value AS nvarchar(260)) FROM sys.fn_trace_getinfo(NULL) WHERE traceid = 1 AND property = 2; SELECT * FROM sys.fn_trace_gettable(@p, DEFAULT) WHERE EventClass IN (92,93); - 数据库快照回滚:
RESTORE DATABASE YourDB FROM DATABASE_SNAPSHOT = N'YourDB_Snap'; - 时间点恢复:
RESTORE DATABASE YourDB FROM DISK = N'D:\Backup\YourDB_FULL.bak' WITH NORECOVERY; RESTORE LOG YourDB FROM DISK = N'D:\Backup\YourDB_LOG.trn' WITH STOPAT = N'2026-11-06T10:00:00', RECOVERY; - STANDBY 只读还原:
RESTORE DATABASE YourDB FROM DISK = N'D:\Backup\YourDB_FULL.bak' WITH STANDBY = N'D:\Backup\YourDB_STANDBY.bak'; - 文件组还原:
RESTORE DATABASE YourDB FILEGROUP = N'PRIMARY' FROM DISK = N'D:\Backup\YourDB_FULL.bak' WITH NORECOVERY; - 页面还原:
RESTORE DATABASE YourDB PAGE = N'1:1234' FROM DISK = N'D:\Backup\YourDB_FULL.bak' WITH NORECOVERY; - 部分还原:
RESTORE DATABASE YourDB FILEGROUP = N'PRIMARY' FROM DISK = N'D:\Backup\YourDB_FULL.bak' WITH PARTIAL, NORECOVERY; - 在线还原:
RESTORE DATABASE YourDB FROM DISK = N'D:\Backup\YourDB_FULL.bak' WITH ONLINE, NORECOVERY; - 加速数据库恢复(2019+):
ALTER DATABASE YourDB SET ACCELERATED_DATABASE_RECOVERY = ON; - 备份压缩配置:
EXEC sys.sp_configure N'backup compression default', 1; RECONFIGURE; - 备份限速:
BACKUP DATABASE YourDB TO DISK = N'D:\Backup\YourDB_FULL.bak' WITH MAXTRANSFERSIZE = 4194304, BUFFERCOUNT = 50; - 镜像备份:
BACKUP DATABASE YourDB TO DISK = N'D:\Backup\A.bak' MIRROR TO DISK = N'E:\Backup\B.bak' WITH FORMAT, INIT; - 备份校验配置:
EXEC sys.sp_configure N'backup checksum default', 1; RECONFIGURE;
十一、高可用与复制(406--435)
- 可用性组列表:
SELECT name, cluster_type_desc, automated_backup_preference_desc FROM sys.availability_groups; - AG 副本状态:
SELECT ag.name AS ag_name, ar.replica_server_name, ars.role_desc, ars.operational_state_desc, ars.connected_state_desc, ars.synchronization_health_desc FROM sys.dm_hadr_availability_replica_states ars JOIN sys.availability_replicas ar ON ars.replica_id = ar.replica_id JOIN sys.availability_groups ag ON ars.group_id = ag.group_id; - AG 数据库状态:
SELECT ag.name AS ag_name, adc.database_name, drs.synchronization_state_desc, drs.database_state_desc, drs.is_suspended, drs.suspend_reason_desc FROM sys.dm_hadr_database_replica_states drs JOIN sys.availability_databases_cluster adc ON drs.database_id = adc.database_id AND drs.group_id = adc.group_id JOIN sys.availability_groups ag ON drs.group_id = ag.group_id; - AG 同步延迟:
SELECT ag.name AS ag_name, adc.database_name, drs.secondary_lag_seconds FROM sys.dm_hadr_database_replica_states drs JOIN sys.availability_databases_cluster adc ON drs.database_id = adc.database_id AND drs.group_id = adc.group_id JOIN sys.availability_groups ag ON drs.group_id = ag.group_id WHERE drs.is_local = 0; - AG 发送队列:
SELECT ag.name AS ag_name, adc.database_name, drs.log_send_queue_size, drs.log_send_rate FROM sys.dm_hadr_database_replica_states drs JOIN sys.availability_databases_cluster adc ON drs.database_id = adc.database_id AND drs.group_id = adc.group_id JOIN sys.availability_groups ag ON drs.group_id = ag.group_id; - AG 重做队列:
SELECT ag.name AS ag_name, adc.database_name, drs.redo_queue_size, drs.redo_rate FROM sys.dm_hadr_database_replica_states drs JOIN sys.availability_databases_cluster adc ON drs.database_id = adc.database_id AND drs.group_id = adc.group_id JOIN sys.availability_groups ag ON drs.group_id = ag.group_id; - AG 健康状态:
SELECT ag.name AS ag_name, ag.primary_recovery_health_desc, ag.secondary_recovery_health_desc FROM sys.availability_groups ag; - AG 故障转移模式:
SELECT ar.replica_server_name, ar.failover_mode_desc, ar.availability_mode_desc FROM sys.availability_replicas ar; - AG 可用性模式:
SELECT ar.replica_server_name, ar.availability_mode_desc, ar.session_timeout FROM sys.availability_replicas ar; - AG 自动页修复:
SELECT * FROM sys.dm_hadr_auto_page_repair; - 集群节点:
SELECT member_name, member_type_desc, member_state_desc, number_of_quorum_votes FROM sys.dm_hadr_cluster_members; - 集群仲裁:
SELECT cluster_name, quorum_type_desc, quorum_state_desc FROM sys.dm_hadr_cluster; - 集群网络:
SELECT member_name, network_subnet_ip, is_public, state_desc FROM sys.dm_hadr_cluster_networks; - AG 监听器:
SELECT ag.name AS ag_name, l.dns_name, l.port, l.is_conformant FROM sys.availability_group_listeners l JOIN sys.availability_groups ag ON l.group_id = ag.group_id; - AG 备份优先级:
SELECT ar.replica_server_name, ar.backup_priority, ar.seeding_mode_desc FROM sys.availability_replicas ar; - AG 只读路由:
SELECT ar.replica_server_name, ar.read_only_routing_url FROM sys.availability_replicas ar WHERE ar.read_only_routing_url IS NOT NULL; - AG 种子模式:
SELECT ar.replica_server_name, ar.seeding_mode_desc FROM sys.availability_replicas ar; - 数据库镜像状态:
SELECT DB_NAME(database_id) AS dbname, mirroring_state_desc, mirroring_role_desc, mirroring_safety_level_desc FROM sys.database_mirroring WHERE mirroring_guid IS NOT NULL; - 镜像连接:
SELECT connection_id, database_id, is_peer, state_desc FROM sys.dm_db_mirroring_connections; - 日志传送主库:
SELECT primary_database, backup_directory, backup_retention_period, backup_threshold, threshold_alert_enabled FROM msdb.dbo.log_shipping_monitor_primary; - 日志传送备库:
SELECT secondary_server, secondary_database, restore_delay, last_restored_file, last_restored_date FROM msdb.dbo.log_shipping_monitor_secondary; - 日志传送延迟:
SELECT secondary_database, last_restored_date, DATEDIFF(MINUTE, last_restored_date, GETDATE()) AS delay_min FROM msdb.dbo.log_shipping_monitor_secondary; - 日志传送历史:
SELECT * FROM msdb.dbo.log_shipping_monitor_history_detail ORDER BY log_time DESC; - 日志传送告警:
SELECT * FROM msdb.dbo.log_shipping_monitor_alert; - 复制发布:
SELECT name, publication_type, status, sync_method FROM distribution.dbo.MSpublications; - 复制订阅:
SELECT s.name AS subscription, a.article, s.subscriber_db, s.status FROM distribution.dbo.MSsubscriptions s JOIN distribution.dbo.MSarticles a ON s.article_id = a.article_id; - 复制延迟:
SELECT publisher_database_id, subscriber, latency, status FROM distribution.dbo.MSdistribution_status; - 复制代理状态:
SELECT name, status, startup_time, last_execution_time FROM msdb.dbo.sysjobs WHERE name LIKE N'%Replication%'; - CDC 状态:
SELECT name, is_cdc_enabled FROM sys.databases; - 变更跟踪:
SELECT name, is_change_tracking_on FROM sys.databases;
十二、安全、权限与审计(436--460)
- 登录名列表:
SELECT name, type_desc, is_disabled, create_date, modify_date, default_database_name FROM sys.server_principals WHERE type IN ('S','U','G') ORDER BY name; - 禁用登录名:
SELECT name, type_desc FROM sys.server_principals WHERE is_disabled = 1; - SQL 登录密码策略:
SELECT name, is_policy_checked, is_expiration_checked FROM sys.sql_logins; - 密码过期登录:
SELECT name, LOGINPROPERTY(name,'DaysUntilExpiration') AS days_until_expiration FROM sys.sql_logins WHERE LOGINPROPERTY(name,'DaysUntilExpiration') IS NOT NULL; - sysadmin 成员:
SELECT p.name FROM sys.server_role_members rm JOIN sys.server_principals r ON rm.role_principal_id = r.principal_id JOIN sys.server_principals p ON rm.member_principal_id = p.principal_id WHERE r.name = N'sysadmin'; - 服务器角色成员:
SELECT r.name AS role_name, p.name AS member_name FROM sys.server_role_members rm JOIN sys.server_principals r ON rm.role_principal_id = r.principal_id JOIN sys.server_principals p ON rm.member_principal_id = p.principal_id ORDER BY r.name, p.name; - 数据库角色成员:
SELECT r.name AS role_name, p.name AS member_name FROM sys.database_role_members rm JOIN sys.database_principals r ON rm.role_principal_id = r.principal_id JOIN sys.database_principals p ON rm.member_principal_id = p.principal_id; - 服务器权限授予:
SELECT pr.name AS grantee, sp.permission_name, sp.state_desc FROM sys.server_permissions sp JOIN sys.server_principals pr ON sp.grantee_principal_id = pr.principal_id WHERE sp.state_desc = N'GRANT'; - 权限拒绝:
SELECT pr.name AS grantee, sp.permission_name, sp.state_desc FROM sys.server_permissions sp JOIN sys.server_principals pr ON sp.grantee_principal_id = pr.principal_id WHERE sp.state_desc = N'DENY'; - 孤儿用户:
EXEC sys.sp_MSforeachdb N'USE [?]; SELECT DB_NAME() AS dbname, dp.name AS orphan_user FROM sys.database_principals dp LEFT JOIN sys.server_principals sp ON dp.sid = sp.sid WHERE dp.type IN (''S'',''U'',''G'') AND dp.principal_id > 4 AND sp.sid IS NULL;'; - 数据库所有者:
SELECT name, SUSER_SNAME(owner_sid) AS owner FROM sys.databases; - 证书:
SELECT name, subject, expiry_date, pvt_key_encryption_type_desc FROM sys.certificates; - 对称密钥:
SELECT name, algorithm_desc, key_length, create_date FROM sys.symmetric_keys; - 非对称密钥:
SELECT name, algorithm_desc, key_length, create_date FROM sys.asymmetric_keys; - TDE 状态:
SELECT DB_NAME(database_id) AS dbname, encryption_state_desc, percent_complete, key_algorithm, key_length FROM sys.dm_database_encryption_keys; - 加密密钥轮换:
SELECT DB_NAME(database_id) AS dbname, key_algorithm, key_length, encryptor_type FROM sys.dm_database_encryption_keys; - 服务器审核:
SELECT name, type_desc, is_state_enabled, audit_file_path FROM sys.server_audits; - 审核运行状态:
SELECT name, status_desc, status_time, audit_file_path FROM sys.dm_server_audit_status; - 审核文件读取:
SELECT * FROM sys.fn_get_audit_file(N'D:\Audit\*.sqlaudit', DEFAULT, DEFAULT); - 登录失败统计:
SELECT counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE counter_name = N'Logins/sec' AND object_name LIKE N'%General Statistics%'; - 行级安全:
SELECT name, is_enabled, is_schema_bound FROM sys.security_policies; - 动态数据掩码(2016+):
SELECT OBJECT_NAME(object_id) AS table_name, name AS column_name, masking_function FROM sys.masked_columns; - 敏感数据分类(2019+/SSMS):
SELECT class_desc, major_id, minor_id, label, information_type FROM sys.sensitivity_classifications; - 链接服务器:
SELECT name, product, provider, data_source, is_linked, is_remote_login_enabled, is_rpc_out_enabled FROM sys.servers WHERE server_id <> 0; - 链接服务器登录映射:
SELECT s.name AS linked_server, ll.uses_self_credential, ll.remote_name FROM sys.linked_logins ll JOIN sys.servers s ON ll.server_id = s.server_id;
十三、作业、维护计划与告警(461--480)
- 作业列表:
SELECT j.name, j.enabled, c.name AS category, SUSER_SNAME(j.owner_sid) AS owner, j.date_created, j.date_modified FROM msdb.dbo.sysjobs j LEFT JOIN msdb.dbo.syscategories c ON j.category_id = c.category_id ORDER BY j.name; - 禁用作业:
SELECT name FROM msdb.dbo.sysjobs WHERE enabled = 0; - 失败作业:
SELECT DISTINCT j.name FROM msdb.dbo.sysjobhistory h JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id WHERE h.run_status = 0 AND h.run_date >= CONVERT(int, CONVERT(varchar(8), DATEADD(DAY,-7,GETDATE()), 112)); - 作业失败历史:
SELECT j.name, h.step_id, h.step_name, h.run_status, h.run_date, h.run_time, h.message FROM msdb.dbo.sysjobhistory h JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id WHERE h.run_status = 0 ORDER BY h.run_date DESC, h.run_time DESC; - 作业运行时长:
SELECT j.name, h.run_date, h.run_time, h.run_duration FROM msdb.dbo.sysjobhistory h JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id ORDER BY h.run_duration DESC; - 作业调度:
SELECT j.name, s.name AS schedule_name, s.enabled, s.freq_type, s.freq_interval, s.freq_subday_type, s.freq_subday_interval FROM msdb.dbo.sysjobs j JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id; - 作业下次运行时间:
SELECT j.name, js.next_run_date, js.next_run_time FROM msdb.dbo.sysjobs j JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id ORDER BY js.next_run_date, js.next_run_time; - 作业所有者:
SELECT name, SUSER_SNAME(owner_sid) AS owner FROM msdb.dbo.sysjobs ORDER BY owner; - 作业步骤:
SELECT j.name AS job_name, s.step_id, s.step_name, s.subsystem, s.command FROM msdb.dbo.sysjobs j JOIN msdb.dbo.sysjobsteps s ON j.job_id = s.job_id ORDER BY j.name, s.step_id; - 作业目标服务器:
SELECT j.name, ts.server_name FROM msdb.dbo.sysjobs j JOIN msdb.dbo.sysjobservers js ON j.job_id = js.job_id JOIN msdb.dbo.systargetservers ts ON js.server_id = ts.server_id; - 维护计划:
SELECT name, enabled, date_created, date_modified FROM msdb.dbo.sysmaintplan_plans; - 维护计划历史:
SELECT plan_name, start_time, end_time, succeeded FROM msdb.dbo.sysmaintplan_log ORDER BY start_time DESC; - 索引重建作业:
SELECT j.name, j.enabled FROM msdb.dbo.sysjobs j JOIN msdb.dbo.sysjobsteps s ON j.job_id = s.job_id WHERE s.command LIKE N'%REBUILD%' OR s.command LIKE N'%REORGANIZE%'; - 统计更新作业:
SELECT j.name, j.enabled FROM msdb.dbo.sysjobs j JOIN msdb.dbo.sysjobsteps s ON j.job_id = s.job_id WHERE s.command LIKE N'%UPDATE STATISTICS%'; - 备份作业:
SELECT j.name, j.enabled FROM msdb.dbo.sysjobs j JOIN msdb.dbo.sysjobsteps s ON j.job_id = s.job_id WHERE s.command LIKE N'%BACKUP%'; - 告警配置:
SELECT name, severity, message_id, enabled, delay_between_responses, last_occurrence_date, occurrence_count FROM msdb.dbo.sysalerts ORDER BY name; - 操作员:
SELECT name, enabled, email_address, pager_address, netsend_address FROM msdb.dbo.sysoperators; - 告警通知:
SELECT a.name AS alert_name, o.name AS operator_name, n.notification_method FROM msdb.dbo.sysnotifications n JOIN msdb.dbo.sysalerts a ON n.alert_id = a.id JOIN msdb.dbo.sysoperators o ON n.operator_id = o.id; - 数据库邮件配置:
EXEC msdb.dbo.sysmail_help_configure_sp; - 数据库邮件日志:
SELECT mailitem_id, recipients, subject, sent_status, send_request_date FROM msdb.dbo.sysmail_allitems ORDER BY mailitem_id DESC;
十四、Windows / Linux 系统层运维(481--500)
- Windows 服务状态:
Get-Service -Name 'MSSQL*','SQLSERVERAGENT','SQLBrowser','SQLWriter' | Format-Table Name,Status,StartType - Windows 进程资源:
Get-Process sqlservr | Select-Object Id,CPU,WorkingSet64,StartTime - Windows CPU 计数器:
Get-Counter '\Processor(_Total)\% Processor Time','\System\Processor Queue Length' -SampleInterval 1 -MaxSamples 5 - Windows 内存计数器:
Get-Counter '\Memory\Available MBytes','\Memory\Pages/sec','\Memory\Committed Bytes' -SampleInterval 1 -MaxSamples 5 - Windows 磁盘计数器:
Get-Counter '\PhysicalDisk(_Total)\Avg. Disk sec/Read','\PhysicalDisk(_Total)\Avg. Disk sec/Write','\PhysicalDisk(_Total)\Current Disk Queue Length' -SampleInterval 1 -MaxSamples 5 - Windows 事件日志:
Get-WinEvent -FilterHashtable @{LogName='Application'; StartTime=(Get-Date).AddHours(-24)} -MaxEvents 200 - Windows 端口与连接:
Get-NetTCPConnection -LocalPort 1433 -State Listen; netstat -ano | findstr :1433 - Windows 卷与磁盘:
Get-Volume | Format-Table DriveLetter,FileSystemLabel,Size,SizeRemaining; Get-PhysicalDisk | Format-Table FriendlyName,MediaType,HealthStatus - Windows 故障转移集群:
Get-ClusterNode; Get-ClusterGroup; Get-ClusterResource | Where-Object ResourceType -eq 'SQL Server' - Windows 备份目录与校验:
Get-ChildItem 'D:\Backup' -Recurse | Sort-Object LastWriteTime -Descending | Select-Object -First 20 Name,Length,LastWriteTime; Get-FileHash 'D:\Backup\YourDB_FULL.bak' -Algorithm SHA256 - Linux 服务状态:
sudo systemctl status mssql-server --no-pager; sudo systemctl status mssql-launchpadd --no-pager - Linux 进程资源:
ps -eo pid,ppid,pcpu,pmem,rss,etime,cmd | grep -i '[s]qlservr'; pidstat -p $(pgrep -f sqlservr | head -1) 1 5 - Linux CPU 与内存:
lscpu; free -m; vmstat 1 5; top -b -n1 -o %CPU | head -20 - Linux 磁盘 IO:
iostat -x 1 5; sar -d 1 5 - Linux 磁盘空间:
df -h; df -i; lsblk; findmnt; du -sh /var/opt/mssql/* - Linux 端口与连接:
ss -tulnp | grep 1433; lsof -i :1433 - Linux 日志:
sudo journalctl -u mssql-server -n 200 --no-pager; sudo tail -n 200 /var/opt/mssql/log/errorlog - Linux mssql-conf 配置:
sudo /opt/mssql/bin/mssql-conf get memory.memorylimitmb; cat /var/opt/mssql/mssql.conf - Linux 内核与 OOM:
sudo dmesg -T | grep -iE 'oom|killed process'; sudo sysctl vm.swappiness; ulimit -a - Linux 时间同步与权限:
timedatectl; chronyc tracking; ls -l /var/opt/mssql/data /var/opt/mssql/log; sudo getenforce 2>/dev/null; sudo firewall-cmd --list-all 2>/dev/null
使用提示
- 版本差异 :
sys.dm_db_log_info、sys.dm_db_log_stats需 2016 SP2+;sys.dm_db_stats_histogram需 2016 SP1 CU2+;sys.masked_columns需 2016+;Query Store 需 2016+;ACCELERATED_DATABASE_RECOVERY需 2019+;Linux 版从 SQL Server 2017 起提供。 - 批量执行 :可将同类语句放入
.sql文件,用sqlcmd -S <实例> -E -i check.sql -o result.txt执行;Linux 使用/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -C。 - 权限要求 :DMV 一般需
VIEW SERVER STATE,数据库级 DMV 需VIEW DATABASE STATE,备份历史需msdb相应角色权限。 - 高风险操作 :
DBCC SHRINKFILE、RESTORE、ALTER DATABASE、sp_configure建议在变更窗口执行并先备份。