SQL Server 常用运维命令整理
SQL Server 常用运维命令整理
一、基础信息查询类
-
版本信息
SELECT @@VERSION; -- 基础版本号 SELECT SERVERPROPERTY('Edition') AS Edition, -- 企业版/标准版等SERVERPROPERTY('Collation') AS Collation, -- 数据库字符集SERVERPROPERTY('ServerName') AS ServerName; -- 实例名
-
系统状态监控
-- 当前连接数 SELECT COUNT(*) AS [ConnectionCount] FROM sys.dm_exec_connections;-- 磁盘空间使用(需执行存储过程) EXEC master.dbo.xp_fixeddrives; -- 各盘符剩余空间(GB) EXEC sp_spaceused; -- 当前数据库大小及剩余空间-- 日志文件利用率 DBCC SQLPERF(LOGSPACE); -- 查看各数据库日志空间占比
-
性能关键指标
-- CPU占用TOP会话 SELECT TOP 10 spid, cmd, cpu, physical_io, memusage,(SELECT TOP 1 [text] FROM ::fn_get_sql(sql_handle)) AS sql_text FROM master..sysprocesses ORDER BY cpu DESC, physical_io DESC;-- 缓存查询分析(内存占用高但使用率低的查询) SELECT TOP 100 usecounts, objtype, size_in_bytes/1024.0 AS Size_KB,[sql].[text] AS QueryText FROM sys.dm_exec_cached_plans p OUTER APPLY sys.dm_exec_sql_text(p.plan_handle) sql ORDER BY usecounts, size_in_bytes DESC;
二、阻塞与锁管理
-
阻塞链诊断
-- 阻塞进程树(需结合两个视图) SELECT t1.resource_type, t1.request_mode, t1.request_session_id AS BlockingSPID,t2.blocking_session_id AS VictimSPID,DB_NAME(t1.resource_database_id) AS DatabaseName FROM sys.dm_tran_locks t1 INNER JOIN sys.dm_os_waiting_tasks t2 ON t1.lock_owner_address = t2.resource_address WHERE t1.request_session_id <> @@SPID;-- 查看阻塞进程的SQL文本 EXEC sp_who2 142; -- 替换142为实际SPID DBCC INPUTBUFFER(142); -- 获取阻塞进程正在执行的SQL
-
锁冲突解决
-- 强制终止阻塞进程(谨慎使用) KILL 142; -- 替换142为实际SPID
三、数据库维护操作
-
备份与恢复
-- 完整数据库备份 BACKUP DATABASE [AdventureWorks] TO DISK = 'D:\Backup\AdventureWorks_Full.bak' WITH COMPRESSION, STATS = 10;-- 差异备份 BACKUP DATABASE [AdventureWorks] TO DISK = 'D:\Backup\AdventureWorks_Diff.bak' WITH DIFFERENTIAL, COMPRESSION;-- 时间点恢复(需结合事务日志备份) RESTORE DATABASE [AdventureWorks] FROM DISK = 'D:\Backup\AdventureWorks_Full.bak' WITH NORECOVERY, REPLACE;RESTORE LOG [AdventureWorks] FROM DISK = 'D:\Backup\AdventureWorks_Log.trn' WITH STOPAT = '2025-08-12 14:00:00', RECOVERY;
-
索引维护
-- 重建碎片化索引(碎片率>30%) ALTER INDEX [IX_Orders_OrderDate] ON [Sales].[Orders] REBUILD;-- 重组轻度碎片化索引(碎片率10-30%) ALTER INDEX [IX_Customers_Name] ON [Sales].[Customers] REORGANIZE;-- 查看索引碎片率 SELECT OBJECT_NAME(i.object_id) AS TableName,i.name AS IndexName,s.avg_fragmentation_in_percent AS Fragmentation FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'SAMPLED') s JOIN sys.indexes i ON s.object_id = i.object_id AND s.index_id = i.index_id WHERE s.avg_fragmentation_in_percent > 10 ORDER BY Fragmentation DESC;
-
统计信息更新
-- 自动更新所有统计信息(适用于数据量大的表) UPDATE STATISTICS [Sales].[Orders] WITH FULLSCAN;-- 增量更新(适用于数据变化较少的表) UPDATE STATISTICS [Production].[Products] WITH SAMPLE 20 PERCENT;
四、高级诊断命令
-
执行计划分析
-- 获取当前运行的查询计划 SELECT r.session_id, r.status, r.command,DB_NAME(r.database_id) AS DatabaseName,qt.text AS QueryText,qp.query_plan AS ExecutionPlanXML FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) qt CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) qp WHERE r.session_id > 50; -- 排除系统进程
-
长时间运行事务监控
-- 识别运行超过1小时的事务 SELECT t.transaction_id,DB_NAME(t.database_id) AS DatabaseName,t.transaction_begin_time,DATEDIFF(MINUTE, t.transaction_begin_time, GETDATE()) AS Duration_Minutes,at.transaction_description FROM sys.dm_tran_active_transactions t LEFT JOIN sys.dm_tran_database_transactions dt ON t.transaction_id = dt.transaction_id LEFT JOIN sys.dm_tran_session_transactions st ON t.transaction_id = st.transaction_id LEFT JOIN sys.dm_exec_sessions s ON st.session_id = s.session_id LEFT JOIN sys.dm_tran_locks l ON t.transaction_id = l.request_owner_id LEFT JOIN sys.allocation_units au ON l.resource_associated_entity_id = au.allocation_unit_id LEFT JOIN sys.partitions p ON au.container_id = p.hobt_id LEFT JOIN sys.dm_tran_commit_table at ON t.transaction_id = at.transaction_id WHERE DATEDIFF(MINUTE, t.transaction_begin_time, GETDATE()) > 60 ORDER BY Duration_Minutes DESC;
五、自动化运维脚本示例
-
自动收缩日志文件
-- 自动收缩日志文件到1GB(需在业务低峰期执行) DECLARE @dbname NVARCHAR(128) = 'AdventureWorks'; DECLARE @logfilename NVARCHAR(128);SELECT @logfilename = name FROM sys.master_files WHERE database_id = DB_ID(@dbname) AND type_desc = 'LOG';IF @logfilename IS NOT NULL BEGINDBCC SHRINKFILE(@logfilename, 1024); -- 收缩到1GBPRINT '日志文件收缩完成'; END ELSE BEGINPRINT '未找到日志文件'; END
-
定期维护计划模板
-- 每周日凌晨2点执行完整维护 USE msdb; GOEXEC dbo.sp_add_job@job_name = N'Weekly Maintenance';EXEC sp_add_jobstep@job_name = N'Weekly Maintenance',@step_name = N'Update Statistics',@subsystem = N'TSQL',@command = N'EXEC sp_msforeachtable ''UPDATE STATISTICS ? WITH FULLSCAN''',@database_name = N'master';EXEC sp_add_schedule@schedule_name = N'Sunday 2AM',@freq_type = 8, -- 每周@freq_interval = 1, -- 周日@active_start_time = 020000; -- 02:00:00EXEC sp_attach_schedule@job_name = N'Weekly Maintenance',@schedule_name = N'Sunday 2AM';EXEC sp_add_jobserver@job_name = N'Weekly Maintenance';
运维建议
- 备份策略:采用完整备份+差异备份+事务日志备份的组合,保留最近7天的备份
- 索引维护:对OLTP系统建议每周重组索引,每月重建索引
- 统计信息:对数据量大的表建议每周更新统计信息
- 监控告警:设置CPU使用率>80%、磁盘空间<10%等关键指标的告警
- 变更管理:所有维护操作应通过变更窗口执行,并提前通知业务部门
这些命令覆盖了SQL Server运维的核心场景,实际使用时需根据具体环境调整参数。对于生产环境,建议先在测试环境验证命令效果,特别是涉及数据修改的操作(如KILL进程、数据库恢复等)。