外观
SQLServer 运维规范
日常运维流程
每日巡检
巡检时间:每日 8:30-9:00 完成
巡检内容:
| 类别 | 检查项 | 检查方法 | 标准 | 生产场景 |
|---|---|---|---|---|
| 服务状态 | SQL Server 服务 | PowerShell 或 SQL Server Configuration Manager | 服务运行正常 | 远程维护时,使用 Get-Service -ComputerName ServerName -Name MSSQLSERVER 快速检查 |
| 服务状态 | SQL Server Agent 服务 | PowerShell 或 SQL Server Configuration Manager | 服务运行正常 | 确保作业调度正常执行,核心业务依赖的作业必须监控 |
| 数据库状态 | 所有数据库 | SELECT name, state_desc FROM sys.databases | 所有数据库状态为 ONLINE | 重点关注业务核心数据库,如交易、订单系统 |
| 日志空间 | 事务日志使用率 | DBCC SQLPERF(LOGSPACE) | 日志使用率 < 80% | 防止事务日志满导致数据库无法写入,影响业务 |
| 磁盘空间 | 数据文件磁盘 | PowerShell 或 Windows 资源管理器 | 剩余空间 > 20% | 避免磁盘空间不足导致服务中断,设置自动扩容预警 |
| 磁盘空间 | 日志文件磁盘 | PowerShell 或 Windows 资源管理器 | 剩余空间 > 20% | 确保日志文件有足够空间增长,避免频繁自动增长 |
| 备份状态 | 最近 24 小时备份 | SQL Server Agent 作业历史或备份日志 | 所有数据库完成配置的备份 | 验证备份策略执行情况,确保数据可恢复性 |
| 错误日志 | 最近 24 小时错误 | 查看 SQL Server 错误日志 | 无严重错误(级别 >= 16) | 及时发现并解决潜在问题,如资源不足、连接失败 |
| 阻塞情况 | 当前阻塞 | SELECT * FROM sys.dm_exec_requests WHERE blocking_session_id > 0 | 无长时间阻塞(> 5 分钟) | 避免阻塞影响业务正常运行,重点监控核心业务表 |
| 性能指标 | CPU 使用率 | Performance Monitor 或 DMVs | 平均 CPU 使用率 < 70% | 监控系统资源使用情况,峰值可接受短时间高负载 |
| 性能指标 | 内存使用率 | Performance Monitor 或 DMVs | 内存使用率 < 90% | 确保系统有足够内存运行,避免内存压力导致性能下降 |
| 性能指标 | 磁盘 I/O | Performance Monitor 或 DMVs | 磁盘队列长度 < 2 | 避免 I/O 瓶颈影响性能,特别是 OLTP 系统 |
巡检报告:每日生成巡检报告,记录异常情况并及时处理。使用 PowerShell 脚本自动化生成报告,发送给 DBA 团队。
版本差异:
- SQL Server 2012-2014:使用
sys.dm_os_performance_counters查看性能指标,功能有限 - SQL Server 2016+:引入
sys.dm_db_log_stats提供更详细的日志统计信息 - SQL Server 2019+:增强了
sys.dm_os_wait_stats的等待类型分类,便于性能分析
每周维护
维护时间:每周日 22:00-次日 2:00(业务低峰期)
维护内容:
索引维护:
- 检查索引碎片:
SELECT * FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') - 重组碎片率 5%-30% 的索引:
ALTER INDEX ALL ON [表名] REORGANIZE - 重建碎片率 > 30% 的索引:
ALTER INDEX ALL ON [表名] REBUILD WITH (ONLINE = ON) - 更新统计信息:
UPDATE STATISTICS [表名] WITH FULLSCAN
生产场景:对于大型表(> 100GB),使用
ALTER INDEX ALL ON [表名] REBUILD WITH (ONLINE = ON, MAXDOP = 4)限制并行度,减少对系统资源的影响。- 检查索引碎片:
数据库一致性检查:
- 执行
DBCC CHECKDB([数据库名]) WITH NO_INFOMSGS, ALL_ERRORMSGS - 检查结果保存到日志文件
生产场景:对于超大型数据库(> 500GB),考虑使用
DBCC CHECKDB([数据库名], PHYSICAL_ONLY)只检查物理一致性,减少检查时间和资源消耗。- 执行
备份验证:
- 随机选择一个核心数据库进行恢复测试
- 使用
RESTORE VERIFYONLY FROM DISK = '备份文件路径'验证备份完整性
生产场景:在隔离的测试环境中恢复,验证备份可恢复性,不影响生产环境。
日志清理:
- 清理 SQL Server 错误日志:
EXEC sp_cycle_errorlog - 清理 SQL Server Agent 日志:
EXEC msdb.dbo.sp_cycle_agent_errorlog - 归档并清理旧的备份日志文件
生产场景:设置日志循环策略,保留最近 7 天的日志文件,避免日志文件过多占用磁盘空间。
- 清理 SQL Server 错误日志:
版本差异:
- SQL Server 2012-2014:索引维护不支持
DATA_COMPRESSION选项,在线重建索引功能有限 - SQL Server 2016+:支持
ALTER INDEX REBUILD WITH (DATA_COMPRESSION = PAGE)在线压缩索引 - SQL Server 2019+:引入
ALTER INDEX REBUILD WITH (RESUMABLE = ON)支持可恢复的索引重建,允许暂停和恢复大型索引重建
每月维护
维护时间:每月最后一个周日 22:00-次日 4:00(业务低峰期)
维护内容:
完整备份验证:
- 对所有核心数据库进行恢复测试
- 验证恢复后的数据库完整性,使用
DBCC CHECKDB
生产场景:在专门的测试环境中进行恢复测试,模拟真实恢复场景,记录恢复时间。
容量规划:
- 分析数据库增长趋势:
SELECT name, size/128.0 AS SizeMB FROM sys.database_files - 预测未来 3-6 个月的容量需求
- 制定扩容计划,包括存储、内存和 CPU 需求
生产场景:使用 PowerShell 脚本定期收集容量数据,生成可视化报表,便于分析增长趋势和制定扩容计划。
- 分析数据库增长趋势:
性能回顾:
- 分析过去一个月的性能数据,包括 CPU、内存、I/O 和等待类型
- 识别性能瓶颈和改进机会,如慢查询、缺失索引
- 制定性能优化计划,优先处理影响核心业务的性能问题
生产场景:使用
sys.dm_exec_query_stats和sys.dm_exec_procedure_stats分析最消耗资源的查询和存储过程,重点优化核心业务逻辑。安全审计:
- 检查用户权限变更:
SELECT * FROM sys.server_principals WHERE modify_date > DATEADD(MONTH, -1, GETDATE()) - 审查登录失败记录:
SELECT * FROM sys.event_log WHERE event_id = 18456 AND start_time > DATEADD(MONTH, -1, GETDATE()) - 验证安全配置,如密码策略、审计设置
生产场景:使用 SQL Server Audit 或扩展事件监控敏感操作,及时发现安全隐患,如未授权访问、权限滥用。
- 检查用户权限变更:
监控策略
核心监控指标
| 类别 | 指标 | 监控频率 | 告警阈值 | 生产场景 |
|---|---|---|---|---|
| CPU | 处理器使用率 | 每 1 分钟 | 连续 5 分钟 > 90% | 重点监控高峰时段的 CPU 使用率,如电商促销活动期间 |
| 内存 | 内存使用率 | 每 1 分钟 | 连续 5 分钟 > 95% | 结合 sys.dm_os_process_memory 分析内存使用情况,避免内存不足 |
| 磁盘 | 磁盘空间使用率 | 每 10 分钟 | > 80% | 分别监控数据文件和日志文件所在磁盘,设置分级告警(70% 警告,85% 严重) |
| 磁盘 | 磁盘 I/O 队列长度 | 每 1 分钟 | 连续 5 分钟 > 5 | 结合 sys.dm_io_virtual_file_stats 分析具体文件的 I/O 性能,定位瓶颈 |
| 磁盘 | 磁盘读写延迟 | 每 1 分钟 | 连续 5 分钟 > 100ms | 监控存储系统的性能状况,SSD 延迟应低于 50ms |
| 数据库 | 事务日志使用率 | 每 5 分钟 | > 80% | 防止事务日志满导致数据库无法写入,影响业务连续性 |
| 数据库 | 备份失败 | 实时 | 任何备份失败 | 确保备份策略正常执行,数据可恢复性得到保障 |
| 数据库 | 数据库状态异常 | 实时 | 任何数据库状态不是 ONLINE | 及时发现数据库故障,如 SUSPECT、RECOVERY_PENDING 状态 |
| 连接 | 活动连接数 | 每 1 分钟 | 连续 5 分钟 > 90% 最大连接数 | 监控连接池使用情况,避免连接耗尽,影响用户访问 |
| 阻塞 | 长时间阻塞 | 每 1 分钟 | 阻塞时间 > 5 分钟 | 使用 sys.dm_tran_locks 和 sys.dm_os_waiting_tasks 分析阻塞链,快速定位问题 |
| 错误 | 严重错误 | 实时 | 错误级别 >= 16 | 及时发现系统级错误,如资源不足、访问失败 |
版本差异:
- SQL Server 2012-2014:监控指标有限,主要依赖 Performance Monitor 和基本 DMVs
- SQL Server 2016+:引入
Query Store用于性能监控和查询计划管理,便于识别和解决性能问题 - SQL Server 2019+:增强了
sys.dm_os_memory_clerks和sys.dm_os_memory_nodes的内存监控能力,支持更精细的内存管理
监控工具
内置工具:
- SQL Server Management Studio (SSMS)
- SQL Server Agent 警报
- Dynamic Management Views (DMVs)
- Extended Events
- Performance Monitor
- Query Store (SQL Server 2016+)
生产场景:使用 Extended Events 替代 SQL Server Profiler,减少性能开销,适合生产环境长期监控。
第三方工具:
- Microsoft SQL Server Monitoring Tools
- SolarWinds Database Performance Monitor
- Redgate SQL Monitor
- Quest Foglight for SQL Server
生产场景:根据预算和需求选择合适的第三方工具,重点关注工具的告警机制、性能分析能力和自动化功能。
告警处理流程
告警分级:
| 级别 | 定义 | 响应时间 | 生产场景 |
|---|---|---|---|
| 紧急(P0) | 数据库无法访问,业务中断 | 立即响应(< 5 分钟) | 如:SQL Server 服务崩溃、磁盘空间耗尽、核心数据库离线 |
| 严重(P1) | 数据库性能严重下降,影响业务 | 30 分钟内响应 | 如:长时间阻塞、高 CPU 使用率、事务日志满 |
| 警告(P2) | 潜在问题,可能影响业务 | 2 小时内响应 | 如:事务日志使用率接近阈值、磁盘空间不足预警 |
| 信息(P3) | 一般性通知,不影响业务 | 24 小时内处理 | 如:备份成功通知、常规维护完成 |
告警处理步骤:
- 收到告警后,立即通过监控工具确认告警真实性
- 分析告警原因,使用 DMVs 和日志定位问题
- 采取措施解决问题,如终止阻塞会话、扩展磁盘空间、重启服务
- 验证问题解决,确保业务恢复正常
- 记录告警处理过程和结果,包括问题原因、解决方案和预防措施
生产场景:使用 PowerShell 脚本结合企业微信、Slack 或邮件实现告警通知,确保 DBA 团队 7×24 小时及时收到告警信息。
变更管理
变更分类
| 类别 | 定义 | 审批流程 | 生产场景 |
|---|---|---|---|
| 紧急变更 | 解决生产环境故障或安全漏洞的变更 | 紧急审批,由 DBA 团队负责人批准 | 如:修复安全漏洞、恢复服务、解决阻塞问题 |
| 标准变更 | 预定义、风险低的常规变更 | 简化审批,由 DBA 团队负责人批准 | 如:索引维护、统计信息更新、常规备份 |
| 重大变更 | 可能影响系统稳定性或性能的变更 | 完整审批,由 DBA 团队负责人、系统架构师和业务负责人批准 | 如:数据库迁移、版本升级、架构变更、大容量数据导入 |
变更流程
变更申请:
- 填写变更申请表,包括变更内容、影响范围、风险评估和回滚计划
- 提交给 DBA 团队负责人审批
生产场景:使用 Jira 等变更管理系统跟踪变更流程,确保所有变更都有记录,便于审计和追溯。
变更审批:
- 审批人评估变更风险和影响,包括对性能、可用性和数据完整性的影响
- 批准或拒绝变更申请,如需修改,反馈修改意见
生产场景:对于重大变更,组织变更评审会议,邀请相关方参与评估,确保变更符合业务需求和技术规范。
变更准备:
- 准备变更脚本和工具,包括执行脚本和回滚脚本
- 在测试环境中测试变更效果,验证功能和性能
- 准备变更执行计划,包括时间窗口、人员分工和监控方案
生产场景:使用 Git 等版本控制系统管理变更脚本,确保脚本的可追溯性和版本控制。
变更执行:
- 在计划的业务低峰期执行变更
- 执行前备份相关数据库和配置,确保可以回滚到变更前的状态
- 变更过程中安排专人监控,包括系统性能、数据库状态和业务影响
- 如遇问题,立即执行回滚计划,恢复系统到变更前状态
生产场景:对于数据库架构变更,使用
SQL Server Data Tools (SSDT)进行 schema 比较和部署,确保变更的安全性和一致性。变更验证:
- 验证变更效果,包括功能验证和性能验证
- 检查系统状态和性能,确保没有引入新的问题
- 确认业务正常运行,通知业务部门变更完成
生产场景:使用自动化测试脚本验证变更效果,减少人工验证的工作量和误差。
变更记录:
- 记录变更执行过程和结果,包括执行时间、参与人员、变更内容和验证结果
- 更新配置管理数据库(CMDB),确保配置信息的准确性
- 总结变更经验教训,分享给团队成员,促进知识共享和流程改进
生产场景:编写变更总结报告,包括变更背景、执行过程、验证结果和改进建议,存档备查。
变更注意事项
- 所有变更必须在业务低峰期执行,避免影响正常业务
- 变更前必须备份相关数据库和配置,确保可以回滚
- 变更过程必须有专人监控,及时发现和解决问题
- 变更后必须验证业务正常运行,确保变更达到预期效果
- 重大变更必须进行预演,验证变更流程和回滚方案的可行性
- 变更脚本必须经过代码审查,确保脚本的正确性和安全性
- 变更必须有明确的回滚计划,包括回滚步骤和验证方法
容量管理
容量规划
数据收集:
- 收集过去 6-12 个月的数据库增长数据,包括数据文件和日志文件大小
- 分析数据增长趋势,识别增长的季节性和周期性
- 考虑业务增长和新功能上线的影响,如业务扩张、新产品上线
容量计算公式:
未来容量需求 = 当前容量 + (月均增长率 × 预测月数 × 安全系数)安全系数:一般取 1.2-1.5,根据业务重要性和增长不确定性调整
生产场景:使用 PowerShell 脚本定期收集数据库大小、文件增长和磁盘空间数据,生成容量预测报表,结合业务规划制定长期容量计划。
空间监控
监控内容:
- 数据文件空间使用率和增长趋势
- 日志文件空间使用率和增长趋势
- 磁盘空间使用率和增长趋势
监控方法:
使用动态管理视图监控数据库文件空间:
sql-- 数据文件空间使用情况 SELECT name AS file_name, physical_name, size/128.0 AS total_size_MB, FILEPROPERTY(name, 'SpaceUsed')/128.0 AS used_size_MB, (size - FILEPROPERTY(name, 'SpaceUsed'))/128.0 AS free_size_MB, (FILEPROPERTY(name, 'SpaceUsed')/CAST(size AS FLOAT))*100 AS used_percent FROM sys.database_files;使用 PowerShell 脚本定期生成空间报告,发送给 DBA 团队
使用监控工具设置空间告警,当使用率达到阈值时触发告警
生产场景:对于事务日志文件,监控其增长速度和使用率,结合业务活动分析日志增长原因,优化事务处理逻辑,避免长时间运行的事务。
扩容流程
扩容评估:
- 确认扩容需求,包括扩容原因和目标容量
- 评估扩容对系统的影响,包括性能、可用性和成本
- 选择扩容方式,如扩展现有文件、添加新文件或增加磁盘空间
生产场景:对于大型数据库,优先选择添加新的数据文件到不同的物理磁盘,而不是扩展现有文件,以提高 I/O 性能和负载均衡。
扩容方式:
- 扩展现有数据文件:适合中小规模数据库,操作简单
- 添加新的数据文件:适合大型数据库,提高 I/O 性能
- 增加磁盘空间:适合所有规模数据库,需要系统管理员配合
扩容执行:
sql-- 扩展现有数据文件 ALTER DATABASE [数据库名] MODIFY FILE (NAME = N'文件名', SIZE = 新大小MB, FILEGROWTH = 增长大小MB); -- 添加新的数据文件 ALTER DATABASE [数据库名] ADD FILE (NAME = N'新文件名', FILENAME = N'文件路径', SIZE = 初始大小MB, FILEGROWTH = 增长大小MB);扩容验证:
- 验证数据文件大小和增长设置是否正确
- 检查系统性能,确保扩容没有引入新的性能问题
- 确认业务正常运行,没有受到扩容影响
生产场景:扩容后,监控系统性能和数据库状态,特别是 I/O 性能和查询响应时间,确保扩容达到预期效果。
版本差异:
- SQL Server 2012-2014:最大数据库大小为 524 PB,支持基本的文件管理功能
- SQL Server 2016+:支持更大的数据库大小,引入了 Stretch Database 用于将冷数据迁移到 Azure,优化存储成本
- SQL Server 2019+:支持内存优化表的更大容量,增强了对持久化内存的支持
应急响应
应急响应团队
团队组成:
- DBA 团队负责人:协调应急响应工作,负责决策和沟通
- 资深 DBA:负责技术实施,执行故障修复和恢复操作
- 系统管理员:负责服务器和存储支持,如磁盘扩容、服务重启
- 业务负责人:提供业务影响评估,确定恢复优先级
- 网络管理员:负责网络连接支持,如防火墙配置、网络故障排查
生产场景:建立 7×24 小时应急响应机制,确保随时有人处理紧急故障,包括轮班制度和联系方式清单。
应急响应流程
故障发现:
- 通过监控系统自动发现故障,触发告警
- 接到业务部门的故障报告,如用户无法访问系统、交易失败
生产场景:设置多种故障报告渠道,如电话、邮件、即时通讯工具等,确保故障能及时上报。
故障评估:
- 确认故障范围和影响,包括受影响的系统、用户和业务流程
- 确定故障级别,如 P0、P1、P2 或 P3
- 启动相应的应急响应预案,组织相关人员参与故障处理
生产场景:使用预定义的故障级别矩阵,快速确定故障优先级和响应时间,确保资源优先用于解决高优先级故障。
故障定位:
- 收集故障相关信息,包括错误日志、监控数据和用户反馈
- 分析日志和监控数据,定位故障原因,如硬件故障、软件缺陷、配置错误
- 使用 DMVs 和诊断工具进行深入分析,如
sys.dm_exec_requests、sys.dm_tran_locks和sys.dm_os_waiting_tasks
生产场景:对于性能问题,使用
Query Store(SQL Server 2016+)快速定位慢查询和计划回归问题。故障修复:
- 执行故障修复方案,如重启服务、修复配置、恢复数据库
- 监控修复过程,确保修复操作没有引入新的问题
- 如遇问题,调整修复方案,必要时执行回滚
生产场景:对于复杂故障,组织应急响应会议,集中讨论修复方案。
业务恢复:
- 验证业务系统恢复正常,包括功能验证和性能验证
- 通知业务部门恢复使用,提供恢复时间和影响范围
- 持续监控系统状态,确保没有复发
生产场景:制定业务恢复验证清单,确保所有业务功能都已恢复正常,特别是核心业务流程。
故障复盘:
- 分析故障原因和影响,包括根本原因和直接原因
- 总结经验教训,提出改进措施,避免类似故障再次发生
- 更新应急预案,完善故障处理流程
- 向相关方汇报故障处理结果和改进计划
生产场景:在故障恢复后 24 小时内召开故障复盘会议,形成故障报告,包括故障背景、处理过程、根本原因和改进建议。
常见故障处理预案
数据库无法访问:
- 检查 SQL Server 服务状态:
Get-Service -Name MSSQLSERVER - 检查网络连接和防火墙设置:
Test-NetConnection -ComputerName ServerName -Port 1433 - 检查数据库状态:
SELECT name, state_desc FROM sys.databases - 查看错误日志:
EXEC xp_readerrorlog 0, 1, NULL, NULL, NULL, NULL, N'DESC' - 尝试以单用户模式启动 SQL Server:
sqlservr.exe -s MSSQLSERVER -m - 检查端口占用情况:
netstat -ano | findstr :1433
事务日志满:
- 检查事务日志使用率:
DBCC SQLPERF(LOGSPACE) - 确认是否有长时间运行的事务:
SELECT * FROM sys.dm_tran_active_transactions WHERE DATEDIFF(MINUTE, transaction_begin_time, GETDATE()) > 10 - 执行日志备份,释放日志空间:
BACKUP LOG [数据库名] TO DISK = N'备份路径' - 如需要,扩展事务日志文件:
ALTER DATABASE [数据库名] MODIFY FILE (NAME = N'日志文件名', SIZE = 新大小MB) - 优化事务处理逻辑,避免长时间运行的事务,如将大事务拆分为多个小事务
长时间阻塞:
- 定位阻塞源:sql
SELECT blocking_session_id, session_id, wait_type, wait_time, last_wait_type, wait_resource FROM sys.dm_os_waiting_tasks WHERE blocking_session_id > 0; - 分析阻塞原因:使用
DBCC INPUTBUFFER(blocking_session_id)查看阻塞会话正在执行的语句 - 如需要,终止阻塞会话:
KILL 会话ID - 优化导致阻塞的查询,如添加索引、调整查询逻辑、使用查询提示
- 考虑使用快照隔离级别或读提交快照隔离级别,减少阻塞
版本差异:
- SQL Server 2012-2014:故障诊断工具有限,主要依赖 DMVs 和错误日志
- SQL Server 2016+:引入
Query Store和增强版sys.dm_os_wait_stats,便于故障诊断和性能分析 - SQL Server 2019+:引入
Intelligent Query Processing,自动优化查询,减少性能问题
备份与恢复管理
备份策略
备份类型与频率:
| 备份类型 | 频率 | 保留期 | 生产场景 |
|---|---|---|---|
| 完整备份 | 每日 | 30 天 | 核心业务数据库每日凌晨 2:00 执行,减少对业务影响 |
| 差异备份 | 每 4 小时 | 7 天 | 核心业务数据库每 4 小时执行一次,平衡恢复时间和备份大小 |
| 事务日志备份 | 每 15 分钟 | 14 天 | 完整恢复模式下的数据库,每 15 分钟执行一次,确保 RPO 符合要求 |
| 文件/文件组备份 | 每周 | 30 天 | 大型数据库(> 1TB),便于快速恢复特定文件组 |
备份存储:
- 备份文件存储在独立的存储设备上,与生产数据库分离
- 实施 3-2-1 备份原则:
- 3 份备份副本
- 2 种不同的存储介质(如磁盘、磁带)
- 1 份异地备份(如 Azure Blob Storage、AWS S3)
生产场景:使用 BACKUP DATABASE [数据库名] TO URL = 'https://storageaccount.blob.core.windows.net/container/backup.bak' 将备份存储到 Azure Blob Storage,实现异地备份,确保灾难恢复能力。
恢复测试
测试频率:
- 每月至少进行一次完整的恢复测试
- 每次备份策略变更后进行恢复测试
- 每次重大系统变更后进行恢复测试
测试内容:
- 验证备份文件的完整性:
RESTORE VERIFYONLY FROM DISK = '备份文件路径' - 测试从完整备份恢复:
RESTORE DATABASE [测试数据库名] FROM DISK = '完整备份路径' WITH RECOVERY - 测试从差异备份和事务日志备份恢复,包括时间点恢复
- 验证恢复后的数据库完整性:
DBCC CHECKDB([测试数据库名])
生产场景:在隔离的测试环境中进行恢复测试,记录恢复时间,确保符合 RTO 要求,不影响生产环境。
版本差异:
- SQL Server 2012-2014:备份到 URL 功能有限,仅支持 Azure Blob Storage
- SQL Server 2016+:增强了备份到 URL 功能,支持更多云存储服务和备份选项
- SQL Server 2019+:支持增量备份和压缩备份,提高备份效率和减少存储成本
安全管理
访问控制
用户管理:
- 遵循最小权限原则:只授予用户完成工作所需的最小权限
- 定期审查用户权限:每季度审查一次用户权限,及时收回不必要的权限
- 及时禁用或删除不再需要的用户:当用户离职或变更岗位时,及时更新其数据库权限
- 使用强密码策略:配置复杂密码策略,定期更换密码,禁止使用弱密码
登录管理:
- 限制 sa 账户的使用:禁用 sa 账户或重命名,使用其他具有管理员权限的账户进行管理
- 优先使用 Windows 身份验证:Windows 身份验证更安全,便于集中管理和审计
- 定期审查登录尝试记录:监控登录失败记录,及时发现暴力破解尝试
生产场景:使用 CREATE LOGIN [Domain\User] FROM WINDOWS 创建 Windows 登录,使用 GRANT SELECT, INSERT, UPDATE ON [表名] TO [用户名] 授予最小权限,避免过度授权。
审计与合规
审计内容:
- 登录和注销事件,包括成功和失败的登录尝试
- 权限变更,包括用户创建、删除和权限修改
- 数据库架构变更,包括表、索引和存储过程的创建和修改
- 敏感数据访问,特别是涉及个人隐私和财务数据的访问
- 备份和恢复操作,确保数据保护符合要求
合规要求:
- 遵循相关法规和标准,如 GDPR、HIPAA、SOX 等
- 定期进行安全审计:每季度进行一次全面的安全审计
- 保留审计日志至少 1 年:使用 SQL Server Audit 或第三方工具存储审计日志,便于合规检查
生产场景:使用 CREATE SERVER AUDIT [ServerAudit] TO FILE (FILEPATH = 'E:\Audit\', MAXSIZE = 1024 MB, MAX_ROLLOVER_FILES = 10) 创建服务器审计,监控重要操作,确保合规性。
版本差异:
- SQL Server 2012-2014:审计功能有限,主要依赖 SQL Server Audit 和扩展事件
- SQL Server 2016+:增强了审计功能,支持更多审计事件和存储选项,便于合规性管理
- SQL Server 2019+:引入了
Always Encrypted功能,保护敏感数据在使用过程中的安全,即使数据库被泄露也能保护数据
自动化运维
自动化任务
日常巡检自动化:
- 使用 PowerShell 脚本编写巡检脚本,包括服务状态、数据库状态、日志空间、磁盘空间等检查项
- 使用 SQL Server Agent 或 Windows Task Scheduler 定期执行巡检脚本
- 生成巡检报告,发送给 DBA 团队,包括异常情况和建议
备份恢复自动化:
- 使用 PowerShell 脚本自动化备份操作,包括完整备份、差异备份和事务日志备份
- 配置备份验证和恢复测试,确保备份的可恢复性
- 监控备份状态,发送告警,确保备份作业正常执行
性能监控自动化:
- 使用 PowerShell 脚本收集性能数据,包括 CPU、内存、I/O 和等待类型
- 生成性能报表,识别性能瓶颈和改进机会
- 自动优化索引和统计信息,提高查询性能
安全审计自动化:
- 自动化监控权限变更,及时发现异常权限操作
- 检测异常登录尝试,防止暴力破解和未授权访问
- 生成安全审计报告,便于合规检查
生产场景:使用 dbatools PowerShell 模块自动化 SQL Server 管理任务,如 Get-DbaDatabase、Backup-DbaDatabase 和 Test-DbaBackup,提高运维效率,减少人为错误。
自动化工具
- PowerShell:Windows 内置的脚本语言,适合编写自动化脚本,管理 SQL Server
- SQL Server Agent:SQL Server 内置的作业调度工具,适合调度数据库相关任务
- dbatools:开源的 SQL Server 管理 PowerShell 模块,提供了丰富的 cmdlet,简化管理任务
- Ansible:自动化配置管理工具,适合大规模服务器管理和配置
- Azure DevOps:CI/CD 工具,适合自动化部署和测试,实现 DevOps 实践
版本差异:
- SQL Server 2012-2014:PowerShell 支持有限,需要安装 SQL Server PowerShell 模块
- SQL Server 2016+:内置了更多 PowerShell cmdlet,支持更多自动化场景
- SQL Server 2019+:支持 Azure DevOps 集成,便于实现 DevOps 实践,如自动化部署和测试
常见问题(FAQ)
如何处理 SQL Server 服务无法启动的情况?
- 检查 SQL Server 错误日志,通常位于
C:\Program Files\Microsoft SQL Server\MSSQLXX.MSSQLSERVER\MSSQL\Log目录下 - 检查 Windows 事件日志,特别是应用程序日志和系统日志,查找相关错误信息
- 验证数据库文件和日志文件的完整性和权限,确保 SQL Server 服务账户有访问权限
- 检查账户权限,确保 SQL Server 服务账户具有足够的权限:
Get-WmiObject -Class Win32_Service -Filter "Name='MSSQLSERVER'" | Select-Object Name, StartName - 尝试以单用户模式启动 SQL Server:
sqlservr.exe -s MSSQLSERVER -m,便于诊断问题 - 检查端口占用情况:
netstat -ano | findstr :1433,确保端口未被其他程序占用
如何优化 SQL Server 的性能?
使用 DMVs 分析性能瓶颈:
- 高 CPU:
sys.dm_exec_query_stats、sys.dm_exec_procedure_stats - 高 I/O:
sys.dm_io_virtual_file_stats、sys.dm_db_index_physical_stats - 阻塞:
sys.dm_exec_requests、sys.dm_tran_locks - 等待类型:
sys.dm_os_wait_stats
- 高 CPU:
优化索引:
- 识别缺失索引:
sys.dm_db_missing_index_details - 消除索引碎片:
ALTER INDEX REORGANIZE或ALTER INDEX REBUILD - 删除无用索引:
sys.dm_db_index_usage_stats
- 识别缺失索引:
优化查询语句:
- 使用执行计划分析查询性能,识别瓶颈
- 避免使用
SELECT *,只查询需要的列,减少 I/O - 优化 JOIN 条件和 WHERE 子句,确保能使用索引
- 避免在 WHERE 子句中使用函数,防止索引失效
调整 SQL Server 配置参数:
- 最大服务器内存:
sp_configure 'max server memory', 内存大小,避免操作系统内存不足 - 并行度:
sp_configure 'max degree of parallelism', 并行度值,根据 CPU 核心数调整 - 查询优化器成本阈值:
sp_configure 'cost threshold for parallelism', 阈值,避免小查询使用并行
- 最大服务器内存:
考虑硬件升级:
- 增加内存,提高缓存命中率
- 使用更快的存储设备(如 SSD、NVMe),提高 I/O 性能
- 升级 CPU,提高并发处理能力
如何确保备份的安全性和可靠性?
实施 3-2-1 备份原则:
- 3 份备份副本,防止单点故障
- 2 种不同的存储介质,减少存储技术风险
- 1 份异地备份,确保灾难恢复能力
定期验证备份文件的完整性:
- 使用
RESTORE VERIFYONLY FROM DISK = '备份文件路径'验证备份完整性 - 每月至少进行一次完整的恢复测试,确保备份可恢复
- 使用
加密备份文件:
- 使用
BACKUP DATABASE [数据库名] TO DISK = '备份路径' WITH ENCRYPTION (ALGORITHM = AES_256)加密备份 - 安全管理加密证书和密钥,防止丢失
- 使用
限制备份文件的访问权限:
- 只授予 DBA 团队访问备份文件的权限
- 使用 NTFS 权限和云存储访问控制限制文件访问
存储备份文件在安全的位置:
- 使用独立的存储设备,与生产数据库分离
- 考虑使用云存储服务,如 Azure Blob Storage 或 AWS S3,提供高可用性和冗余
监控备份作业:
- 配置 SQL Server Agent 作业告警,备份失败时及时通知
- 使用监控工具监控备份状态,确保备份策略正常执行
如何处理数据库文件损坏?
立即停止数据库服务,防止进一步损坏:
Stop-Service -Name MSSQLSERVER备份损坏的数据库文件(如果可能),作为最后的恢复选项
尝试使用
DBCC CHECKDB修复数据库:DBCC CHECKDB([数据库名], REPAIR_REBUILD):修复非物理损坏,不丢失数据DBCC CHECKDB([数据库名], REPAIR_ALLOW_DATA_LOSS):修复物理损坏,可能导致数据丢失,谨慎使用
如果修复失败,从最新的完整备份和事务日志备份恢复:
sqlRESTORE DATABASE [数据库名] FROM DISK = '完整备份路径' WITH NORECOVERY; RESTORE DATABASE [数据库名] FROM DISK = '差异备份路径' WITH NORECOVERY; RESTORE LOG [数据库名] FROM DISK = '日志备份路径' WITH RECOVERY;如果没有可用备份,考虑使用专业的数据恢复工具,但成功率不保证
恢复后,执行
DBCC CHECKDB验证数据库完整性,确保数据库正常
如何规划 SQL Server 的容量?
收集过去 6-12 个月的数据库增长数据:
- 数据库大小:
SELECT name, size/128.0 AS SizeMB FROM sys.database_files - 数据文件增长:分析文件大小变化趋势
- 事务日志增长:
DBCC SQLPERF(LOGSPACE)定期收集
- 数据库大小:
分析数据增长趋势:
- 使用 Excel 或 Power BI 生成增长趋势图表
- 识别数据增长的季节性和周期性,如电商促销期间数据增长
考虑业务增长和新功能上线的影响:
- 与业务部门沟通,了解未来业务增长计划和新功能需求
- 评估新功能对数据库容量的影响,如新增表、索引或数据类型
计算未来 3-6 个月的容量需求:
- 使用容量计算公式:
未来容量需求 = 当前容量 + (月均增长率 × 预测月数 × 安全系数) - 安全系数一般取 1.2-1.5,根据业务重要性和增长不确定性调整
- 使用容量计算公式:
制定扩容计划:
- 确定扩容时间和方式(扩展现有文件或添加新文件)
- 评估扩容对系统的影响,包括性能和可用性
- 准备扩容脚本和回滚计划,确保扩容安全
定期回顾和调整容量规划:
- 每季度重新评估容量需求,根据实际增长情况调整预测
- 更新扩容计划,确保容量充足,避免影响业务
如何处理长时间运行的查询?
识别长时间运行的查询:
sqlSELECT session_id, status, command, cpu_time, total_elapsed_time, wait_type, wait_time, text FROM sys.dm_exec_requests CROSS APPLY sys.dm_exec_sql_text(sql_handle) WHERE status = 'running' AND total_elapsed_time > 60000; -- 运行时间超过 1 分钟分析查询执行计划:
- 使用
sys.dm_exec_query_plan获取查询计划 - 识别执行计划中的瓶颈,如表扫描、书签查找、高成本的 JOIN 操作
- 使用
优化查询:
- 添加缺失索引,提高查询性能
- 优化查询逻辑,简化复杂查询
- 调整查询参数,避免全表扫描
- 考虑使用临时表或表变量,减少中间结果集
如果查询影响业务,可以终止查询:
sqlKILL 会话ID;注意:终止查询可能导致事务回滚,影响数据库性能,谨慎使用
监控长时间运行的查询:
- 使用 SQL Server Agent 作业定期检查长时间运行的查询
- 配置告警,当查询运行时间超过阈值时通知 DBA
- 分析查询历史,找出频繁出现的长时间运行查询,进行优化
如何管理 SQL Server 事务日志?
选择合适的恢复模式:
- 完整恢复模式:适合生产环境,支持点时间恢复,需要定期备份事务日志
- 简单恢复模式:适合开发/测试环境,日志会自动截断,不支持点时间恢复
- 大容量日志恢复模式:适合执行大容量操作时使用,减少日志量
制定合理的事务日志备份策略:
- 对于完整恢复模式,建议每 15-30 分钟备份一次事务日志
- 对于大型数据库或高事务量系统,可以考虑更频繁的日志备份
监控事务日志使用率:
- 使用
DBCC SQLPERF(LOGSPACE)监控日志使用率 - 当日志使用率超过 80% 时,考虑执行日志备份或扩展日志文件
- 使用
避免长时间运行的事务:
- 监控长时间运行的事务:
SELECT * FROM sys.dm_tran_active_transactions WHERE DATEDIFF(MINUTE, transaction_begin_time, GETDATE()) > 10 - 优化批量操作,使用分批处理,如每次处理 1000 行数据
- 避免在事务中执行大量查询或报表操作
- 监控长时间运行的事务:
合理设置日志文件大小和增长方式:
- 初始大小设置足够大,避免频繁自动增长,影响性能
- 增长方式设置为固定大小(如 500MB),避免百分比增长导致的不可预测性
- 考虑添加多个日志文件,分布在不同的物理磁盘上,提高 I/O 性能
定期收缩日志文件(仅在必要时):
- 先执行日志备份,释放日志空间
- 使用
DBCC SHRINKFILE (日志文件名, 目标大小)收缩日志文件 - 避免频繁收缩日志文件,会导致碎片,影响性能
- 收缩后,调整日志文件初始大小,避免再次频繁增长
如何安全地进行 SQL Server 版本升级?
制定详细的升级计划:
- 评估当前环境和升级目标,包括硬件、软件和应用程序兼容性
- 识别潜在的升级障碍,如不兼容的功能、驱动程序或第三方工具
- 制定回滚计划,确保升级失败时能恢复到原版本
进行预升级准备:
- 备份所有数据库和系统数据库,包括 master、msdb 和 model
- 检查硬件和软件兼容性:使用 SQL Server 升级顾问或 Data Migration Assistant
- 在测试环境中测试升级,验证功能和性能,包括应用程序兼容性
- 准备升级所需的安装介质、许可证和补丁
执行升级:
- 在业务低峰期执行升级,减少对业务的影响
- 按照升级向导的步骤执行,监控升级过程
- 如遇问题,执行回滚计划,恢复到原版本
升级后验证:
- 检查 SQL Server 服务状态,确保服务正常运行
- 验证数据库完整性:
DBCC CHECKDB,确保数据没有损坏 - 测试业务功能,确保应用程序正常工作
- 更新统计信息:
EXEC sp_updatestats,优化查询性能 - 重新编译存储过程:
EXEC sp_recompile '存储过程名',确保使用新的查询计划
进行升级后优化:
- 更新数据库兼容性级别:
ALTER DATABASE [数据库名] SET COMPATIBILITY_LEVEL = 150(SQL Server 2019),启用新功能 - 启用新功能:如 Query Store、Intelligent Query Processing,提高性能
- 监控性能,调整配置,确保系统稳定运行
- 更新数据库兼容性级别:
如何实施 SQL Server 高可用性?
根据业务需求选择合适的高可用性方案:
- Always On 可用性组:适合企业级高可用性,支持多个副本,提供自动故障转移
- Failover Cluster Instances (FCI):适合需要共享存储的场景,提供实例级故障转移
- Database Mirroring:适合简单的主备架构(SQL Server 2016 及以前版本支持)
- Log Shipping:适合跨地域的灾难恢复,提供手动故障转移
规划高可用性架构:
- 确定副本数量和位置,包括本地和异地副本
- 选择同步或异步提交模式,平衡性能和数据一致性
- 规划见证服务器(如需要),用于自动故障转移
- 考虑网络带宽和延迟,特别是异地副本
实施高可用性解决方案:
- 准备硬件和软件环境,包括 Windows Server Failover Cluster(如需要)
- 配置高可用性组件,如创建可用性组或配置镜像
- 测试故障转移,确保故障转移过程正常,符合 RTO 要求
监控和维护高可用性环境:
- 监控可用性组状态:
sys.dm_hadr_availability_group_states - 监控同步状态:
sys.dm_hadr_database_replica_states - 定期测试故障转移,确保高可用性机制正常工作
- 确保备份策略适应高可用性环境,如备份主副本或首选副本
- 监控可用性组状态:
制定故障转移计划:
- 确定故障转移触发条件,如手动故障转移和自动故障转移
- 制定故障转移步骤,包括通知相关方、验证故障、执行故障转移和验证恢复
- 测试故障转移过程,确保所有相关人员熟悉流程
- 定期更新故障转移计划,适应环境变化
如何优化 SQL Server 存储性能?
选择合适的存储架构:
- 使用 RAID 配置,如 RAID 10 用于数据文件(提供高性能和冗余),RAID 5 用于备份(提供大容量和容错)
- 考虑使用 SSD 或 NVMe 存储,提高 I/O 性能,特别是对于随机 I/O 密集型工作负载
- 分离数据文件、日志文件和备份文件到不同的存储设备,避免 I/O 争用
优化数据库文件布局:
- 为大型数据库创建多个数据文件,分布在不同的物理磁盘上,提高 I/O 并行性
- 设置合适的文件初始大小和增长方式,避免频繁自动增长
- 考虑使用文件组分离热点数据和冷数据,优化存储和查询性能
优化 I/O 模式:
- 避免随机 I/O,尽量使用顺序 I/O,如通过索引优化和查询调整
- 优化查询以减少 I/O 操作,如使用索引覆盖查询、避免表扫描
- 使用 READ_COMMITTED_SNAPSHOT 隔离级别,减少锁争用和阻塞
监控存储性能:
- 使用
sys.dm_io_virtual_file_stats监控文件 I/O 性能,识别瓶颈文件 - 监控磁盘队列长度和延迟,确保存储系统性能符合要求
- 使用 Performance Monitor 监控存储性能计数器,如 PhysicalDisk 计数器
- 使用
考虑使用存储级别的优化:
- 存储缓存,提高热点数据访问速度
- 自动分层存储,将不常用数据迁移到低成本存储
- 数据压缩,减少存储容量和 I/O 需求
优化备份和恢复操作:
- 使用压缩备份减少 I/O 和存储需求
- 选择合适的备份窗口,避免影响业务高峰期
- 考虑使用增量备份或差异备份,减少备份时间和 I/O
版本差异:
- SQL Server 2012-2014:存储优化功能有限,主要依赖硬件和基本的文件管理
- SQL Server 2016+:增强了存储优化功能,支持 Stretch Database(将冷数据迁移到 Azure)和 Columnstore Index(列式存储,提高分析查询性能)
- SQL Server 2019+:支持内存优化表和持久化内存,提供更高的性能和更低的延迟,适合高并发工作负载
