10.3 检查点

10.3 检查点


10.3.1 检查点的类型

  “检查点”会在数据库中创建一个已知的正常点,在意外关闭或崩溃后进行恢复的过程中,SQL Server 数据库引擎可以从该点开始应用日志中所包含的更改。

  出于性能方面的考虑,数据库引擎对内存(缓冲区缓存)中的数据库页进行修改,但在每次更改后不将这些页写入磁盘。相反,数据库引擎定期发出对每个数据库的检查点命令。“检查点”将当前内存中已修改的页(称为“脏页”)和事务日志信息从内存写入磁盘,并记录有关事务日志的信息。

  数据库引擎支持几种类型的检查点:自动、间接、手动和内部。

(1) 自动检查点

  自动在后台发出,以满足服务器的恢复间隔要求。自动检查点将自动运行直到完成。数据库引擎将根据未完成的写操作数以及是否检测到写入滞后时间超过 20 毫秒的写操作有所增加,来调控自动检查点。


(2) 间接检查点

  在后台发出,以满足指定的数据库的目标恢复时间要求。


(3) 手动检查点

  执行 CHECKPOINT 命令时发出。在连接的当前数据库中执行手动检查点操作。默认情况下,手动检查点运行至完成。调控方式与自动检查点的调控方式相同。例如:

CHECKPOINT


  通常,执行检查点操作所需的时间会随着该操作必须写入的脏页数的增加而增加。 默认情况下,为最大程度地降低对其他应用程序性能的影响,SQL Server 将调整检查点操作执行写入的频率。 降低写频率将增加完成检查点操作所需的时间。 SQL Server 对手动检查点使用此策略,除非在 CHECKPOINT 命令中指定了“检查点持续时间”值(秒),则数据库引擎会在请求的持续时间内尝试执行检查点。。例如:

CHECKPOINT 45


最佳实践:

  使用“检查点持续时间”时对性能所造成的影响取决于脏页数、系统中的活动以及指定的实际持续时间。 例如,如果正常情况下完成检查点操作需要 120 秒,则将检查点持续时间指定为 45 秒时,SQL Server 用于检查点的资源将比默认情况下分配的资源多。反之,将检查点持续时间指定为 180 秒时,将导致 SQL Server 分配的资源将比默认情况下分配的资源少。总之,检查点持续时间设置为较短时,会增加用于检查点的资源;而设置为较长时,会减少用于检查点的资源。SQL Server 总是尽可能地完成检查点操作,并且操作完成后,CHECKPOINT 语句将立即返回。 因此,完成检查点的时间有时比指定的持续时间短,有时则比指定的持续时间长。



(4) 内部检查点

  由各种服务器操作(如备份和数据库快照创建)发出,以确保磁盘映像与日志的当前状态匹配。


  对于自动、手动和内部检查点,在数据库恢复期间只有在最新检查点后所做的修改需要前滚。这将减少恢复数据库所需的时间。



10.3.2 恢复间隔

  “恢复间隔”(Recovery Interval)服务器配置选项用来定义恢复某一数据库所需时间的上限。SQL Server 数据库引擎使用为该选项指定的值确定对给定数据库发出自动检查点的大致频率。

  默认恢复间隔值为 0,这将允许数据库引擎自动配置恢复间隔。 通常,对于活动数据库,该默认恢复间隔将导致大约一分钟执行一次自动检查点检查,并且导致不到一分钟的恢复时间。较高的值表示近似的最大恢复时间,以分钟为单位。 例如,将恢复间隔设置为 3 指示最大恢复时间大约为 3 分钟。

  可以在服务器属性的“数据库设置”选项卡的“恢复”下方修改“恢复间隔”的值。该设置将立即生效,无需重新启动服务器。



最佳实践:

  此选项是一个高级选项,仅应由有经验的数据库管理员或认证的 SQL Server 技术人员更改。通常,我们建议您将恢复间隔保持为 0,除非您遇到了性能问题。 如果您决定增大恢复间隔设置,我们建议一点一点逐渐增大该值并评估每次增大对恢复性能的影响。



10.3.3 数据库目标恢复时间

  对于数据库,可以设置“目标恢复时间”,指定一个数值作为此数据库恢复时间上限(秒)。

  默认情况下,目标恢复时间为 0,此时数据库使用“自动检查点”(即默认1分钟或者指定的“恢复间隔”)。 如果将目标恢复时间设置为大于 0,数据库将使用“间接检查点”并为此数据库建立恢复时间上限。




10.3.4 其他写入磁盘的活动

  除了检查点,数据库引擎中还有以下两个线程也会将内存中的“脏页”写入磁盘。

(1) 惰性编辑器

  SQL Server为每一个NUMA配备一个惰性编辑器(Lazy Writer)。这是一个周期运行的线程,默认情况下,每隔一秒钟运行一次。

  Lazywriter被定期唤醒后,就去扫描此 NUMA 节点中的数据缓冲区,检查自由列表(free list)。如果列表的大小低于某个阀值(这个阀值取决于数据缓冲区的总大小)则意味着出现内存压力,Lazywriter 就去扫描数据缓冲区,将其中一些页标记到自由列表,表示这是空闲内存;如果这些页中有脏页,就回写到磁盘。

  当Lazywriter察觉到系统有内存压力时,它会增加或减少自由列表上的数据页,使操作系统的可用物理内存保持在4.8~5.2MB,以防止分页。

  Lazywriter自SQL Server 2005被引入。它与检查点的主要区别:检查点不会去修改自由列表。


(2) 工作线程

  SQL Server 启动时,同时启动30~40个工作线程,用于完成客户端连接提出的各种操作请求。当客户端连接增加时,SQL Server 会自动启动新的工作线程。当某个工作线程空闲15分钟,就会被关闭;当空闲内存不够时,某些工作线程也会被关闭(x86环境)。在x86环境,每个工作线程至少占用0.5MB内存;在x64环境,每个工作线程至少占用2MB内存。

  当worker线程察觉内存压力时,它会扫描数据缓冲区,把一段时间内未被访问的数据页添加到自由列表;如果这些页中有脏页,就回写到磁盘。



本文出自 “SQL Server 管理员指南” 博客,谢绝转载!

你可能感兴趣的:(日志,事务)