Skip to content

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/OPerformance 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(业务低峰期)

维护内容

  1. 索引维护

    • 检查索引碎片: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) 限制并行度,减少对系统资源的影响。

  2. 数据库一致性检查

    • 执行 DBCC CHECKDB([数据库名]) WITH NO_INFOMSGS, ALL_ERRORMSGS
    • 检查结果保存到日志文件

    生产场景:对于超大型数据库(> 500GB),考虑使用 DBCC CHECKDB([数据库名], PHYSICAL_ONLY) 只检查物理一致性,减少检查时间和资源消耗。

  3. 备份验证

    • 随机选择一个核心数据库进行恢复测试
    • 使用 RESTORE VERIFYONLY FROM DISK = '备份文件路径' 验证备份完整性

    生产场景:在隔离的测试环境中恢复,验证备份可恢复性,不影响生产环境。

  4. 日志清理

    • 清理 SQL Server 错误日志:EXEC sp_cycle_errorlog
    • 清理 SQL Server Agent 日志:EXEC msdb.dbo.sp_cycle_agent_errorlog
    • 归档并清理旧的备份日志文件

    生产场景:设置日志循环策略,保留最近 7 天的日志文件,避免日志文件过多占用磁盘空间。

版本差异

  • 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(业务低峰期)

维护内容

  1. 完整备份验证

    • 对所有核心数据库进行恢复测试
    • 验证恢复后的数据库完整性,使用 DBCC CHECKDB

    生产场景:在专门的测试环境中进行恢复测试,模拟真实恢复场景,记录恢复时间。

  2. 容量规划

    • 分析数据库增长趋势:SELECT name, size/128.0 AS SizeMB FROM sys.database_files
    • 预测未来 3-6 个月的容量需求
    • 制定扩容计划,包括存储、内存和 CPU 需求

    生产场景:使用 PowerShell 脚本定期收集容量数据,生成可视化报表,便于分析增长趋势和制定扩容计划。

  3. 性能回顾

    • 分析过去一个月的性能数据,包括 CPU、内存、I/O 和等待类型
    • 识别性能瓶颈和改进机会,如慢查询、缺失索引
    • 制定性能优化计划,优先处理影响核心业务的性能问题

    生产场景:使用 sys.dm_exec_query_statssys.dm_exec_procedure_stats 分析最消耗资源的查询和存储过程,重点优化核心业务逻辑。

  4. 安全审计

    • 检查用户权限变更: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_lockssys.dm_os_waiting_tasks 分析阻塞链,快速定位问题
错误严重错误实时错误级别 >= 16及时发现系统级错误,如资源不足、访问失败

版本差异

  • SQL Server 2012-2014:监控指标有限,主要依赖 Performance Monitor 和基本 DMVs
  • SQL Server 2016+:引入 Query Store 用于性能监控和查询计划管理,便于识别和解决性能问题
  • SQL Server 2019+:增强了 sys.dm_os_memory_clerkssys.dm_os_memory_nodes 的内存监控能力,支持更精细的内存管理

监控工具

  1. 内置工具

    • 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,减少性能开销,适合生产环境长期监控。

  2. 第三方工具

    • 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 小时内处理如:备份成功通知、常规维护完成

告警处理步骤

  1. 收到告警后,立即通过监控工具确认告警真实性
  2. 分析告警原因,使用 DMVs 和日志定位问题
  3. 采取措施解决问题,如终止阻塞会话、扩展磁盘空间、重启服务
  4. 验证问题解决,确保业务恢复正常
  5. 记录告警处理过程和结果,包括问题原因、解决方案和预防措施

生产场景:使用 PowerShell 脚本结合企业微信、Slack 或邮件实现告警通知,确保 DBA 团队 7×24 小时及时收到告警信息。

变更管理

变更分类

类别定义审批流程生产场景
紧急变更解决生产环境故障或安全漏洞的变更紧急审批,由 DBA 团队负责人批准如:修复安全漏洞、恢复服务、解决阻塞问题
标准变更预定义、风险低的常规变更简化审批,由 DBA 团队负责人批准如:索引维护、统计信息更新、常规备份
重大变更可能影响系统稳定性或性能的变更完整审批,由 DBA 团队负责人、系统架构师和业务负责人批准如:数据库迁移、版本升级、架构变更、大容量数据导入

变更流程

  1. 变更申请

    • 填写变更申请表,包括变更内容、影响范围、风险评估和回滚计划
    • 提交给 DBA 团队负责人审批

    生产场景:使用 Jira 等变更管理系统跟踪变更流程,确保所有变更都有记录,便于审计和追溯。

  2. 变更审批

    • 审批人评估变更风险和影响,包括对性能、可用性和数据完整性的影响
    • 批准或拒绝变更申请,如需修改,反馈修改意见

    生产场景:对于重大变更,组织变更评审会议,邀请相关方参与评估,确保变更符合业务需求和技术规范。

  3. 变更准备

    • 准备变更脚本和工具,包括执行脚本和回滚脚本
    • 在测试环境中测试变更效果,验证功能和性能
    • 准备变更执行计划,包括时间窗口、人员分工和监控方案

    生产场景:使用 Git 等版本控制系统管理变更脚本,确保脚本的可追溯性和版本控制。

  4. 变更执行

    • 在计划的业务低峰期执行变更
    • 执行前备份相关数据库和配置,确保可以回滚到变更前的状态
    • 变更过程中安排专人监控,包括系统性能、数据库状态和业务影响
    • 如遇问题,立即执行回滚计划,恢复系统到变更前状态

    生产场景:对于数据库架构变更,使用 SQL Server Data Tools (SSDT) 进行 schema 比较和部署,确保变更的安全性和一致性。

  5. 变更验证

    • 验证变更效果,包括功能验证和性能验证
    • 检查系统状态和性能,确保没有引入新的问题
    • 确认业务正常运行,通知业务部门变更完成

    生产场景:使用自动化测试脚本验证变更效果,减少人工验证的工作量和误差。

  6. 变更记录

    • 记录变更执行过程和结果,包括执行时间、参与人员、变更内容和验证结果
    • 更新配置管理数据库(CMDB),确保配置信息的准确性
    • 总结变更经验教训,分享给团队成员,促进知识共享和流程改进

    生产场景:编写变更总结报告,包括变更背景、执行过程、验证结果和改进建议,存档备查。

变更注意事项

  1. 所有变更必须在业务低峰期执行,避免影响正常业务
  2. 变更前必须备份相关数据库和配置,确保可以回滚
  3. 变更过程必须有专人监控,及时发现和解决问题
  4. 变更后必须验证业务正常运行,确保变更达到预期效果
  5. 重大变更必须进行预演,验证变更流程和回滚方案的可行性
  6. 变更脚本必须经过代码审查,确保脚本的正确性和安全性
  7. 变更必须有明确的回滚计划,包括回滚步骤和验证方法

容量管理

容量规划

数据收集

  • 收集过去 6-12 个月的数据库增长数据,包括数据文件和日志文件大小
  • 分析数据增长趋势,识别增长的季节性和周期性
  • 考虑业务增长和新功能上线的影响,如业务扩张、新产品上线

容量计算公式

未来容量需求 = 当前容量 + (月均增长率 × 预测月数 × 安全系数)

安全系数:一般取 1.2-1.5,根据业务重要性和增长不确定性调整

生产场景:使用 PowerShell 脚本定期收集数据库大小、文件增长和磁盘空间数据,生成容量预测报表,结合业务规划制定长期容量计划。

空间监控

监控内容

  • 数据文件空间使用率和增长趋势
  • 日志文件空间使用率和增长趋势
  • 磁盘空间使用率和增长趋势

监控方法

  1. 使用动态管理视图监控数据库文件空间:

    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;
  2. 使用 PowerShell 脚本定期生成空间报告,发送给 DBA 团队

  3. 使用监控工具设置空间告警,当使用率达到阈值时触发告警

生产场景:对于事务日志文件,监控其增长速度和使用率,结合业务活动分析日志增长原因,优化事务处理逻辑,避免长时间运行的事务。

扩容流程

  1. 扩容评估

    • 确认扩容需求,包括扩容原因和目标容量
    • 评估扩容对系统的影响,包括性能、可用性和成本
    • 选择扩容方式,如扩展现有文件、添加新文件或增加磁盘空间

    生产场景:对于大型数据库,优先选择添加新的数据文件到不同的物理磁盘,而不是扩展现有文件,以提高 I/O 性能和负载均衡。

  2. 扩容方式

    • 扩展现有数据文件:适合中小规模数据库,操作简单
    • 添加新的数据文件:适合大型数据库,提高 I/O 性能
    • 增加磁盘空间:适合所有规模数据库,需要系统管理员配合
  3. 扩容执行

    sql
    -- 扩展现有数据文件
    ALTER DATABASE [数据库名] MODIFY FILE (NAME = N'文件名', SIZE = 新大小MB, FILEGROWTH = 增长大小MB);
    
    -- 添加新的数据文件
    ALTER DATABASE [数据库名] ADD FILE (NAME = N'新文件名', FILENAME = N'文件路径', SIZE = 初始大小MB, FILEGROWTH = 增长大小MB);
  4. 扩容验证

    • 验证数据文件大小和增长设置是否正确
    • 检查系统性能,确保扩容没有引入新的性能问题
    • 确认业务正常运行,没有受到扩容影响

    生产场景:扩容后,监控系统性能和数据库状态,特别是 I/O 性能和查询响应时间,确保扩容达到预期效果。

版本差异

  • SQL Server 2012-2014:最大数据库大小为 524 PB,支持基本的文件管理功能
  • SQL Server 2016+:支持更大的数据库大小,引入了 Stretch Database 用于将冷数据迁移到 Azure,优化存储成本
  • SQL Server 2019+:支持内存优化表的更大容量,增强了对持久化内存的支持

应急响应

应急响应团队

团队组成

  • DBA 团队负责人:协调应急响应工作,负责决策和沟通
  • 资深 DBA:负责技术实施,执行故障修复和恢复操作
  • 系统管理员:负责服务器和存储支持,如磁盘扩容、服务重启
  • 业务负责人:提供业务影响评估,确定恢复优先级
  • 网络管理员:负责网络连接支持,如防火墙配置、网络故障排查

生产场景:建立 7×24 小时应急响应机制,确保随时有人处理紧急故障,包括轮班制度和联系方式清单。

应急响应流程

  1. 故障发现

    • 通过监控系统自动发现故障,触发告警
    • 接到业务部门的故障报告,如用户无法访问系统、交易失败

    生产场景:设置多种故障报告渠道,如电话、邮件、即时通讯工具等,确保故障能及时上报。

  2. 故障评估

    • 确认故障范围和影响,包括受影响的系统、用户和业务流程
    • 确定故障级别,如 P0、P1、P2 或 P3
    • 启动相应的应急响应预案,组织相关人员参与故障处理

    生产场景:使用预定义的故障级别矩阵,快速确定故障优先级和响应时间,确保资源优先用于解决高优先级故障。

  3. 故障定位

    • 收集故障相关信息,包括错误日志、监控数据和用户反馈
    • 分析日志和监控数据,定位故障原因,如硬件故障、软件缺陷、配置错误
    • 使用 DMVs 和诊断工具进行深入分析,如 sys.dm_exec_requestssys.dm_tran_lockssys.dm_os_waiting_tasks

    生产场景:对于性能问题,使用 Query Store(SQL Server 2016+)快速定位慢查询和计划回归问题。

  4. 故障修复

    • 执行故障修复方案,如重启服务、修复配置、恢复数据库
    • 监控修复过程,确保修复操作没有引入新的问题
    • 如遇问题,调整修复方案,必要时执行回滚

    生产场景:对于复杂故障,组织应急响应会议,集中讨论修复方案。

  5. 业务恢复

    • 验证业务系统恢复正常,包括功能验证和性能验证
    • 通知业务部门恢复使用,提供恢复时间和影响范围
    • 持续监控系统状态,确保没有复发

    生产场景:制定业务恢复验证清单,确保所有业务功能都已恢复正常,特别是核心业务流程。

  6. 故障复盘

    • 分析故障原因和影响,包括根本原因和直接原因
    • 总结经验教训,提出改进措施,避免类似故障再次发生
    • 更新应急预案,完善故障处理流程
    • 向相关方汇报故障处理结果和改进计划

    生产场景:在故障恢复后 24 小时内召开故障复盘会议,形成故障报告,包括故障背景、处理过程、根本原因和改进建议。

常见故障处理预案

数据库无法访问

  1. 检查 SQL Server 服务状态:Get-Service -Name MSSQLSERVER
  2. 检查网络连接和防火墙设置:Test-NetConnection -ComputerName ServerName -Port 1433
  3. 检查数据库状态:SELECT name, state_desc FROM sys.databases
  4. 查看错误日志:EXEC xp_readerrorlog 0, 1, NULL, NULL, NULL, NULL, N'DESC'
  5. 尝试以单用户模式启动 SQL Server:sqlservr.exe -s MSSQLSERVER -m
  6. 检查端口占用情况:netstat -ano | findstr :1433

事务日志满

  1. 检查事务日志使用率:DBCC SQLPERF(LOGSPACE)
  2. 确认是否有长时间运行的事务:SELECT * FROM sys.dm_tran_active_transactions WHERE DATEDIFF(MINUTE, transaction_begin_time, GETDATE()) > 10
  3. 执行日志备份,释放日志空间:BACKUP LOG [数据库名] TO DISK = N'备份路径'
  4. 如需要,扩展事务日志文件:ALTER DATABASE [数据库名] MODIFY FILE (NAME = N'日志文件名', SIZE = 新大小MB)
  5. 优化事务处理逻辑,避免长时间运行的事务,如将大事务拆分为多个小事务

长时间阻塞

  1. 定位阻塞源:
    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;
  2. 分析阻塞原因:使用 DBCC INPUTBUFFER(blocking_session_id) 查看阻塞会话正在执行的语句
  3. 如需要,终止阻塞会话:KILL 会话ID
  4. 优化导致阻塞的查询,如添加索引、调整查询逻辑、使用查询提示
  5. 考虑使用快照隔离级别或读提交快照隔离级别,减少阻塞

版本差异

  • 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 功能,保护敏感数据在使用过程中的安全,即使数据库被泄露也能保护数据

自动化运维

自动化任务

  1. 日常巡检自动化

    • 使用 PowerShell 脚本编写巡检脚本,包括服务状态、数据库状态、日志空间、磁盘空间等检查项
    • 使用 SQL Server Agent 或 Windows Task Scheduler 定期执行巡检脚本
    • 生成巡检报告,发送给 DBA 团队,包括异常情况和建议
  2. 备份恢复自动化

    • 使用 PowerShell 脚本自动化备份操作,包括完整备份、差异备份和事务日志备份
    • 配置备份验证和恢复测试,确保备份的可恢复性
    • 监控备份状态,发送告警,确保备份作业正常执行
  3. 性能监控自动化

    • 使用 PowerShell 脚本收集性能数据,包括 CPU、内存、I/O 和等待类型
    • 生成性能报表,识别性能瓶颈和改进机会
    • 自动优化索引和统计信息,提高查询性能
  4. 安全审计自动化

    • 自动化监控权限变更,及时发现异常权限操作
    • 检测异常登录尝试,防止暴力破解和未授权访问
    • 生成安全审计报告,便于合规检查

生产场景:使用 dbatools PowerShell 模块自动化 SQL Server 管理任务,如 Get-DbaDatabaseBackup-DbaDatabaseTest-DbaBackup,提高运维效率,减少人为错误。

自动化工具

  1. PowerShell:Windows 内置的脚本语言,适合编写自动化脚本,管理 SQL Server
  2. SQL Server Agent:SQL Server 内置的作业调度工具,适合调度数据库相关任务
  3. dbatools:开源的 SQL Server 管理 PowerShell 模块,提供了丰富的 cmdlet,简化管理任务
  4. Ansible:自动化配置管理工具,适合大规模服务器管理和配置
  5. 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 服务无法启动的情况?

  1. 检查 SQL Server 错误日志,通常位于 C:\Program Files\Microsoft SQL Server\MSSQLXX.MSSQLSERVER\MSSQL\Log 目录下
  2. 检查 Windows 事件日志,特别是应用程序日志和系统日志,查找相关错误信息
  3. 验证数据库文件和日志文件的完整性和权限,确保 SQL Server 服务账户有访问权限
  4. 检查账户权限,确保 SQL Server 服务账户具有足够的权限:Get-WmiObject -Class Win32_Service -Filter "Name='MSSQLSERVER'" | Select-Object Name, StartName
  5. 尝试以单用户模式启动 SQL Server:sqlservr.exe -s MSSQLSERVER -m,便于诊断问题
  6. 检查端口占用情况:netstat -ano | findstr :1433,确保端口未被其他程序占用

如何优化 SQL Server 的性能?

  1. 使用 DMVs 分析性能瓶颈:

    • 高 CPU:sys.dm_exec_query_statssys.dm_exec_procedure_stats
    • 高 I/O:sys.dm_io_virtual_file_statssys.dm_db_index_physical_stats
    • 阻塞:sys.dm_exec_requestssys.dm_tran_locks
    • 等待类型:sys.dm_os_wait_stats
  2. 优化索引:

    • 识别缺失索引:sys.dm_db_missing_index_details
    • 消除索引碎片:ALTER INDEX REORGANIZEALTER INDEX REBUILD
    • 删除无用索引:sys.dm_db_index_usage_stats
  3. 优化查询语句:

    • 使用执行计划分析查询性能,识别瓶颈
    • 避免使用 SELECT *,只查询需要的列,减少 I/O
    • 优化 JOIN 条件和 WHERE 子句,确保能使用索引
    • 避免在 WHERE 子句中使用函数,防止索引失效
  4. 调整 SQL Server 配置参数:

    • 最大服务器内存:sp_configure 'max server memory', 内存大小,避免操作系统内存不足
    • 并行度:sp_configure 'max degree of parallelism', 并行度值,根据 CPU 核心数调整
    • 查询优化器成本阈值:sp_configure 'cost threshold for parallelism', 阈值,避免小查询使用并行
  5. 考虑硬件升级:

    • 增加内存,提高缓存命中率
    • 使用更快的存储设备(如 SSD、NVMe),提高 I/O 性能
    • 升级 CPU,提高并发处理能力

如何确保备份的安全性和可靠性?

  1. 实施 3-2-1 备份原则:

    • 3 份备份副本,防止单点故障
    • 2 种不同的存储介质,减少存储技术风险
    • 1 份异地备份,确保灾难恢复能力
  2. 定期验证备份文件的完整性:

    • 使用 RESTORE VERIFYONLY FROM DISK = '备份文件路径' 验证备份完整性
    • 每月至少进行一次完整的恢复测试,确保备份可恢复
  3. 加密备份文件:

    • 使用 BACKUP DATABASE [数据库名] TO DISK = '备份路径' WITH ENCRYPTION (ALGORITHM = AES_256) 加密备份
    • 安全管理加密证书和密钥,防止丢失
  4. 限制备份文件的访问权限:

    • 只授予 DBA 团队访问备份文件的权限
    • 使用 NTFS 权限和云存储访问控制限制文件访问
  5. 存储备份文件在安全的位置:

    • 使用独立的存储设备,与生产数据库分离
    • 考虑使用云存储服务,如 Azure Blob Storage 或 AWS S3,提供高可用性和冗余
  6. 监控备份作业:

    • 配置 SQL Server Agent 作业告警,备份失败时及时通知
    • 使用监控工具监控备份状态,确保备份策略正常执行

如何处理数据库文件损坏?

  1. 立即停止数据库服务,防止进一步损坏:Stop-Service -Name MSSQLSERVER

  2. 备份损坏的数据库文件(如果可能),作为最后的恢复选项

  3. 尝试使用 DBCC CHECKDB 修复数据库:

    • DBCC CHECKDB([数据库名], REPAIR_REBUILD):修复非物理损坏,不丢失数据
    • DBCC CHECKDB([数据库名], REPAIR_ALLOW_DATA_LOSS):修复物理损坏,可能导致数据丢失,谨慎使用
  4. 如果修复失败,从最新的完整备份和事务日志备份恢复:

    sql
    RESTORE DATABASE [数据库名] FROM DISK = '完整备份路径' WITH NORECOVERY;
    RESTORE DATABASE [数据库名] FROM DISK = '差异备份路径' WITH NORECOVERY;
    RESTORE LOG [数据库名] FROM DISK = '日志备份路径' WITH RECOVERY;
  5. 如果没有可用备份,考虑使用专业的数据恢复工具,但成功率不保证

  6. 恢复后,执行 DBCC CHECKDB 验证数据库完整性,确保数据库正常

如何规划 SQL Server 的容量?

  1. 收集过去 6-12 个月的数据库增长数据:

    • 数据库大小:SELECT name, size/128.0 AS SizeMB FROM sys.database_files
    • 数据文件增长:分析文件大小变化趋势
    • 事务日志增长:DBCC SQLPERF(LOGSPACE) 定期收集
  2. 分析数据增长趋势:

    • 使用 Excel 或 Power BI 生成增长趋势图表
    • 识别数据增长的季节性和周期性,如电商促销期间数据增长
  3. 考虑业务增长和新功能上线的影响:

    • 与业务部门沟通,了解未来业务增长计划和新功能需求
    • 评估新功能对数据库容量的影响,如新增表、索引或数据类型
  4. 计算未来 3-6 个月的容量需求:

    • 使用容量计算公式:未来容量需求 = 当前容量 + (月均增长率 × 预测月数 × 安全系数)
    • 安全系数一般取 1.2-1.5,根据业务重要性和增长不确定性调整
  5. 制定扩容计划:

    • 确定扩容时间和方式(扩展现有文件或添加新文件)
    • 评估扩容对系统的影响,包括性能和可用性
    • 准备扩容脚本和回滚计划,确保扩容安全
  6. 定期回顾和调整容量规划:

    • 每季度重新评估容量需求,根据实际增长情况调整预测
    • 更新扩容计划,确保容量充足,避免影响业务

如何处理长时间运行的查询?

  1. 识别长时间运行的查询:

    sql
    SELECT 
        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 分钟
  2. 分析查询执行计划:

    • 使用 sys.dm_exec_query_plan 获取查询计划
    • 识别执行计划中的瓶颈,如表扫描、书签查找、高成本的 JOIN 操作
  3. 优化查询:

    • 添加缺失索引,提高查询性能
    • 优化查询逻辑,简化复杂查询
    • 调整查询参数,避免全表扫描
    • 考虑使用临时表或表变量,减少中间结果集
  4. 如果查询影响业务,可以终止查询:

    sql
    KILL 会话ID;

    注意:终止查询可能导致事务回滚,影响数据库性能,谨慎使用

  5. 监控长时间运行的查询:

    • 使用 SQL Server Agent 作业定期检查长时间运行的查询
    • 配置告警,当查询运行时间超过阈值时通知 DBA
    • 分析查询历史,找出频繁出现的长时间运行查询,进行优化

如何管理 SQL Server 事务日志?

  1. 选择合适的恢复模式:

    • 完整恢复模式:适合生产环境,支持点时间恢复,需要定期备份事务日志
    • 简单恢复模式:适合开发/测试环境,日志会自动截断,不支持点时间恢复
    • 大容量日志恢复模式:适合执行大容量操作时使用,减少日志量
  2. 制定合理的事务日志备份策略:

    • 对于完整恢复模式,建议每 15-30 分钟备份一次事务日志
    • 对于大型数据库或高事务量系统,可以考虑更频繁的日志备份
  3. 监控事务日志使用率:

    • 使用 DBCC SQLPERF(LOGSPACE) 监控日志使用率
    • 当日志使用率超过 80% 时,考虑执行日志备份或扩展日志文件
  4. 避免长时间运行的事务:

    • 监控长时间运行的事务:SELECT * FROM sys.dm_tran_active_transactions WHERE DATEDIFF(MINUTE, transaction_begin_time, GETDATE()) > 10
    • 优化批量操作,使用分批处理,如每次处理 1000 行数据
    • 避免在事务中执行大量查询或报表操作
  5. 合理设置日志文件大小和增长方式:

    • 初始大小设置足够大,避免频繁自动增长,影响性能
    • 增长方式设置为固定大小(如 500MB),避免百分比增长导致的不可预测性
    • 考虑添加多个日志文件,分布在不同的物理磁盘上,提高 I/O 性能
  6. 定期收缩日志文件(仅在必要时):

    • 先执行日志备份,释放日志空间
    • 使用 DBCC SHRINKFILE (日志文件名, 目标大小) 收缩日志文件
    • 避免频繁收缩日志文件,会导致碎片,影响性能
    • 收缩后,调整日志文件初始大小,避免再次频繁增长

如何安全地进行 SQL Server 版本升级?

  1. 制定详细的升级计划:

    • 评估当前环境和升级目标,包括硬件、软件和应用程序兼容性
    • 识别潜在的升级障碍,如不兼容的功能、驱动程序或第三方工具
    • 制定回滚计划,确保升级失败时能恢复到原版本
  2. 进行预升级准备:

    • 备份所有数据库和系统数据库,包括 master、msdb 和 model
    • 检查硬件和软件兼容性:使用 SQL Server 升级顾问或 Data Migration Assistant
    • 在测试环境中测试升级,验证功能和性能,包括应用程序兼容性
    • 准备升级所需的安装介质、许可证和补丁
  3. 执行升级:

    • 在业务低峰期执行升级,减少对业务的影响
    • 按照升级向导的步骤执行,监控升级过程
    • 如遇问题,执行回滚计划,恢复到原版本
  4. 升级后验证:

    • 检查 SQL Server 服务状态,确保服务正常运行
    • 验证数据库完整性:DBCC CHECKDB,确保数据没有损坏
    • 测试业务功能,确保应用程序正常工作
    • 更新统计信息:EXEC sp_updatestats,优化查询性能
    • 重新编译存储过程:EXEC sp_recompile '存储过程名',确保使用新的查询计划
  5. 进行升级后优化:

    • 更新数据库兼容性级别:ALTER DATABASE [数据库名] SET COMPATIBILITY_LEVEL = 150(SQL Server 2019),启用新功能
    • 启用新功能:如 Query Store、Intelligent Query Processing,提高性能
    • 监控性能,调整配置,确保系统稳定运行

如何实施 SQL Server 高可用性?

  1. 根据业务需求选择合适的高可用性方案:

    • Always On 可用性组:适合企业级高可用性,支持多个副本,提供自动故障转移
    • Failover Cluster Instances (FCI):适合需要共享存储的场景,提供实例级故障转移
    • Database Mirroring:适合简单的主备架构(SQL Server 2016 及以前版本支持)
    • Log Shipping:适合跨地域的灾难恢复,提供手动故障转移
  2. 规划高可用性架构:

    • 确定副本数量和位置,包括本地和异地副本
    • 选择同步或异步提交模式,平衡性能和数据一致性
    • 规划见证服务器(如需要),用于自动故障转移
    • 考虑网络带宽和延迟,特别是异地副本
  3. 实施高可用性解决方案:

    • 准备硬件和软件环境,包括 Windows Server Failover Cluster(如需要)
    • 配置高可用性组件,如创建可用性组或配置镜像
    • 测试故障转移,确保故障转移过程正常,符合 RTO 要求
  4. 监控和维护高可用性环境:

    • 监控可用性组状态:sys.dm_hadr_availability_group_states
    • 监控同步状态:sys.dm_hadr_database_replica_states
    • 定期测试故障转移,确保高可用性机制正常工作
    • 确保备份策略适应高可用性环境,如备份主副本或首选副本
  5. 制定故障转移计划:

    • 确定故障转移触发条件,如手动故障转移和自动故障转移
    • 制定故障转移步骤,包括通知相关方、验证故障、执行故障转移和验证恢复
    • 测试故障转移过程,确保所有相关人员熟悉流程
    • 定期更新故障转移计划,适应环境变化

如何优化 SQL Server 存储性能?

  1. 选择合适的存储架构:

    • 使用 RAID 配置,如 RAID 10 用于数据文件(提供高性能和冗余),RAID 5 用于备份(提供大容量和容错)
    • 考虑使用 SSD 或 NVMe 存储,提高 I/O 性能,特别是对于随机 I/O 密集型工作负载
    • 分离数据文件、日志文件和备份文件到不同的存储设备,避免 I/O 争用
  2. 优化数据库文件布局:

    • 为大型数据库创建多个数据文件,分布在不同的物理磁盘上,提高 I/O 并行性
    • 设置合适的文件初始大小和增长方式,避免频繁自动增长
    • 考虑使用文件组分离热点数据和冷数据,优化存储和查询性能
  3. 优化 I/O 模式:

    • 避免随机 I/O,尽量使用顺序 I/O,如通过索引优化和查询调整
    • 优化查询以减少 I/O 操作,如使用索引覆盖查询、避免表扫描
    • 使用 READ_COMMITTED_SNAPSHOT 隔离级别,减少锁争用和阻塞
  4. 监控存储性能:

    • 使用 sys.dm_io_virtual_file_stats 监控文件 I/O 性能,识别瓶颈文件
    • 监控磁盘队列长度和延迟,确保存储系统性能符合要求
    • 使用 Performance Monitor 监控存储性能计数器,如 PhysicalDisk 计数器
  5. 考虑使用存储级别的优化:

    • 存储缓存,提高热点数据访问速度
    • 自动分层存储,将不常用数据迁移到低成本存储
    • 数据压缩,减少存储容量和 I/O 需求
  6. 优化备份和恢复操作:

    • 使用压缩备份减少 I/O 和存储需求
    • 选择合适的备份窗口,避免影响业务高峰期
    • 考虑使用增量备份或差异备份,减少备份时间和 I/O

版本差异

  • SQL Server 2012-2014:存储优化功能有限,主要依赖硬件和基本的文件管理
  • SQL Server 2016+:增强了存储优化功能,支持 Stretch Database(将冷数据迁移到 Azure)和 Columnstore Index(列式存储,提高分析查询性能)
  • SQL Server 2019+:支持内存优化表和持久化内存,提供更高的性能和更低的延迟,适合高并发工作负载