创建 SQL Server 维护计划
可以计划定期 SQL Server 维护的典型活动包括:
- 数据库和事务日志备份
- 数据库一致性检查
- 索引维护
- 统计信息更新
了解备份的重要性以及所有数据库的索引和统计信息维护至关重要。 数据库一致性检查(也称为 CHECKDB(使用命令 DBCC CHECKDB)同样重要,因为它们是检查整个数据库是否损坏的唯一方法。 根据数据库的大小和运行时间要求,可以每晚执行所有这些活动。 但是,在生产系统中,维护作通常分布在一周内,因为索引维护和一致性检查都是非常 I/O 密集型的,通常在周末完成。
许多 DBA 在安排大型数据库的备份时,会将备份时间错开,通常每周进行一次完整备份,并使用差异备份和事务日志备份来管理恢复到特定的时间点。 SQL Server 提供了使用维护计划管理所有这些任务的内置方法。 维护计划创建任务流程以支持数据库,并作为 Integration Services 包创建,能够安排维护活动。 此外,许多 DBA 使用开源脚本进行数据库维护,以提高对维护活动的灵活性和控制。
维护计划的最佳做法
维护计划不仅有助于执行数据库维护,还提供从 msdb 数据库中删除数据的选项,该数据库充当 SQL Server 代理的数据存储。 此外,维护计划允许指定从磁盘中删除较旧的数据库备份。 删除旧的备份文件可减少备份卷的大小,并帮助管理 msdb 数据库的大小。
确保备份保留期长于一致性检查窗口。 例如,如果每周运行一致性检查,则应保留足够的备份历史记录,以便在一致性检查中检测到潜在损坏时进行恢复。 请注意,备份操作不会检测数据库中的损坏,因此备份文件中可能存在损坏。 维护计划活动会作为 SQL Server 代理作业安排执行。
创建维护计划
可以使用 SQL Server Management Studio 创建维护计划,如下所示。 在此示例中,多个维护任务合并为一个维护计划。 但是,最佳做法是为每种任务类型创建单独的维护计划,甚至可能为服务器上的特定数据库创建一个单独的维护计划。 例如,可以创建一个维护计划来备份系统数据库,另一个计划用于备份用户数据库。 此外,还可以使用单独的维护计划来处理特别大型用户数据库的备份。 下图和以下示例演示如何使用维护计划向导创建维护计划。
该图显示了 SQL Server Management Studio(SSMS)中维护计划向导的第一个屏幕。 需要为维护计划指定名称以及运行身份帐户。 大多数维护任务将作为 SQL Server 代理服务帐户运行,但出于安全考虑,某些任务可能需要作为其他帐户运行。 例如,如果需要备份到只能由特定帐户访问的文件共享,将使用代理用户,该用户是 SQL Server 代理的组件。
什么是代理帐户?
代理帐户是一个具有存储凭据的帐户,SQL Server 代理可用于将特定作业步骤作为指定用户执行。 此用户的登录信息以凭据的形式存储在 SQL Server 实例中。 当特定作业步骤需要非常精细的安全权限时,通常会使用代理帐户。
假设你有一个 SQL Server 代理作业,该作业需要将数据库备份到网络文件共享。 如果 SQL Server 代理服务帐户无权访问文件共享,则可以创建具有必要权限的代理帐户。 然后,可以使用此代理帐户来运行备份步骤,确保它具有所需的访问权限。
作业计划
作业计划是 msdb 系统数据库中作业系统的一部分。 SQL Server 代理作业和计划具有多对多关系,这意味着每个作业可以有多个计划,每个计划都可以分配给多个作业。 但是,维护计划向导不允许创建独立的计划。 而是为每个维护计划创建特定的计划。
以下示例显示了每周执行的计划,但还可以选择创建按小时或每日重复周期的计划。
下一步是选择要添加到计划的维护任务。 以下示例展示了您的维护计划可以执行的操作。
检查数据库完整性 - 此任务运行 DBCC CHECKDB 命令来验证每个数据库页的逻辑和物理一致性。 应定期执行此任务,并将其与备份保留时段保持一致。 在放弃任何以前的备份以防止损坏之前,请确保完成一致性检查。
收缩数据库 - 此任务通过将数据移动到页面上的可用空间来减小数据库或事务日志文件的大小。 释放足够的空间后,可以返回到文件系统。 建议不要在定期维护中包括此作,因为它会导致严重的索引碎片,从而损害数据库性能。 该操作也是非常 I/O 和 CPU 密集型的,这会显著影响系统性能。
重新组织/重新生成索引 - 此任务检查数据库的索引中的碎片级别,并根据用户定义的碎片级别重新生成或重新组织索引。 重新生成索引还会更新其统计信息。
更新统计信息 - 此任务更新 SQL Server 用于生成查询执行计划的列和索引统计信息。 准确的统计信息对于查询优化器做出最佳决策至关重要。 可以选择要扫描的表和索引以及要扫描的行数或百分比。 默认采样率通常足够,但可能需要对特定表进行更详细的统计信息。
清理历史记录 - 此任务从 msdb 数据库中删除备份和还原作的历史记录,以及 SQL Server 代理作业的历史记录。 它有助于管理 msdb 数据库的大小。
执行 SQL Server 代理作业 - 此任务运行用户定义的 SQL Server 代理作业。
备份数据库(完整/差异/日志) - 此任务备份 SQL Server 实例上的数据库。 完整备份将捕获整个数据库,并充当还原的起点。 差异备份捕获自上次完整备份以来已更改的页面,并提供增量还原点。 事务日志备份捕获事务日志中的活动页,允许定义恢复点目标。 请注意,事务日志备份不能在 SIMPLE 恢复模式下对数据库执行。
例如,如果在星期日执行完整备份,并且每周每个工作日进行差异备份,若要将数据库还原到周四中午,则需还原星期日的完整备份、星期三的差异备份,以及从星期三的差异备份到星期四中午的事务日志备份。
维护清理任务 - 此任务删除与维护计划相关的旧文件,包括文本报告和备份文件。 它仅删除指定文件夹中的备份,因此必须显式列出任何子文件夹,否则将跳过这些备份。
每个任务可以限定为用户数据库、系统数据库或自定义数据库选择,并且每个任务都有特定的配置选项。
创建后,计划会在 SQL Server 代理中显示为作业。 如果在创建过程中或之后添加了计划,将执行该作业并执行维护任务。
多服务器环境
在 多服务器环境中,SQL Server 代理允许将一台服务器指定为可在其他服务器上执行作业的主服务器,称为目标服务器。 主服务器存储作业的主要源并将其分发到目标服务器。 目标服务器定期连接到主服务器以更新作业计划。 通过此设置,可以定义一次作业,并在企业中部署该作业。 例如,可以在主服务器上配置数据库维护任务,并将其推送到一组目标服务器,确保部署一致。