SQL Server DBA 实用的 100 条命令(建议收藏)
2026/8/1 11:49:08 网站建设 项目流程

前言

做 SQL Server DBA,真正考验能力的不是会不会创建数据库,而是在生产环境出现 CPU 飙高、SQL 卡顿、阻塞堆积、日志暴涨、Always On 延迟时,能快速找到问题原因。

SQL Server 提供了大量 DMV(Dynamic Management Views)用于监控和诊断,这些 DMV 是 DBA 日常排障最重要的工具。

下面整理 100 条生产环境高频使用命令:

  • SQL Server 日常巡检
  • 性能问题定位
  • 阻塞与锁分析
  • SQL 优化
  • 索引维护
  • Always On
  • 备份恢复
  • 权限管理

适用于 SQL Server 2016 / 2017 / 2019 / 2022。

一、实例基础信息(1-10)

1. 查看 SQL Server 版本

SELECT @@VERSION;

2. 查看详细版本信息

SELECT SERVERPROPERTY('ProductVersion') AS Version, SERVERPROPERTY('ProductLevel') AS Level, SERVERPROPERTY('Edition') AS Edition, SERVERPROPERTY('EngineEdition') AS EngineEdition;

3. 查看实例名称

SELECT SERVERPROPERTY('ServerName');

4. 查看当前时间

SELECT GETDATE();

5. 查看 SQL Server 启动时间

SELECT sqlserver_start_time FROM sys.dm_os_sys_info;

6. 查看服务器 CPU 和内存

SELECT cpu_count, physical_memory_kb/1024 AS memory_mb, virtual_machine_type_desc FROM sys.dm_os_sys_info;

7. 查看 SQL Server 最大内存配置

SELECT name, value_in_use FROM sys.configurations WHERE name='max server memory (MB)';

8. 查看当前数据库

SELECT DB_NAME();

9. 查看所有数据库状态

SELECT name, state_desc, recovery_model_desc, compatibility_level FROM sys.databases;

10. 查看数据库创建时间

SELECT name, create_date FROM sys.databases;

二、数据库空间管理(11-20)

11. 查看数据库文件

SELECT DB_NAME(database_id) AS database_name, name, physical_name, size*8/1024 AS size_mb FROM sys.master_files;

12. 查看数据文件和日志文件

SELECT DB_NAME(database_id) AS database_name, name, type_desc, size*8/1024 AS size_mb FROM sys.master_files;

13. 查看数据库大小排行

SELECT DB_NAME(database_id) AS database_name, SUM(size)*8/1024 AS size_mb FROM sys.master_files GROUP BY database_id ORDER BY size_mb DESC;

14. 查看日志文件大小

SELECT DB_NAME(database_id), name, size*8/1024 AS log_mb FROM sys.master_files WHERE type_desc='LOG';

15. 查看日志使用率

DBCC SQLPERF(LOGSPACE);

16. 查看数据库空间使用

EXEC sp_spaceused;

17. 查看最大表

SELECT TOP 20 OBJECT_NAME(object_id) AS table_name, SUM(reserved_page_count)*8/1024 AS size_mb FROM sys.dm_db_partition_stats GROUP BY object_id ORDER BY size_mb DESC;

18. 查看表行数

SELECT OBJECT_NAME(object_id), SUM(rows) FROM sys.partitions WHERE index_id IN (0,1) GROUP BY object_id;

19. 查看文件增长设置

SELECT name, growth, is_percent_growth FROM sys.database_files;

20. 查看数据库恢复模式

SELECT name, recovery_model_desc FROM sys.databases;

三、Session 与连接排查(21-35)

21. 查看当前连接

SELECT * FROM sys.dm_exec_sessions;

22. 查看正在执行 SQL

SELECT session_id, status, command, cpu_time, total_elapsed_time, wait_type, blocking_session_id FROM sys.dm_exec_requests;

23. 查看完整 SQL 文本

SELECT r.session_id, t.text FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle)t;

24. 查看活动用户连接

SELECT login_name, COUNT(*) FROM sys.dm_exec_sessions GROUP BY login_name;

25. 查看客户端来源

SELECT host_name, program_name, login_name, COUNT(*) FROM sys.dm_exec_sessions GROUP BY host_name, program_name, login_name;

26. 查看长时间运行 SQL

SELECT session_id, start_time, total_elapsed_time/1000 AS seconds, command FROM sys.dm_exec_requests ORDER BY total_elapsed_time DESC;

27. 查看 CPU 消耗 Session

SELECT TOP 20 session_id, cpu_time, logical_reads FROM sys.dm_exec_requests ORDER BY cpu_time DESC;

28. 查看当前等待

SELECT session_id, wait_type, wait_time, blocking_session_id FROM sys.dm_exec_requests WHERE wait_type IS NOT NULL;

29. 查看阻塞 Session

SELECT session_id, blocking_session_id, wait_type FROM sys.dm_exec_requests WHERE blocking_session_id<>0;

30. 查看完整阻塞链

SELECT blocking_session_id, session_id, wait_type, wait_time FROM sys.dm_exec_requests WHERE blocking_session_id > 0;

31. 查看空闲连接

SELECT session_id, status, last_request_start_time FROM sys.dm_exec_sessions WHERE status='sleeping';

32. 杀掉 Session

KILL 57;

33. 查看连接限制

SELECT name, value_in_use FROM sys.configurations WHERE name='user connections';

34. 查看登录失败

EXEC xp_readerrorlog;

35. 查看当前等待事件排行

SELECT TOP 20 wait_type, waiting_tasks_count, wait_time_ms FROM sys.dm_os_wait_stats ORDER BY wait_time_ms DESC;

四、锁、事务与阻塞(36-50)

36. 查看当前锁

SELECT * FROM sys.dm_tran_locks;

37. 查看打开事务

DBCC OPENTRAN;

38. 查看活动事务

SELECT * FROM sys.dm_tran_active_transactions;

39. 查看长事务

SELECT session_id, transaction_id, transaction_begin_time FROM sys.dm_tran_session_transactions;

40. 查看锁等待

SELECT request_session_id, resource_type, request_mode, request_status FROM sys.dm_tran_locks WHERE request_status='WAIT';

41. 查看阻塞 SQL

SELECT blocking_session_id, session_id, wait_type, wait_time FROM sys.dm_exec_requests WHERE blocking_session_id<>0;

42. 查看死锁

SELECT * FROM system_health.session_targets;

43. 查看隔离级别

DBCC USEROPTIONS;

44. 查看当前事务数量

SELECT COUNT(*) FROM sys.dm_tran_active_transactions;

45. 查看版本存储空间

SELECT * FROM sys.dm_tran_version_store_space_usage;

46. 查看 TempDB 版本存储

SELECT * FROM sys.dm_db_file_space_usage;

47. 查看锁数量

SELECT COUNT(*) FROM sys.dm_tran_locks;

48. 查看等待资源

SELECT wait_type, resource_description FROM sys.dm_os_waiting_tasks;

49. 查看当前死锁监控

SELECT * FROM sys.dm_xe_sessions;

50. 强制结束阻塞

KILL session_id;

五、SQL 性能分析(51-65)

51. CPU 消耗最高 SQL

SELECT TOP 20 qs.total_worker_time, qt.text FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt ORDER BY qs.total_worker_time DESC;

52. 执行次数最高 SQL

SELECT TOP 20 execution_count, text FROM sys.dm_exec_query_stats CROSS APPLY sys.dm_exec_sql_text(sql_handle) ORDER BY execution_count DESC;

53. 平均耗时最高 SQL

SELECT TOP 20 total_elapsed_time/execution_count, text FROM sys.dm_exec_query_stats CROSS APPLY sys.dm_exec_sql_text(sql_handle) ORDER BY 1 DESC;

54. 查看缓存执行计划

SELECT * FROM sys.dm_exec_cached_plans;

55. 查看执行计划

SET SHOWPLAN_XML ON; GO SELECT * FROM table_name; GO SET SHOWPLAN_XML OFF;

56. 查看 Query Store

SELECT * FROM sys.query_store_query;

57. 查询历史高耗 SQL

SELECT TOP 20 * FROM sys.query_store_runtime_stats ORDER BY avg_duration DESC;

58. 查看逻辑读最高 SQL

SELECT TOP 20 total_logical_reads, text FROM sys.dm_exec_query_stats CROSS APPLY sys.dm_exec_sql_text(sql_handle) ORDER BY total_logical_reads DESC;

59. 查看物理读最高 SQL

SELECT TOP 20 total_physical_reads, text FROM sys.dm_exec_query_stats CROSS APPLY sys.dm_exec_sql_text(sql_handle) ORDER BY total_physical_reads DESC;

60. 查看缓存大小

SELECT SUM(size_in_bytes)/1024/1024 AS MB FROM sys.dm_exec_cached_plans;

六、索引与统计信息(66-80)

61. 查看索引

SELECT * FROM sys.indexes;

62. 查看索引碎片

SELECT OBJECT_NAME(object_id), avg_fragmentation_in_percent FROM sys.dm_db_index_physical_stats ( NULL,NULL,NULL,NULL,'LIMITED' );

63. 重建索引

ALTER INDEX ALL ON table_name REBUILD;

64. 重组索引

ALTER INDEX ALL ON table_name REORGANIZE;

65. 更新统计信息

UPDATE STATISTICS table_name;

66. 查看缺失索引

SELECT * FROM sys.dm_db_missing_index_details;

67. 查看索引使用情况

SELECT * FROM sys.dm_db_index_usage_stats;

68. 查看未使用索引

SELECT * FROM sys.dm_db_index_usage_stats WHERE user_seeks=0 AND user_scans=0;

69. 查看统计信息更新时间

SELECT name, STATS_DATE(object_id,index_id) FROM sys.indexes;

70. 创建索引

CREATE INDEX idx_name ON table_name(column_name);

七、Always On 高可用(81-90)

71. 查看副本状态

SELECT * FROM sys.dm_hadr_availability_replica_states;

72. 查看同步状态

SELECT * FROM sys.dm_hadr_database_replica_states;

73. 查看同步延迟

SELECT database_id, log_send_queue_size, redo_queue_size FROM sys.dm_hadr_database_replica_states;

74. 查看 AG 配置

SELECT * FROM sys.availability_groups;

75. 查看监听器

SELECT * FROM sys.availability_group_listeners;

76. 查看 Replica

SELECT * FROM sys.availability_replicas;

77. 查看同步健康状态

SELECT synchronization_health_desc FROM sys.dm_hadr_availability_replica_states;

八、备份恢复(91-97)

78. 查看备份历史

SELECT database_name, backup_start_date, backup_finish_date, type FROM msdb.dbo.backupset ORDER BY backup_finish_date DESC;

79. 备份数据库

BACKUP DATABASE dbname TO DISK='D:\backup\db.bak';

80. 备份日志

BACKUP LOG dbname TO DISK='D:\backup\db.trn';

81. 恢复数据库

RESTORE DATABASE dbname FROM DISK='D:\backup\db.bak';

82. 查看最近备份

SELECT TOP 10 * FROM msdb.dbo.backupset ORDER BY backup_finish_date DESC;

83. 查看恢复历史

SELECT * FROM msdb.dbo.restorehistory;

九、权限管理(98-100)

84. 查看登录账户

SELECT * FROM sys.server_principals;

85. 查看数据库用户

SELECT * FROM sys.database_principals;

86. 查看权限

SELECT * FROM sys.database_permissions;

87. 创建登录

CREATE LOGIN user1 WITH PASSWORD='Password@123';

88. 创建数据库用户

CREATE USER user1 FOR LOGIN user1;

89. 授权读取

ALTER ROLE db_datareader ADD MEMBER user1;

90. 授权写入

ALTER ROLE db_datawriter ADD MEMBER user1;

91. 删除用户

DROP USER user1;

92. 删除登录

DROP LOGIN user1;

十、DBA 日常巡检补充(93-100)

93. 查看 SQL Agent 状态

SELECT * FROM msdb.dbo.sysjobs;

94. 查看失败 Job

SELECT * FROM msdb.dbo.sysjobhistory WHERE run_status<>1;

95. 查看错误日志

EXEC xp_readerrorlog;

96. 查看 TempDB 使用

SELECT * FROM sys.dm_db_file_space_usage;

97. 查看内存压力

SELECT * FROM sys.dm_os_memory_clerks;

98. 查看 CPU 压力

SELECT * FROM sys.dm_os_schedulers;

99. 查看 IO 延迟

SELECT * FROM sys.dm_io_virtual_file_stats(NULL,NULL);

100. 查看 SQL Server 等待统计

SELECT TOP 20 wait_type, wait_time_ms FROM sys.dm_os_wait_stats ORDER BY wait_time_ms DESC;

总结

SQL Server DBA 的核心能力,不是记住多少 T-SQL,而是面对生产问题时能够建立正确的排查路径。

例如:

  • CPU 高 → 不应该先看 CPU,而应该看等待和高耗 SQL;
  • 数据库慢 → 不应该马上加索引,而应该分析执行计划;
  • 日志暴涨 → 不应该直接扩容,而应该检查事务、备份链和恢复模式;
  • Always On 延迟 → 不应该只看延迟秒数,而应该分析日志发送队列和 redo 队列。

真正成熟的 SQL Server DBA,掌握的是这些命令背后的诊断逻辑。

这篇和前面的 MySQL、PostgreSQL 可以形成你的《DBA 三大数据库 100 条命令系列》。建议后续补一篇Oracle DBA 实用 100 条命令,这个系列完整度会更高。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询