SQL Server 2012–2022 运维巡检500条完整速查手册(建议收藏)

以下按 SQL Server 2012--2022(Windows / Linux) 整理,共 500 条,按 14 类连续编号。默认以 sqlcmd 执行 T-SQL;标注"2016+ / 2017+ / 2019+"的条目需目标版本支持,低版本请跳过或改用等价 DMV。

说明:数据库名、文件路径、登录名等请替换为实际值;生产环境执行 DBCC、RESTORE、SHRINK 类命令前先评估影响。


一、实例与版本基础信息(1--35)

  1. 查看完整版本:SELECT @@VERSION;
  2. 版本号/补丁级别/版本类型:SELECT SERVERPROPERTY('ProductVersion') AS product_version, SERVERPROPERTY('ProductLevel') AS product_level, SERVERPROPERTY('Edition') AS edition, SERVERPROPERTY('EngineEdition') AS engine_edition;
  3. 实例名与主机名:SELECT SERVERPROPERTY('ServerName') AS server_name, SERVERPROPERTY('InstanceName') AS instance_name, SERVERPROPERTY('MachineName') AS machine_name;
  4. 实例排序规则:SELECT SERVERPROPERTY('Collation') AS server_collation, DATABASEPROPERTYEX(N'master', N'Collation') AS master_collation;
  5. 是否集群/是否启用 AlwaysOn:SELECT SERVERPROPERTY('IsClustered') AS is_clustered, SERVERPROPERTY('IsHadrEnabled') AS is_hadr_enabled;
  6. 启动时间与运行时长:SELECT sqlserver_start_time, DATEDIFF(HOUR, sqlserver_start_time, GETDATE()) AS uptime_hours FROM sys.dm_os_sys_info;
  7. CPU 核数与调度器:SELECT cpu_count, scheduler_count, max_workers_count, hyperthread_ratio FROM sys.dm_os_sys_info;
  8. 物理内存与提交内存: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;
  9. 进程工作集与大页内存: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;
  10. 服务状态:SELECT servicename, startup_type_desc, status_desc, service_account, last_startup_time, is_clustered FROM sys.dm_server_services;
  11. 服务可执行文件路径:SELECT servicename, filename FROM sys.dm_server_services;
  12. 实例注册表信息:SELECT * FROM sys.dm_server_registry WHERE registry_key LIKE N'%MSSQLServer%';
  13. 数据库清单:SELECT name, database_id, state_desc, recovery_model_desc, compatibility_level, collation_name FROM sys.databases ORDER BY database_id;
  14. 数据库状态统计:SELECT state_desc, COUNT(*) AS db_count FROM sys.databases GROUP BY state_desc;
  15. 兼容级别分布:SELECT compatibility_level, COUNT(*) AS db_count FROM sys.databases GROUP BY compatibility_level;
  16. 实例配置概览:SELECT name, value, value_in_use, is_dynamic, is_advanced FROM sys.configurations ORDER BY name;
  17. 启动参数:SELECT * FROM sys.dm_server_registry WHERE registry_key LIKE N'%Parameters%';
  18. 错误日志路径:SELECT SERVERPROPERTY('ErrorLogFileName') AS errorlog_path;
  19. 默认备份目录:SELECT SERVERPROPERTY('InstanceDefaultBackupPath') AS backup_path;
  20. 默认数据/日志目录:SELECT SERVERPROPERTY('InstanceDefaultDataPath') AS data_path, SERVERPROPERTY('InstanceDefaultLogPath') AS log_path;
  21. 当前连接端口与加密:SELECT local_tcp_port, net_transport, auth_scheme, encrypt_option FROM sys.dm_exec_connections WHERE session_id = @@SPID;
  22. TCP 端点:SELECT name, protocol_desc, type_desc, port, is_admin_endpoint FROM sys.tcp_endpoints;
  23. 端点状态:SELECT name, protocol_desc, state_desc, is_admin_endpoint FROM sys.endpoints;
  24. 当前会话身份:SELECT @@SPID AS spid, SUSER_SNAME() AS login_name, DB_NAME() AS dbname, @@SERVERNAME AS server_name;
  25. 本地时间与 UTC:SELECT SYSDATETIME() AS local_time, SYSDATETIMEOFFSET() AS local_offset, GETUTCDATE() AS utc_time;
  26. 语言与区域:SELECT @@LANGUAGE AS language, SERVERPROPERTY('LCID') AS lcid;
  27. 授权信息:SELECT SERVERPROPERTY('LicenseType') AS license_type, SERVERPROPERTY('NumLicenses') AS num_licenses;
  28. 引擎形态(5=Azure SQL DB,8=托管实例):SELECT SERVERPROPERTY('EngineEdition') AS engine_edition;
  29. 资源调控器配置:SELECT * FROM sys.resource_governor_configuration;
  30. 资源池: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;
  31. 工作负载组:SELECT group_id, name, pool_id, importance, max_dop FROM sys.dm_resource_governor_workload_groups;
  32. 跟踪标志状态:DBCC TRACESTATUS(-1) WITH NO_INFOMSGS;
  33. 用户连接上限:SELECT name, value_in_use FROM sys.configurations WHERE name = N'user connections';
  34. 最大工作线程:SELECT name, value_in_use FROM sys.configurations WHERE name = N'max worker threads';
  35. 会话总数与用户会话数: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)

  1. 最小/最大服务器内存:SELECT name, value, value_in_use FROM sys.configurations WHERE name IN (N'min server memory (MB)', N'max server memory (MB)');
  2. 最大并行度:SELECT name, value_in_use FROM sys.configurations WHERE name = N'max degree of parallelism';
  3. 并行开销阈值:SELECT name, value_in_use FROM sys.configurations WHERE name = N'cost threshold for parallelism';
  4. 即席工作负载优化:SELECT name, value_in_use FROM sys.configurations WHERE name = N'optimize for ad hoc workloads';
  5. 默认备份压缩:SELECT name, value_in_use FROM sys.configurations WHERE name = N'backup compression default';
  6. 恢复间隔:SELECT name, value_in_use FROM sys.configurations WHERE name = N'recovery interval (min)';
  7. 远程登录超时:SELECT name, value_in_use FROM sys.configurations WHERE name = N'remote login timeout (s)';
  8. 远程查询超时:SELECT name, value_in_use FROM sys.configurations WHERE name = N'remote query timeout (s)';
  9. 最大锁数:SELECT name, value_in_use FROM sys.configurations WHERE name = N'locks';
  10. 阻塞进程阈值:SELECT name, value_in_use FROM sys.configurations WHERE name = N'blocked process threshold (s)';
  11. 默认跟踪:SELECT name, value_in_use FROM sys.configurations WHERE name = N'default trace enabled';
  12. 网络包大小:SELECT name, value_in_use FROM sys.configurations WHERE name = N'network packet size (B)';
  13. 默认填充因子:SELECT name, value_in_use FROM sys.configurations WHERE name = N'fill factor (%)';
  14. 轻量池:SELECT name, value_in_use FROM sys.configurations WHERE name = N'lightweight pooling';
  15. 优先级提升:SELECT name, value_in_use FROM sys.configurations WHERE name = N'priority boost';
  16. 自动创建统计信息:SELECT name, value_in_use FROM sys.configurations WHERE name = N'auto create statistics';
  17. 自动更新统计信息:SELECT name, value_in_use FROM sys.configurations WHERE name = N'auto update statistics';
  18. 异步更新统计信息:SELECT name, value_in_use FROM sys.configurations WHERE name = N'auto update statistics asynchronously';
  19. 游标阈值:SELECT name, value_in_use FROM sys.configurations WHERE name = N'cursor threshold';
  20. 嵌套触发器:SELECT name, value_in_use FROM sys.configurations WHERE name = N'nested triggers';
  21. 递归触发器:SELECT name, value_in_use FROM sys.configurations WHERE name = N'recursive triggers';
  22. CLR 启用状态:SELECT name, value_in_use FROM sys.configurations WHERE name = N'clr enabled';
  23. 即席分布式查询:SELECT name, value_in_use FROM sys.configurations WHERE name = N'Ad Hoc Distributed Queries';
  24. xp_cmdshell 状态:SELECT name, value_in_use FROM sys.configurations WHERE name = N'xp_cmdshell';
  25. OLE 自动化:SELECT name, value_in_use FROM sys.configurations WHERE name = N'Ole Automation Procedures';
  26. 数据库邮件:SELECT name, value_in_use FROM sys.configurations WHERE name = N'Database Mail XPs';
  27. 代理扩展:SELECT name, value_in_use FROM sys.configurations WHERE name = N'Agent XPs';
  28. 高级选项可见性:SELECT name, value_in_use FROM sys.configurations WHERE name = N'show advanced options';
  29. 全文检索是否安装:SELECT SERVERPROPERTY('IsFullTextInstalled') AS is_fulltext_installed;
  30. 运行值与配置值不一致项:SELECT name, value, value_in_use, is_dynamic FROM sys.configurations WHERE value <> value_in_use;
  31. 服务账号与权限核对:SELECT servicename, service_account FROM sys.dm_server_services WHERE servicename LIKE N'SQL Server%';
  32. 默认跟踪中的配置/对象变更: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);
  33. 最大内存占物理内存比例: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)';
  34. 并行相关配置组合: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');
  35. 高风险安全配置组合: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)

  1. 数据库状态总览:SELECT name, state_desc, user_access_desc, is_read_only, is_in_standby FROM sys.databases ORDER BY name;
  2. 非在线数据库:SELECT name, state_desc FROM sys.databases WHERE state <> 0;
  3. 只读数据库:SELECT name FROM sys.databases WHERE is_read_only = 1;
  4. 自动关闭数据库:SELECT name FROM sys.databases WHERE is_auto_close_on = 1;
  5. 自动收缩数据库:SELECT name FROM sys.databases WHERE is_auto_shrink_on = 1;
  6. 页面校验方式:SELECT name, page_verify_option_desc FROM sys.databases;
  7. 快照隔离状态:SELECT name, snapshot_isolation_state_desc FROM sys.databases;
  8. 已提交读快照:SELECT name, is_read_committed_snapshot_on FROM sys.databases;
  9. 延迟持久化(2014+):SELECT name, delayed_durability_desc FROM sys.databases;
  10. 包含数据库:SELECT name, containment_desc FROM sys.databases;
  11. 用户访问模式:SELECT name, user_access_desc FROM sys.databases;
  12. 数据库完整属性:SELECT * FROM sys.databases ORDER BY database_id;
  13. 数据库总大小排名: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;
  14. 数据文件大小:SELECT DB_NAME(database_id) AS dbname, name, size*8/1024 AS size_mb FROM sys.master_files WHERE type_desc = N'ROWS';
  15. 日志文件大小:SELECT DB_NAME(database_id) AS dbname, name, size*8/1024 AS size_mb FROM sys.master_files WHERE type_desc = N'LOG';
  16. 每库数据与日志汇总: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;
  17. 文件已用与剩余空间: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;
  18. 文件空间使用率: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;
  19. 卷剩余空间: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;
  20. 卷剩余百分比: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;
  21. tempdb 总大小:SELECT SUM(size)*8/1024 AS tempdb_mb FROM tempdb.sys.database_files;
  22. tempdb 文件明细:SELECT name, physical_name, size*8/1024 AS size_mb, growth, is_percent_growth FROM tempdb.sys.database_files;
  23. tempdb 版本存储空间:SELECT * FROM sys.dm_tran_version_store_space_usage;
  24. 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;
  25. 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;
  26. 表空间占用 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;
  27. 表行数 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;
  28. 分区行数与页数: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;
  29. 分配单元统计:SELECT type_desc, COUNT(*) AS allocation_units, SUM(total_pages)*8/1024 AS total_mb FROM sys.allocation_units GROUP BY type_desc;
  30. 文件最大大小设置: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;
  31. 文件增长设置:SELECT DB_NAME(database_id) AS dbname, name, growth, is_percent_growth FROM sys.master_files;
  32. 百分比增长或禁止增长:SELECT DB_NAME(database_id) AS dbname, name, growth, is_percent_growth FROM sys.master_files WHERE is_percent_growth = 1 OR growth = 0;
  33. 文件所在卷: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;
  34. 日志空间使用(所有库):DBCC SQLPERF(LOGSPACE) WITH NO_INFOMSGS;
  35. 日志空间 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;
  36. 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;
  37. 日志统计(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);
  38. 日志截断等待原因:SELECT name, log_reuse_wait_desc FROM sys.databases;
  39. VLF 明细:DBCC LOGINFO WITH NO_INFOMSGS;
  40. 数据库快照:SELECT name, source_database_id, snapshot_isolation_state_desc FROM sys.databases WHERE source_database_id IS NOT NULL;

四、文件、日志与恢复模式管理(111--150)

  1. 恢复模式总览:SELECT name, recovery_model_desc FROM sys.databases;
  2. 简单恢复模式业务库:SELECT name FROM sys.databases WHERE recovery_model_desc = N'SIMPLE' AND database_id > 4;
  3. 大容量日志模式库:SELECT name FROM sys.databases WHERE recovery_model_desc = N'BULK_LOGGED';
  4. 完整模式但近 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()));
  5. 日志文件增长设置:SELECT DB_NAME(database_id) AS dbname, name, growth, is_percent_growth FROM sys.master_files WHERE type_desc = N'LOG';
  6. 数据文件增长设置:SELECT DB_NAME(database_id) AS dbname, name, growth, is_percent_growth FROM sys.master_files WHERE type_desc = N'ROWS';
  7. 百分比自动增长文件:SELECT DB_NAME(database_id) AS dbname, name, growth FROM sys.master_files WHERE is_percent_growth = 1;
  8. 增长值小于 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;
  9. 无最大大小限制:SELECT DB_NAME(database_id) AS dbname, name FROM sys.master_files WHERE max_size = -1;
  10. 数据与日志同卷: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;
  11. 文件物理路径清单:SELECT DB_NAME(database_id) AS dbname, name, physical_name FROM sys.master_files;
  12. 文件组:SELECT name, type_desc, is_default, is_read_only FROM sys.filegroups;
  13. 文件组与文件分布: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();
  14. 只读文件组:SELECT name FROM sys.filegroups WHERE is_read_only = 1;
  15. 文件平均读延迟: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;
  16. 文件平均写延迟: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;
  17. 文件吞吐量: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;
  18. 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;
  19. 待处理 IO 请求:SELECT COUNT(*) AS pending_io, MAX(io_pending_ms_ticks) AS max_pending_ms FROM sys.dm_io_pending_io_requests;
  20. 文件 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;
  21. 可疑页数量:SELECT DB_NAME(database_id) AS dbname, COUNT(*) AS suspect_pages FROM msdb.dbo.suspect_pages GROUP BY database_id;
  22. 文件只读/稀疏属性:SELECT DB_NAME(database_id) AS dbname, name, is_media_read_only, is_read_only, is_sparse FROM sys.master_files;
  23. 缓冲池脏页总数:SELECT COUNT(*) AS dirty_pages FROM sys.dm_os_buffer_descriptors WHERE is_modified = 1;
  24. 每库脏页数量: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;
  25. 每库缓冲页占比: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;
  26. 日志写入等待:SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type = N'WRITELOG';
  27. 日志文件刷新延迟: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;
  28. 日志自动增长事件: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;
  29. 数据文件自动增长事件: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;
  30. 文件自动收缩事件: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);
  31. 数据库所有者:SELECT name, SUSER_SNAME(owner_sid) AS owner FROM sys.databases;
  32. 数据库创建时间:SELECT name, create_date FROM sys.databases ORDER BY create_date;
  33. 每库最后全备时间: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;
  34. 每库最后日志备份时间: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;
  35. 从未备份的数据库: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');
  36. 备份链完整性检查: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());
  37. 恢复模式与备份策略匹配:SELECT name, recovery_model_desc, log_reuse_wait_desc FROM sys.databases WHERE database_id > 4;
  38. 数据库兼容级别:SELECT name, compatibility_level FROM sys.databases ORDER BY compatibility_level;
  39. 数据库排序规则:SELECT name, collation_name FROM sys.databases;
  40. 排序规则与实例不一致:SELECT name, collation_name FROM sys.databases WHERE collation_name <> CONVERT(sysname, SERVERPROPERTY('Collation'));

五、错误日志与诊断日志(151--180)

  1. 读取当前错误日志:EXEC sys.xp_readerrorlog 0, 1, NULL, NULL, NULL, NULL, N'DESC';
  2. 错误日志中的 Error 记录:EXEC sys.xp_readerrorlog 0, 1, N'Error', NULL, NULL, NULL, N'DESC';
  3. 操作系统 I/O 错误:EXEC sys.xp_readerrorlog 0, 1, N'operating system error', NULL, NULL, NULL, N'DESC';
  4. 内存相关错误:EXEC sys.xp_readerrorlog 0, 1, N'memory', NULL, NULL, NULL, N'DESC';
  5. 登录失败:EXEC sys.xp_readerrorlog 0, 1, N'Login failed', NULL, NULL, NULL, N'DESC';
  6. 死锁记录:EXEC sys.xp_readerrorlog 0, 1, N'deadlock', NULL, NULL, NULL, N'DESC';
  7. 备份失败:EXEC sys.xp_readerrorlog 0, 1, N'BACKUP failed', NULL, NULL, NULL, N'DESC';
  8. 损坏相关记录:EXEC sys.xp_readerrorlog 0, 1, N'corrupt', NULL, NULL, NULL, N'DESC';
  9. 还原记录:EXEC sys.xp_readerrorlog 0, 1, N'RESTORE', NULL, NULL, NULL, N'DESC';
  10. 错误日志轮转列表:EXEC sys.xp_enumerrorlogs;
  11. 错误日志文件大小(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*
  12. 默认跟踪文件:SELECT * FROM sys.traces WHERE is_default = 1;
  13. 默认跟踪内容: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);
  14. Agent 错误日志:EXEC sys.xp_readerrorlog 0, 2, NULL, NULL, NULL, NULL, N'DESC';
  15. Agent 日志中的作业失败:EXEC sys.xp_readerrorlog 0, 2, N'failed', NULL, NULL, NULL, N'DESC';
  16. Windows 应用程序日志(MSSQLSERVER):Get-WinEvent -FilterHashtable @{LogName='Application'; ProviderName='MSSQLSERVER'} -MaxEvents 100
  17. Windows 系统日志:Get-WinEvent -LogName System -MaxEvents 100
  18. Linux 服务日志:sudo journalctl -u mssql-server -n 200 --no-pager
  19. Linux 错误日志:sudo tail -n 200 /var/opt/mssql/log/errorlog
  20. Linux 日志中的错误关键字:sudo grep -iE 'error|fail|corrupt' /var/opt/mssql/log/errorlog | tail -100
  21. Linux 内核 OOM 记录:sudo dmesg -T | grep -iE 'oom|killed process'
  22. 扩展事件会话列表: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;
  23. 扩展事件目标: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;
  24. system_health 会话状态:SELECT name, create_time FROM sys.dm_xe_sessions WHERE name = N'system_health';
  25. 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';
  26. 连接环形缓冲区:SELECT CAST(record AS xml) AS rb FROM sys.dm_os_ring_buffers WHERE ring_buffer_type = N'RING_BUFFER_CONNECTIVITY';
  27. 调度器监视环形缓冲区:SELECT CAST(record AS xml) AS rb FROM sys.dm_os_ring_buffers WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR';
  28. 资源监视环形缓冲区:SELECT CAST(record AS xml) AS rb FROM sys.dm_os_ring_buffers WHERE ring_buffer_type = N'RING_BUFFER_RESOURCE_MONITOR';
  29. 内存不足环形缓冲区:SELECT CAST(record AS xml) AS rb FROM sys.dm_os_ring_buffers WHERE ring_buffer_type = N'RING_BUFFER_OOM';
  30. 可疑页明细: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)

  1. 实例 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;
  2. 调度器负载: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';
  3. 工作队列积压:SELECT scheduler_id, work_queue_count FROM sys.dm_os_schedulers WHERE work_queue_count > 0;
  4. 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');
  5. 存在可运行任务的调度器数:SELECT COUNT(*) AS schedulers_with_runnable FROM sys.dm_os_schedulers WHERE runnable_tasks_count > 0;
  6. 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;
  7. 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;
  8. 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;
  9. 编译与重编译次数: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%';
  10. 计划缓存总大小:SELECT SUM(size_in_bytes)/1024/1024 AS plan_cache_mb FROM sys.dm_exec_cached_plans;
  11. 计划缓存命中率: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%';
  12. 单次使用计划数:SELECT COUNT(*) AS single_use_plans FROM sys.dm_exec_cached_plans WHERE usecounts = 1;
  13. 计划缓存占用 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;
  14. 内存 Clerk 占用:SELECT TOP 20 type, SUM(pages_kb)/1024 AS mb FROM sys.dm_os_memory_clerks GROUP BY type ORDER BY mb DESC;
  15. 缓冲池大小:SELECT COUNT(*)*8/1024 AS buffer_pool_mb FROM sys.dm_os_buffer_descriptors;
  16. 页生命周期: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%';
  17. 内存授予等待:SELECT session_id, wait_type, wait_time, wait_resource FROM sys.dm_exec_requests WHERE wait_type LIKE N'RESOURCE_SEMAPHORE%';
  18. 内存授予 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;
  19. 目标内存与提交内存: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;
  20. 系统可用物理内存: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;
  21. 系统内存状态:SELECT system_memory_state_desc FROM sys.dm_os_sys_memory;
  22. 缓冲池扩展:SELECT * FROM sys.dm_os_buffer_pool_extension_configuration;
  23. 内存优化表内存: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;
  24. 列存储行组状态(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;
  25. 锁内存占用:SELECT SUM(pages_kb)/1024 AS lock_mb FROM sys.dm_os_memory_clerks WHERE type = N'LOCK_MANAGER';
  26. 连接内存占用:SELECT SUM(pages_kb)/1024 AS connection_mb FROM sys.dm_os_memory_clerks WHERE type LIKE N'%CONNECTION%';
  27. 每库缓存页: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;
  28. 脏页总数:SELECT COUNT(*) AS dirty_pages FROM sys.dm_os_buffer_descriptors WHERE is_modified = 1;
  29. 检查点写入页: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%';
  30. 惰性写入: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%';
  31. 文件 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;
  32. 数据库 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;
  33. 数据库 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;
  34. 读等待排名: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;
  35. 写等待排名: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;
  36. 待处理 IO:SELECT COUNT(*) AS pending_io FROM sys.dm_io_pending_io_requests;
  37. 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;
  38. 读延迟超过 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;
  39. 写延迟超过 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;
  40. 每库 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;
  41. 缓冲页占比: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;
  42. NUMA 节点:SELECT node_id, node_state_desc, memory_node_id, processor_group, online_scheduler_count, active_worker_count FROM sys.dm_os_nodes;
  43. CPU 亲和性:SELECT parent_node_id, scheduler_id, cpu_id, is_online, is_idle FROM sys.dm_os_schedulers WHERE status = N'VISIBLE ONLINE';
  44. 软 NUMA:SELECT name, value_in_use FROM sys.configurations WHERE name = N'soft-numa';
  45. 处理器信息:SELECT cpu_count, hyperthread_ratio, scheduler_count, numa_node_count FROM sys.dm_os_sys_info;
  46. SQL Server 工作集:SELECT physical_memory_in_use_kb/1024 AS working_set_mb FROM sys.dm_os_process_memory;
  47. 虚拟地址空间: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;
  48. 内存转储配置:SELECT name, value_in_use FROM sys.configurations WHERE name IN (N'max dump count', N'min memory per query (KB)');
  49. 最大服务器内存建议值: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;
  50. 缓冲缓存命中率: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%';
  51. 页生命周期当前值: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%';
  52. 内存授予超时: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');
  53. 资源信号量:SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type LIKE N'RESOURCE_SEMAPHORE%';
  54. 内存压力等待: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');
  55. 单次使用计划占比: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)

  1. 等待统计 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;
  2. 排除良性等待后的 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;
  3. 当前等待任务: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;
  4. 当前阻塞链: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;
  5. 头阻塞会话: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;
  6. 阻塞源 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;
  7. 被阻塞 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;
  8. 当前锁列表: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';
  9. 锁等待:SELECT request_session_id, resource_type, request_mode, request_status FROM sys.dm_tran_locks WHERE request_status IN (N'WAIT', N'CONVERT');
  10. 锁升级:SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type LIKE N'LCK_M_%';
  11. 意向锁冲突: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;
  12. 死锁计数: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%';
  13. 死锁图(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);
  14. 死锁受害者与资源:SELECT request_session_id, resource_type, request_mode, request_status FROM sys.dm_tran_locks WHERE request_status = N'WAIT';
  15. 活动事务:SELECT transaction_id, name, transaction_begin_time, transaction_type, transaction_state FROM sys.dm_tran_active_transactions ORDER BY transaction_begin_time;
  16. 长事务: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;
  17. 最老活动事务:SELECT TOP 1 transaction_id, name, transaction_begin_time FROM sys.dm_tran_active_transactions ORDER BY transaction_begin_time;
  18. 当前库打开事务:DBCC OPENTRAN WITH NO_INFOMSGS;
  19. 会话事务:SELECT session_id, transaction_id, is_local, is_enlisted FROM sys.dm_tran_session_transactions;
  20. 数据库事务:SELECT database_transaction_id, transaction_id, database_id, database_transaction_begin_time, database_transaction_state FROM sys.dm_tran_database_transactions;
  21. 事务日志使用: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;
  22. 版本存储:SELECT DB_NAME(database_id) AS dbname, reserved_space_kb/1024 AS reserved_mb FROM sys.dm_tran_version_store_space_usage;
  23. 快照隔离冲突: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');
  24. 行版本等待:SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type LIKE N'%VERSION%';
  25. 锁等待类型: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;
  26. 页 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;
  27. 并行等待:SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type IN (N'CXPACKET', N'CXCONSUMER');
  28. 调度器让出等待:SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type = N'SOS_SCHEDULER_YIELD';
  29. 内存信号量等待:SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type LIKE N'RESOURCE_SEMAPHORE%';
  30. 异步 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');
  31. 日志写入等待:SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type = N'WRITELOG';
  32. AlwaysOn 同步提交等待:SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type = N'HADR_SYNC_COMMIT';
  33. 线程池等待:SELECT wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats WHERE wait_type = N'THREADPOOL';
  34. 内存分配等待: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');
  35. 等待类别汇总: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;
  36. 闩锁统计: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;
  37. 自旋锁统计:SELECT TOP 20 name, collisions, spins, spins_per_collision FROM sys.dm_os_spinlock_stats ORDER BY spins DESC;
  38. 锁超时错误: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');
  39. 阻塞进程报告配置:SELECT name, value_in_use FROM sys.configurations WHERE name = N'blocked process threshold (s)';
  40. 会话死锁优先级:SELECT session_id, deadlock_priority FROM sys.dm_exec_sessions WHERE is_user_process = 1;

八、会话、连接与请求(276--305)

  1. 会话总览:SELECT session_id, login_name, host_name, program_name, status, login_time FROM sys.dm_exec_sessions WHERE is_user_process = 1;
  2. 活动请求: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;
  3. 长时间运行请求: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;
  4. 按登录名统计会话:SELECT login_name, COUNT(*) AS sessions FROM sys.dm_exec_sessions WHERE is_user_process = 1 GROUP BY login_name ORDER BY sessions DESC;
  5. 按程序名统计会话:SELECT program_name, COUNT(*) AS sessions FROM sys.dm_exec_sessions WHERE is_user_process = 1 GROUP BY program_name ORDER BY sessions DESC;
  6. 按主机名统计会话:SELECT host_name, COUNT(*) AS sessions FROM sys.dm_exec_sessions WHERE is_user_process = 1 GROUP BY host_name ORDER BY sessions DESC;
  7. 连接数统计:SELECT net_transport, COUNT(*) AS connections FROM sys.dm_exec_connections GROUP BY net_transport;
  8. 客户端 IP 分布:SELECT client_net_address, COUNT(*) AS connections FROM sys.dm_exec_connections GROUP BY client_net_address ORDER BY connections DESC;
  9. 加密连接:SELECT encrypt_option, COUNT(*) AS connections FROM sys.dm_exec_connections GROUP BY encrypt_option;
  10. 认证方式:SELECT auth_scheme, COUNT(*) AS connections FROM sys.dm_exec_connections GROUP BY auth_scheme;
  11. 会话内存使用: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;
  12. 会话 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;
  13. 会话读写量:SELECT session_id, login_name, reads, writes, logical_reads FROM sys.dm_exec_sessions WHERE is_user_process = 1 ORDER BY logical_reads DESC;
  14. 请求等待明细:SELECT session_id, wait_type, wait_time, wait_resource, blocking_session_id FROM sys.dm_exec_requests WHERE wait_type IS NOT NULL;
  15. 请求执行进度:SELECT session_id, command, percent_complete, estimated_completion_time/1000 AS eta_sec FROM sys.dm_exec_requests WHERE percent_complete > 0;
  16. 并行度:SELECT session_id, dop, command FROM sys.dm_exec_requests WHERE dop > 1;
  17. 授予内存:SELECT session_id, granted_memory_kb/1024 AS granted_mb, requested_memory_kb/1024 AS requested_mb FROM sys.dm_exec_query_memory_grants;
  18. 会话打开事务数:SELECT session_id, COUNT(*) AS open_transactions FROM sys.dm_tran_session_transactions GROUP BY session_id;
  19. 会话隔离级别:SELECT session_id, transaction_isolation_level FROM sys.dm_exec_sessions WHERE is_user_process = 1;
  20. 会话锁超时:SELECT session_id, lock_timeout FROM sys.dm_exec_sessions WHERE is_user_process = 1;
  21. 会话死锁优先级:SELECT session_id, deadlock_priority FROM sys.dm_exec_sessions WHERE is_user_process = 1;
  22. 会话状态:SELECT status, COUNT(*) AS sessions FROM sys.dm_exec_sessions WHERE is_user_process = 1 GROUP BY status;
  23. 空闲会话:SELECT session_id, login_name, status, last_request_end_time FROM sys.dm_exec_sessions WHERE status = N'sleeping' AND is_user_process = 1;
  24. 睡眠会话时长: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;
  25. 会话登录时间: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;
  26. 会话最后请求时间:SELECT session_id, login_name, last_request_start_time, last_request_end_time FROM sys.dm_exec_sessions WHERE is_user_process = 1;
  27. 连接传输类型:SELECT net_transport, protocol_type, protocol_version, num_reads, num_writes FROM sys.dm_exec_connections;
  28. 异常程序名: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;
  29. 每数据库会话数: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;
  30. 会话按状态与登录汇总: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)

  1. 碎片率超过 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;
  2. 碎片率 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;
  3. 页密度低于 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;
  4. 从未使用的索引: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;
  5. 索引查找与扫描次数: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;
  6. 索引更新次数: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;
  7. 缺失索引: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;
  8. 缺失索引开销: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;
  9. 重复索引: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;
  10. 重叠索引: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);
  11. 写多读少的索引: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;
  12. 索引行锁等待: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;
  13. 索引页闩锁等待: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;
  14. 索引 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;
  15. 统计信息更新时间: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;
  16. 统计信息过期: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;
  17. 统计信息采样率: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;
  18. 统计信息直方图(2016 SP1 CU2+):SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID(N'dbo.YourTable'), 1);
  19. 自动创建统计信息:SELECT name, is_auto_create_stats_on FROM sys.databases;
  20. 自动更新统计信息:SELECT name, is_auto_update_stats_on, is_auto_update_stats_async_on FROM sys.databases;
  21. 统计信息行数与实际行数偏差: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;
  22. 索引压缩: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';
  23. 压缩收益评估: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';
  24. 分区索引: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;
  25. 分区边界: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;
  26. 索引填充因子:SELECT OBJECT_NAME(object_id) AS table_name, name AS index_name, fill_factor FROM sys.indexes WHERE fill_factor <> 0;
  27. 禁用索引:SELECT OBJECT_NAME(object_id) AS table_name, name AS index_name, type_desc FROM sys.indexes WHERE is_disabled = 1;
  28. 索引状态: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;
  29. 索引键列: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;
  30. 包含列: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;
  31. 筛选索引:SELECT OBJECT_NAME(object_id) AS table_name, name AS index_name, filter_definition FROM sys.indexes WHERE has_filter = 1;
  32. 列存储索引:SELECT OBJECT_NAME(object_id) AS table_name, name AS index_name, type_desc FROM sys.indexes WHERE type IN (5,6);
  33. 全文索引:SELECT OBJECT_NAME(object_id) AS table_name, name, is_enabled, change_tracking_state_desc FROM sys.fulltext_indexes;
  34. 索引重建/变更记录: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;
  35. 索引维护作业:SELECT j.name, j.enabled FROM msdb.dbo.sysjobs j WHERE j.name LIKE N'%Index%' OR j.name LIKE N'%索引%';
  36. 堆碎片: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;
  37. 堆转发记录: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;
  38. 鬼影记录: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;
  39. 表索引一致性检查:DBCC CHECKTABLE(N'dbo.YourTable') WITH NO_INFOMSGS, ALL_ERRORMSGS;
  40. 索引物理统计明细:SELECT * FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID(N'dbo.YourTable'), NULL, NULL, 'DETAILED');

十、备份与恢复(346--405)

  1. 全备历史: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;
  2. 差异备份历史: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;
  3. 日志备份历史: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;
  4. 每库最后全备: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;
  5. 每库最后差异备份: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;
  6. 每库最后日志备份: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;
  7. 备份失败记录: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;
  8. 备份大小趋势: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;
  9. 备份压缩率: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());
  10. 备份耗时: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;
  11. 备份设备:SELECT name, physical_name, type_desc, is_default FROM sys.backup_devices;
  12. 备份物理路径: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;
  13. 备份文件是否存在:EXEC master.dbo.xp_fileexist N'D:\Backup\YourDB_FULL.bak';
  14. 备份校验和:SELECT database_name, backup_start_date, has_backup_checksums FROM msdb.dbo.backupset WHERE backup_start_date >= DATEADD(DAY,-7,GETDATE());
  15. 备份过期时间:SELECT database_name, backup_start_date, expires_on FROM msdb.dbo.backupset WHERE expires_on IS NOT NULL AND expires_on < GETDATE();
  16. 备份加密:SELECT database_name, backup_start_date, key_algorithm, encryptor_thumbprint FROM msdb.dbo.backupset WHERE key_algorithm IS NOT NULL;
  17. 仅复制备份:SELECT database_name, backup_start_date, is_copy_only FROM msdb.dbo.backupset WHERE is_copy_only = 1;
  18. 备份链 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;
  19. 备份介质集:SELECT media_set_id, media_family_count, family_count, mirror_count FROM msdb.dbo.backupmediaset ORDER BY media_set_id DESC;
  20. 备份到 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://%';
  21. 备份作业状态: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'%备份%';
  22. 备份作业历史: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;
  23. 恢复历史:SELECT restore_date, destination_database_name, user_name, backup_set_id, restore_type FROM msdb.dbo.restorehistory ORDER BY restore_date DESC;
  24. 恢复失败: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;
  25. 恢复耗时: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());
  26. 备份验证:RESTORE VERIFYONLY FROM DISK = N'D:\Backup\YourDB_FULL.bak' WITH CHECKSUM;
  27. 备份头信息:RESTORE HEADERONLY FROM DISK = N'D:\Backup\YourDB_FULL.bak';
  28. 备份文件列表:RESTORE FILELISTONLY FROM DISK = N'D:\Backup\YourDB_FULL.bak';
  29. 备份介质标签:RESTORE LABELONLY FROM DISK = N'D:\Backup\YourDB_FULL.bak';
  30. 数据库完整性检查:DBCC CHECKDB(N'YourDB') WITH NO_INFOMSGS, ALL_ERRORMSGS;
  31. 物理一致性检查:DBCC CHECKDB(N'YourDB') WITH PHYSICAL_ONLY, NO_INFOMSGS;
  32. 表一致性检查:DBCC CHECKTABLE(N'dbo.YourTable') WITH NO_INFOMSGS;
  33. 文件组一致性检查:DBCC CHECKFILEGROUP WITH NO_INFOMSGS;
  34. 分配一致性检查:DBCC CHECKALLOC(N'YourDB') WITH NO_INFOMSGS;
  35. 系统目录一致性检查:DBCC CHECKCATALOG(N'YourDB') WITH NO_INFOMSGS;
  36. 可疑页:SELECT database_id, file_id, page_id, event_type, error_count FROM msdb.dbo.suspect_pages;
  37. 页自动修复:SELECT * FROM sys.dm_hadr_auto_page_repair;
  38. 页还原:RESTORE DATABASE YourDB PAGE = N'1:1234' FROM DISK = N'D:\Backup\YourDB_FULL.bak' WITH NORECOVERY;
  39. 尾日志备份:BACKUP LOG YourDB TO DISK = N'D:\Backup\YourDB_TAIL.trn' WITH NORECOVERY, NO_TRUNCATE;
  40. 日志链断裂检查: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;
  41. 恢复模式切换:ALTER DATABASE YourDB SET RECOVERY FULL;
  42. 简单模式日志截断:SELECT name, log_reuse_wait_desc FROM sys.databases WHERE recovery_model_desc = N'SIMPLE';
  43. 日志备份频率检查: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;
  44. 日志空间不足: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;
  45. 日志增长: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;
  46. 日志收缩:DBCC SHRINKFILE (N'YourDB_log', 1024);
  47. 数据文件收缩:DBCC SHRINKFILE (N'YourDB_Data', 10240);
  48. 自动增长事件: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);
  49. 数据库快照回滚:RESTORE DATABASE YourDB FROM DATABASE_SNAPSHOT = N'YourDB_Snap';
  50. 时间点恢复: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;
  51. STANDBY 只读还原:RESTORE DATABASE YourDB FROM DISK = N'D:\Backup\YourDB_FULL.bak' WITH STANDBY = N'D:\Backup\YourDB_STANDBY.bak';
  52. 文件组还原:RESTORE DATABASE YourDB FILEGROUP = N'PRIMARY' FROM DISK = N'D:\Backup\YourDB_FULL.bak' WITH NORECOVERY;
  53. 页面还原:RESTORE DATABASE YourDB PAGE = N'1:1234' FROM DISK = N'D:\Backup\YourDB_FULL.bak' WITH NORECOVERY;
  54. 部分还原:RESTORE DATABASE YourDB FILEGROUP = N'PRIMARY' FROM DISK = N'D:\Backup\YourDB_FULL.bak' WITH PARTIAL, NORECOVERY;
  55. 在线还原:RESTORE DATABASE YourDB FROM DISK = N'D:\Backup\YourDB_FULL.bak' WITH ONLINE, NORECOVERY;
  56. 加速数据库恢复(2019+):ALTER DATABASE YourDB SET ACCELERATED_DATABASE_RECOVERY = ON;
  57. 备份压缩配置:EXEC sys.sp_configure N'backup compression default', 1; RECONFIGURE;
  58. 备份限速:BACKUP DATABASE YourDB TO DISK = N'D:\Backup\YourDB_FULL.bak' WITH MAXTRANSFERSIZE = 4194304, BUFFERCOUNT = 50;
  59. 镜像备份:BACKUP DATABASE YourDB TO DISK = N'D:\Backup\A.bak' MIRROR TO DISK = N'E:\Backup\B.bak' WITH FORMAT, INIT;
  60. 备份校验配置:EXEC sys.sp_configure N'backup checksum default', 1; RECONFIGURE;

十一、高可用与复制(406--435)

  1. 可用性组列表:SELECT name, cluster_type_desc, automated_backup_preference_desc FROM sys.availability_groups;
  2. 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;
  3. 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;
  4. 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;
  5. 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;
  6. 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;
  7. AG 健康状态:SELECT ag.name AS ag_name, ag.primary_recovery_health_desc, ag.secondary_recovery_health_desc FROM sys.availability_groups ag;
  8. AG 故障转移模式:SELECT ar.replica_server_name, ar.failover_mode_desc, ar.availability_mode_desc FROM sys.availability_replicas ar;
  9. AG 可用性模式:SELECT ar.replica_server_name, ar.availability_mode_desc, ar.session_timeout FROM sys.availability_replicas ar;
  10. AG 自动页修复:SELECT * FROM sys.dm_hadr_auto_page_repair;
  11. 集群节点:SELECT member_name, member_type_desc, member_state_desc, number_of_quorum_votes FROM sys.dm_hadr_cluster_members;
  12. 集群仲裁:SELECT cluster_name, quorum_type_desc, quorum_state_desc FROM sys.dm_hadr_cluster;
  13. 集群网络:SELECT member_name, network_subnet_ip, is_public, state_desc FROM sys.dm_hadr_cluster_networks;
  14. 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;
  15. AG 备份优先级:SELECT ar.replica_server_name, ar.backup_priority, ar.seeding_mode_desc FROM sys.availability_replicas ar;
  16. 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;
  17. AG 种子模式:SELECT ar.replica_server_name, ar.seeding_mode_desc FROM sys.availability_replicas ar;
  18. 数据库镜像状态: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;
  19. 镜像连接:SELECT connection_id, database_id, is_peer, state_desc FROM sys.dm_db_mirroring_connections;
  20. 日志传送主库:SELECT primary_database, backup_directory, backup_retention_period, backup_threshold, threshold_alert_enabled FROM msdb.dbo.log_shipping_monitor_primary;
  21. 日志传送备库:SELECT secondary_server, secondary_database, restore_delay, last_restored_file, last_restored_date FROM msdb.dbo.log_shipping_monitor_secondary;
  22. 日志传送延迟:SELECT secondary_database, last_restored_date, DATEDIFF(MINUTE, last_restored_date, GETDATE()) AS delay_min FROM msdb.dbo.log_shipping_monitor_secondary;
  23. 日志传送历史:SELECT * FROM msdb.dbo.log_shipping_monitor_history_detail ORDER BY log_time DESC;
  24. 日志传送告警:SELECT * FROM msdb.dbo.log_shipping_monitor_alert;
  25. 复制发布:SELECT name, publication_type, status, sync_method FROM distribution.dbo.MSpublications;
  26. 复制订阅: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;
  27. 复制延迟:SELECT publisher_database_id, subscriber, latency, status FROM distribution.dbo.MSdistribution_status;
  28. 复制代理状态:SELECT name, status, startup_time, last_execution_time FROM msdb.dbo.sysjobs WHERE name LIKE N'%Replication%';
  29. CDC 状态:SELECT name, is_cdc_enabled FROM sys.databases;
  30. 变更跟踪:SELECT name, is_change_tracking_on FROM sys.databases;

十二、安全、权限与审计(436--460)

  1. 登录名列表: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;
  2. 禁用登录名:SELECT name, type_desc FROM sys.server_principals WHERE is_disabled = 1;
  3. SQL 登录密码策略:SELECT name, is_policy_checked, is_expiration_checked FROM sys.sql_logins;
  4. 密码过期登录:SELECT name, LOGINPROPERTY(name,'DaysUntilExpiration') AS days_until_expiration FROM sys.sql_logins WHERE LOGINPROPERTY(name,'DaysUntilExpiration') IS NOT NULL;
  5. 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';
  6. 服务器角色成员: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;
  7. 数据库角色成员: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;
  8. 服务器权限授予: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';
  9. 权限拒绝: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';
  10. 孤儿用户: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;';
  11. 数据库所有者:SELECT name, SUSER_SNAME(owner_sid) AS owner FROM sys.databases;
  12. 证书:SELECT name, subject, expiry_date, pvt_key_encryption_type_desc FROM sys.certificates;
  13. 对称密钥:SELECT name, algorithm_desc, key_length, create_date FROM sys.symmetric_keys;
  14. 非对称密钥:SELECT name, algorithm_desc, key_length, create_date FROM sys.asymmetric_keys;
  15. TDE 状态:SELECT DB_NAME(database_id) AS dbname, encryption_state_desc, percent_complete, key_algorithm, key_length FROM sys.dm_database_encryption_keys;
  16. 加密密钥轮换:SELECT DB_NAME(database_id) AS dbname, key_algorithm, key_length, encryptor_type FROM sys.dm_database_encryption_keys;
  17. 服务器审核:SELECT name, type_desc, is_state_enabled, audit_file_path FROM sys.server_audits;
  18. 审核运行状态:SELECT name, status_desc, status_time, audit_file_path FROM sys.dm_server_audit_status;
  19. 审核文件读取:SELECT * FROM sys.fn_get_audit_file(N'D:\Audit\*.sqlaudit', DEFAULT, DEFAULT);
  20. 登录失败统计:SELECT counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE counter_name = N'Logins/sec' AND object_name LIKE N'%General Statistics%';
  21. 行级安全:SELECT name, is_enabled, is_schema_bound FROM sys.security_policies;
  22. 动态数据掩码(2016+):SELECT OBJECT_NAME(object_id) AS table_name, name AS column_name, masking_function FROM sys.masked_columns;
  23. 敏感数据分类(2019+/SSMS):SELECT class_desc, major_id, minor_id, label, information_type FROM sys.sensitivity_classifications;
  24. 链接服务器:SELECT name, product, provider, data_source, is_linked, is_remote_login_enabled, is_rpc_out_enabled FROM sys.servers WHERE server_id <> 0;
  25. 链接服务器登录映射: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)

  1. 作业列表: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;
  2. 禁用作业:SELECT name FROM msdb.dbo.sysjobs WHERE enabled = 0;
  3. 失败作业: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));
  4. 作业失败历史: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;
  5. 作业运行时长: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;
  6. 作业调度: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;
  7. 作业下次运行时间: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;
  8. 作业所有者:SELECT name, SUSER_SNAME(owner_sid) AS owner FROM msdb.dbo.sysjobs ORDER BY owner;
  9. 作业步骤: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;
  10. 作业目标服务器: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;
  11. 维护计划:SELECT name, enabled, date_created, date_modified FROM msdb.dbo.sysmaintplan_plans;
  12. 维护计划历史:SELECT plan_name, start_time, end_time, succeeded FROM msdb.dbo.sysmaintplan_log ORDER BY start_time DESC;
  13. 索引重建作业: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%';
  14. 统计更新作业: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%';
  15. 备份作业: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%';
  16. 告警配置:SELECT name, severity, message_id, enabled, delay_between_responses, last_occurrence_date, occurrence_count FROM msdb.dbo.sysalerts ORDER BY name;
  17. 操作员:SELECT name, enabled, email_address, pager_address, netsend_address FROM msdb.dbo.sysoperators;
  18. 告警通知: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;
  19. 数据库邮件配置:EXEC msdb.dbo.sysmail_help_configure_sp;
  20. 数据库邮件日志:SELECT mailitem_id, recipients, subject, sent_status, send_request_date FROM msdb.dbo.sysmail_allitems ORDER BY mailitem_id DESC;

十四、Windows / Linux 系统层运维(481--500)

  1. Windows 服务状态:Get-Service -Name 'MSSQL*','SQLSERVERAGENT','SQLBrowser','SQLWriter' | Format-Table Name,Status,StartType
  2. Windows 进程资源:Get-Process sqlservr | Select-Object Id,CPU,WorkingSet64,StartTime
  3. Windows CPU 计数器:Get-Counter '\Processor(_Total)\% Processor Time','\System\Processor Queue Length' -SampleInterval 1 -MaxSamples 5
  4. Windows 内存计数器:Get-Counter '\Memory\Available MBytes','\Memory\Pages/sec','\Memory\Committed Bytes' -SampleInterval 1 -MaxSamples 5
  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
  6. Windows 事件日志:Get-WinEvent -FilterHashtable @{LogName='Application'; StartTime=(Get-Date).AddHours(-24)} -MaxEvents 200
  7. Windows 端口与连接:Get-NetTCPConnection -LocalPort 1433 -State Listen; netstat -ano | findstr :1433
  8. Windows 卷与磁盘:Get-Volume | Format-Table DriveLetter,FileSystemLabel,Size,SizeRemaining; Get-PhysicalDisk | Format-Table FriendlyName,MediaType,HealthStatus
  9. Windows 故障转移集群:Get-ClusterNode; Get-ClusterGroup; Get-ClusterResource | Where-Object ResourceType -eq 'SQL Server'
  10. 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
  11. Linux 服务状态:sudo systemctl status mssql-server --no-pager; sudo systemctl status mssql-launchpadd --no-pager
  12. Linux 进程资源:ps -eo pid,ppid,pcpu,pmem,rss,etime,cmd | grep -i '[s]qlservr'; pidstat -p $(pgrep -f sqlservr | head -1) 1 5
  13. Linux CPU 与内存:lscpu; free -m; vmstat 1 5; top -b -n1 -o %CPU | head -20
  14. Linux 磁盘 IO:iostat -x 1 5; sar -d 1 5
  15. Linux 磁盘空间:df -h; df -i; lsblk; findmnt; du -sh /var/opt/mssql/*
  16. Linux 端口与连接:ss -tulnp | grep 1433; lsof -i :1433
  17. Linux 日志:sudo journalctl -u mssql-server -n 200 --no-pager; sudo tail -n 200 /var/opt/mssql/log/errorlog
  18. Linux mssql-conf 配置:sudo /opt/mssql/bin/mssql-conf get memory.memorylimitmb; cat /var/opt/mssql/mssql.conf
  19. Linux 内核与 OOM:sudo dmesg -T | grep -iE 'oom|killed process'; sudo sysctl vm.swappiness; ulimit -a
  20. 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 建议在变更窗口执行并先备份。