SQL Server DBA 实用的 100 条命令(建议收藏)

来源: SQL Server DBA 实用的 100 条命令(建议收藏)

前言

做 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)

01查看 SQL Server 版本

   sql
SELECT @@VERSION;

02查看详细版本信息

   sql
SELECT

SERVERPROPERTY('ProductVersion') AS Version,

SERVERPROPERTY('ProductLevel') AS Level,

SERVERPROPERTY('Edition') AS Edition,

SERVERPROPERTY('EngineEdition') AS EngineEdition;

03查看实例名称

   sql
SELECT SERVERPROPERTY('ServerName');

04查看当前时间

   sql
SELECT GETDATE();

05查看 SQL Server 启动时间

   sql
SELECT sqlserver_start_time

FROM sys.dm_os_sys_info;

06查看服务器 CPU 和内存

   sql
SELECT

cpu_count,

physical_memory_kb/1024 AS memory_mb,

virtual_machine_type_desc

FROM sys.dm_os_sys_info;

07查看 SQL Server 最大内存配置

   sql
SELECT

name,

value_in_use

FROM sys.configurations

WHERE name='max server memory (MB)';

08查看当前数据库

   sql
SELECT DB_NAME();

09查看所有数据库状态

   sql
SELECT

name,

state_desc,

recovery_model_desc,

compatibility_level

FROM sys.databases;

10查看数据库创建时间

   sql
SELECT

name,

create_date

FROM sys.databases;

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

11查看数据库文件

   sql
SELECT

DB_NAME(database_id) AS database_name,

name,

physical_name,

size*8/1024 AS size_mb

FROM sys.master_files;

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

   sql
SELECT

DB_NAME(database_id) AS database_name,

name,

type_desc,

size*8/1024 AS size_mb

FROM sys.master_files;

13查看数据库大小排行

   sql
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查看日志文件大小

   sql
SELECT

DB_NAME(database_id),

name,

size*8/1024 AS log_mb

FROM sys.master_files

WHERE type_desc='LOG';

15查看日志使用率

   sql
DBCC SQLPERF(LOGSPACE);

16查看数据库空间使用

   sql
EXEC sp_spaceused;

17查看最大表

   sql
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查看表行数

   sql
SELECT

OBJECT_NAME(object_id),

SUM(rows)

FROM sys.partitions

WHERE index_id IN (0,1)

GROUP BY object_id;

19查看文件增长设置

   sql
SELECT

name,

growth,

is_percent_growth

FROM sys.database_files;

20查看数据库恢复模式

   sql
SELECT

name,

recovery_model_desc

FROM sys.databases;

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

21查看当前连接

   sql
SELECT *

FROM sys.dm_exec_sessions;

22查看正在执行 SQL

   sql
SELECT

session_id,

status,

command,

cpu_time,

total_elapsed_time,

wait_type,

blocking_session_id

FROM sys.dm_exec_requests;

23查看完整 SQL 文本

   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查看活动用户连接

   sql
SELECT

login_name,

COUNT(*)

FROM sys.dm_exec_sessions

GROUP BY login_name;

25查看客户端来源

   sql
SELECT

host_name,

program_name,

login_name,

COUNT(*)

FROM sys.dm_exec_sessions

GROUP BY

host_name,

program_name,

login_name;

26查看长时间运行 SQL

   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

   sql
SELECT TOP 20

session_id,

cpu_time,

logical_reads

FROM sys.dm_exec_requests

ORDER BY cpu_time DESC;

28查看当前等待

   sql
SELECT

session_id,

wait_type,

wait_time,

blocking_session_id

FROM sys.dm_exec_requests

WHERE wait_type IS NOT NULL;

29查看阻塞 Session

   sql
SELECT

session_id,

blocking_session_id,

wait_type

FROM sys.dm_exec_requests

WHERE blocking_session_id<>0;

30查看完整阻塞链

   sql
SELECT

blocking_session_id,

session_id,

wait_type,

wait_time

FROM sys.dm_exec_requests

WHERE blocking_session_id > 0;

31查看空闲连接

   sql
SELECT

session_id,

status,

last_request_start_time

FROM sys.dm_exec_sessions

WHERE status='sleeping';

32杀掉 Session

   sql
KILL 57;

33查看连接限制

   sql
SELECT

name,

value_in_use

FROM sys.configurations

WHERE name='user connections';

34查看登录失败

   sql
EXEC xp_readerrorlog;

35查看当前等待事件排行

   sql
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查看当前锁

   sql
SELECT *

FROM sys.dm_tran_locks;

37查看打开事务

   sql
DBCC OPENTRAN;

38查看活动事务

   sql
SELECT *

FROM sys.dm_tran_active_transactions;

39查看长事务

   sql
SELECT

session_id,

transaction_id,

transaction_begin_time

FROM sys.dm_tran_session_transactions;

40查看锁等待

   sql
SELECT

request_session_id,

resource_type,

request_mode,

request_status

FROM sys.dm_tran_locks

WHERE request_status='WAIT';

41查看阻塞 SQL

   sql
SELECT

blocking_session_id,

session_id,

wait_type,

wait_time

FROM sys.dm_exec_requests

WHERE blocking_session_id<>0;

42查看死锁

   sql
SELECT *

FROM system_health.session_targets;

43查看隔离级别

   sql
DBCC USEROPTIONS;

44查看当前事务数量

   sql
SELECT

COUNT(*)

FROM sys.dm_tran_active_transactions;

45查看版本存储空间

   sql
SELECT *

FROM sys.dm_tran_version_store_space_usage;

46查看 TempDB 版本存储

   sql
SELECT *

FROM sys.dm_db_file_space_usage;

47查看锁数量

   sql
SELECT

COUNT(*)

FROM sys.dm_tran_locks;

48查看等待资源

   sql
SELECT

wait_type,

resource_description

FROM sys.dm_os_waiting_tasks;

49查看当前死锁监控

   sql
SELECT

*

FROM sys.dm_xe_sessions;

50强制结束阻塞

   sql
KILL session_id;

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

51CPU 消耗最高 SQL

   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

   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

   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查看缓存执行计划

   sql
SELECT *

FROM sys.dm_exec_cached_plans;

55查看执行计划

   sql
SET SHOWPLAN_XML ON;

GO

 

SELECT *

FROM table_name;

 

GO

SET SHOWPLAN_XML OFF;

56查看 Query Store

   sql
SELECT *

FROM sys.query_store_query;

57查询历史高耗 SQL

   sql
SELECT TOP 20

*

FROM sys.query_store_runtime_stats

ORDER BY avg_duration DESC;

58查看逻辑读最高 SQL

   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

   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查看缓存大小

   sql
SELECT

SUM(size_in_bytes)/1024/1024 AS MB

FROM sys.dm_exec_cached_plans;

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

61查看索引

   sql
SELECT *

FROM sys.indexes;

62查看索引碎片

   sql
SELECT

OBJECT_NAME(object_id),

avg_fragmentation_in_percent

FROM sys.dm_db_index_physical_stats

(

NULL,NULL,NULL,NULL,'LIMITED'

);

63重建索引

   sql
ALTER INDEX ALL

ON table_name

REBUILD;

64重组索引

   sql
ALTER INDEX ALL

ON table_name

REORGANIZE;

65更新统计信息

   sql
UPDATE STATISTICS table_name;

66查看缺失索引

   sql
SELECT *

FROM sys.dm_db_missing_index_details;

67查看索引使用情况

   sql
SELECT *

FROM sys.dm_db_index_usage_stats;

68查看未使用索引

   sql
SELECT *

FROM sys.dm_db_index_usage_stats

WHERE user_seeks=0

AND user_scans=0;

69查看统计信息更新时间

   sql
SELECT

name,

STATS_DATE(object_id,index_id)

FROM sys.indexes;

70创建索引

   sql
CREATE INDEX idx_name

ON table_name(column_name);

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

71查看副本状态

   sql
SELECT *

FROM sys.dm_hadr_availability_replica_states;

72查看同步状态

   sql
SELECT *

FROM sys.dm_hadr_database_replica_states;

73查看同步延迟

   sql
SELECT

database_id,

log_send_queue_size,

redo_queue_size

FROM sys.dm_hadr_database_replica_states;

74查看 AG 配置

   sql
SELECT *

FROM sys.availability_groups;

75查看监听器

   sql
SELECT *

FROM sys.availability_group_listeners;

76查看 Replica

   sql
SELECT *

FROM sys.availability_replicas;

77查看同步健康状态

   sql
SELECT

synchronization_health_desc

FROM sys.dm_hadr_availability_replica_states;

八、备份恢复(91-97)

78查看备份历史

   sql
SELECT

database_name,

backup_start_date,

backup_finish_date,

type

FROM msdb.dbo.backupset

ORDER BY backup_finish_date DESC;

79备份数据库

   sql
BACKUP DATABASE dbname

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

80备份日志

   sql
BACKUP LOG dbname

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

81恢复数据库

   sql
RESTORE DATABASE dbname

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

82查看最近备份

   sql
SELECT TOP 10 *

FROM msdb.dbo.backupset

ORDER BY backup_finish_date DESC;

83查看恢复历史

   sql
SELECT *

FROM msdb.dbo.restorehistory;

九、权限管理(98-100)

84查看登录账户

   sql
SELECT *

FROM sys.server_principals;

85查看数据库用户

   sql
SELECT *

FROM sys.database_principals;

86查看权限

   sql
SELECT *

FROM sys.database_permissions;

87创建登录

   sql
CREATE LOGIN user1

WITH PASSWORD='Password@123';

88创建数据库用户

   sql
CREATE USER user1

FOR LOGIN user1;

89授权读取

   sql
ALTER ROLE db_datareader

ADD MEMBER user1;

90授权写入

   sql
ALTER ROLE db_datawriter

ADD MEMBER user1;

91删除用户

   sql
DROP USER user1;

92删除登录

   sql
DROP LOGIN user1;

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

93查看 SQL Agent 状态

   sql
SELECT *

FROM msdb.dbo.sysjobs;

94查看失败 Job

   sql
SELECT *

FROM msdb.dbo.sysjobhistory

WHERE run_status<>1;

95查看错误日志

   sql
EXEC xp_readerrorlog;

96查看 TempDB 使用

   sql
SELECT *

FROM sys.dm_db_file_space_usage;

97查看内存压力

   sql
SELECT *

FROM sys.dm_os_memory_clerks;

98查看 CPU 压力

   sql
SELECT *

FROM sys.dm_os_schedulers;

99查看 IO 延迟

   sql
SELECT *

FROM sys.dm_io_virtual_file_stats(NULL,NULL);

100查看 SQL Server 等待统计

   sql
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,掌握的是这些命令背后的诊断逻辑。

感谢阅读。

我会持续分享 Oracle、GoldenGate、RAC、Data Guard、MySQL、PostgreSQL、OceanBase、人大金仓等数据库技术文章。

个人网站:ora100.com