管理数据库恢复时间

申请号 CN201210052936.X 申请日 2012-03-02 公开(公告)号 CN102682069B 公开(公告)日 2017-04-12
申请人 微软技术许可有限责任公司; 发明人 R·D·达曼卡; H·R·科达瓦拉;
摘要 管理 数据库 恢复时间。一方法包括接收 指定 数据库的目标恢复时间的用户输入。该方法还包括确定从持久存储读取数据库的数据页的时间量。该方法还包括确定处理数据库的日志记录以对数据页应用日志记录中指定的改变的时间量。该方法还包括确定如果发生数据库故障则当前要在恢复中要读取的脏页的数量。该方法还包括确定如果发生数据库故障则要在恢复中处理的日志记录的数量。该方法还包括调整当前要在恢复中读取的脏页的数量或要在恢复中处理的日志记录的数量中的至少一个以满足指定的目标恢复时间。
权利要求

1.一种在计算环境中的管理数据库恢复时间的方法,所述方法包括:
(a)接收指定数据库的目标恢复时间的用户输入(202);
(b)确定从持久存储读取数据库的数据页的时间量(204);
(c)确定处理数据库的日志记录以对数据页应用日志记录中指定的改变的时间量(206);
(d)确定如果发生数据库故障则当前要在恢复中读取的脏页的数量(208),其中脏页的一个列表被包含在一个或多个脏页列表内,每个脏页列表包括用于一个或多个脏页中的每个脏页的页面标识符以及相关联的首次弄脏日志序列号(firstDirtiedLSN),并且其中每个数据页由页面标识符、它是否是脏页的指示以及与对应于对所述每个数据页的最新近改变的日志条目相对应的页面日志序列号(pageLSN)来标识;
(e)确定如果发生数据库故障则要在恢复中处理的日志记录的数量(210);
(f)根据指定的目标恢复时间,调整当前要在恢复中读取的脏页的数量或要在恢复中处理的日志记录的数量中的至少一个(212)。
2.如权利要求1所述的方法,其特征在于,在正在进行的基础上重复所述动作(d)、(e)和(f)以试图在数据库操作的一段时间上维持期望的恢复时间。
3.如权利要求1所述的方法,其特征在于,确定当前要在恢复中要读取的脏页的数量是基于所述一个或多个脏页列表来确定的。
4.如权利要求3所述的方法,其特征在于,所述一个或多个脏页列表是基于轻量检查点来维护的,轻量检查点不对持久存储写入页或改变,而是记录标识最老脏页的信息。
5.如权利要求3所述的方法,其特征在于,按照调度器维护一个或多个脏页列表。
6.如权利要求1所述的方法,其特征在于,接收指定数据库的目标恢复时间的用户输入是在不接收指定启动期间的IO目标或最后一个检查点之后的日志边界的附加用户输入的情况下完成的。
7.如权利要求1所述的方法,其特征在于,确定从持久存储读取数据库的数据页的时间量是基于数据库的持久存储的观察到的IO特征的。
8.如权利要求1所述的方法,其特征在于,根据指定的目标恢复时间,调整当前要在恢复中读取的脏页的数量或要在恢复中处理的日志记录的数量中的至少一个是基于数据库中的持久存储设备的数量的。
9.如权利要求1所述的方法,其特征在于,根据指定的目标恢复时间,调整当前要在恢复中读取的脏页的数量或要在恢复中处理的日志记录的数量中的至少一个是基于邻近因数的,其中邻近因数基于数据库增长大小,数据库增长大小确定可按照顺序读取方式从持久存储中读取的数据页的数量。
10.如权利要求1所述的方法,其特征在于,调整当前要在恢复中读取的脏页的数量或要在恢复中处理的日志记录的数量中的至少一个包括使用尽写入来将页写入持久存储中。
11.一种设备,包括:
(a)标识数据库的目标恢复时间的装置;
(b)确定读取数据库中已经被持久存储的数据页的时间量的装置(204);
(c)确定处理数据库的日志记录以对数据页应用所述日志记录中指定的改变的时间量的装置(206);
(d)确定如果发生数据库故障则将要在恢复中读取的脏页的数量的装置(208),其中脏页的一个列表被包含在一个或多个脏页列表内,每个脏页列表包括用于一个或多个脏页中的每个脏页的页面标识符以及相关联的首次弄脏日志序列号(firstDirtiedLSN),并且其中每个数据页由页面标识符、它是否是脏页的指示以及与对应于对所述每个数据页的最新近改变的日志条目相对应的页面日志序列号(pageLSN)来标识;
(e)确定要在恢复中处理的日志记录的数量的装置(210);
(f)根据标识的目标恢复时间,调整当前要在恢复中读取的脏页的数量或要在恢复中处理的日志记录的数量中的至少一个的装置(212)。
12.如权利要求11所述的设备,其特征在于,在正在进行的基础上重复所述装置(d)、(e)和(f)的操作以试图在数据库操作的一段时间上维持期望的恢复时间。
13.如权利要求11所述的设备,其特征在于,确定如果发生数据库故障则将要在恢复中读取的脏页的数量是基于一个或多个脏页列表来确定的。
14.如权利要求13所述的设备,其特征在于,所述一个或多个脏页列表是基于轻量检查点来维护的,轻量检查点不对持久存储写入页或改变,而是记录标识最老脏页的信息。
15.如权利要求13所述的设备,其特征在于,所述一个或多个脏页列表是按照调度器维护的。

说明书全文

管理数据库恢复时间

技术领域

[0001] 本发明涉及数据库管理。

背景技术

[0002] 计算机和计算系统已经影响了现代生活的几乎每个方面。计算机通常在工作、休闲、保健、运输、娱乐、家政管理等中都有涉猎。
[0003] 计算系统可用于实现数据库系统。数据库系统通常存储信息供其它客户机计算系统使用。数据库系统允许不同的客户机访问数据库系统,包括执行诸如从数据库系统读取数据、向数据库系统写入数据或对数据库系统更新数据的动作。
[0004] 因为不同的客户机访问可能会彼此冲突,数据库系统可实现事务数据处理功能。例如,假定客户机访问数据库以将钱从一个账户转帐到另一个账户。客户机将读取关于第一账户的信息以确定第一账户中资金的金额。如果资金的金额是足够的,则客户机将通过使第一账户的账户余额减少要转帐的金额(具体地通过用减少的余额来替换第一账户的余额)来对第一账户记入借方(debit)。客户机然后将(或在相同时间或重叠的时间)访问第二账户并读取第二账户的余额。客户机可通过使要转帐的金额加上第二账户的余额并将该总数写入数据库作为第二账户的余额来对要转帐的金额记入贷方(credit)。如果第二客户机在第一客户机正在执行转帐时能够访问账户余额,则第二客户机可能会读取过时的信息,或者可能写入稍后可能会被第一客户机重写或可能引起转帐交易问题的数据。
[0005] 为此,数据库系统使用各种类型的事务计算。例如,在一些示例中,数据库使用乐观事务。在这些事务中,数据库假定其它系统将不会干扰这些事务。在事务受到干扰的情况下,数据库存储了在该事务开始之前存在的值,且可使用存储的值来中止事务,并使受到影响的数据库元素返回到它们在事务开始之前所处的状态中。具体地,数据库系统将存储数据的老版本和数据的新版本。当作出持久的改变或提交了事务时,数据的新版本成为数据库的当前状态。当事务被中止时,数据的老版本保持作为数据库的当前状态。
[0006] 数据库通常具有数据库项目的存储器中版本以及存储在持久存储中(诸如硬盘上)的数据库项目的持久存储的版本。存储器中版本可被存储在缓冲池中。当正在操作数据库中的项目时,它们通常使用存储器中的副本来操作。例如,数据库项目可从诸如硬盘的持久存储中读取以存入诸如系统RAM和/或处理器高速缓存的存储器中。计算系统然后可访问数据库来读取数据库项目,数据库项目将按照存储器中的副本提供给计算系统。计算系统可修改数据库项目,这导致存储器中的修改。尚未被保存到持久存储中的、缓冲池中的被应用了改变的页在此可被称为脏页。
[0007] 通常,对数据库项目的改变通常在事务日志中作出或记录在事务日志中。当数据库故障发生和/或发现数据库不一致时,可使用事务日志来还原数据库。具体地,可使用事务日志来重新应用已经提交的事务的改变,并退回来自正在进行中但在发现不一致性时未被提交的事务的改变。事务日志包括各种日志记录。每一日志记录与数据库页相关联,并包括对数据库页的改变。通常当发现数据库不一致时,使用持久存储中的数据库的数据来解决该不一致性。因此,为了解决不一致性,数据页从持久存储读取、存储在存储器中,且根据事务日志应用改变。
[0008] 数据库的还原可通过周期性地对持久存储写入日志记录改变来优化。具体地,日志记录可通过将日志记录的数据页读入存储器中、对数据页作出在日志记录中标识的改变、并将数据页写回至持久存储中来处理。日志记录通常由日志序列号(LSN)标识。LSN通常是单调增加的号码,使得可容易地确定日历记录是以何种次序来创建的。
[0009] 周期性地将日志记录改变写入持久存储中通常是结合设置检查点来完成的。检查点表示时间点,且可与LSN相关联。可设置检查点,且LSN可与检查点相关联。系统然后开始更新数据库页,从最老的LSN开始,并朝向与新近设置的检查点相关联的LSN执行。可向系统确保,已经处理了下一最新近设置的检查点(即,当前设置的检查点之前设置的检查点)之前的所有日志记录,并且其中归档的改变被应用于持久存储。
[0010] 还原系统的恢复时间在系统中可能会变化。尽管检查点设置可减少恢复时间,由于在检查点之间有太多日志记录或页要处理,这样仍可能导致无法接受的恢复时间,或者当要处理相对小数量的改变时,由于要执行的检查点设置而导致资源的过度利用。具体地,尽管检查点可减少恢复时间,通常也需要显著的资源利用来从持久存储中读取数据页并根据日志记录应用改变。对这样的资源的使用可在管理恢复时间时验证,然而当设置检查点不会显著地减少恢复时间时,这可能是一种对资源的低效使用或是一种会从正在执行的其它操作取走资源的使用。
[0011] 此外,即使脏页的百分比很小,检查点将通常遍历整个缓冲池来寻找脏页。在较大的存储器系统中,脏页的百分比与总的缓冲池大小相比可能小得多。
[0012] 此外,在检查点持续时间期间,禁用所缓冲的写入日志记录的生成。如果在注意到检查点完成之前,数据库变为不一致或崩溃,则可能没有检测已经向持久存储发出的写入操作的机制,从而导致恢复期间的不必要的数据页读取以从持久存储中读取实际上已经根据对其应用的日志记录更新的数据页。
[0013] 在没有估计预期的恢复时间的任何合理机制的情况下,自动检查点是基于无法表征所有不同类型的工作负载的推断的。这导致不可预测的恢复表现,并使得“最小恢复间隔”不可靠。
[0014] 在此要求保护的主题不限于解决任何缺点或仅在诸如上述环境中操作的各个实施例。相反,提供该背景仅用以示出在其中可实践在此描述的部分实施例的一个示例性技术领域。

发明内容

[0015] 此处示出的一个实施例涉及一种在计算环境中实施的方法。该方法包括用于管理数据库恢复时间的动作。该方法包括接收指定数据库的目标恢复时间的用户输入。该方法还包括确定从持久存储读取数据库的数据页的时间量。该方法还包括确定处理数据库的日志记录以对数据页应用日志记录中指定的改变的时间量。该方法还包括确定如果发生数据库故障则当前要在恢复中读取的脏页的数量。该方法还包括确定如果发生数据库故障则要在恢复中处理的日志记录的数量。该方法还包括根据指定的目标恢复时间,调整当前要在恢复中读取的脏页的数量或要在恢复中处理的日志记录的数量中的至少一个。
[0016] 提供本发明内容以便以简化形式介绍将在以下具体实施方式中进一步描述的一些概念。本发明内容并非旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确定所要求保护的主题的范围。
[0017] 另外的特征和优点将在以下的描述中阐述,并且部分可从该描述中显而易见,或者可以从此处的教示实践中习得。本发明的特征和优点可以通过在所附权利要求中特别指出的手段和组合来实现并获取。本发明的特征将从以下描述和所附权利要求书中变得完全显而易见,或者可通过如下所述对本发明的实践而获知。附图说明
[0018] 为了描述可获得本主题的上述和其它优点和特征的方式,将通过参考附图中示出的本主题的具体实施例来呈现以上简要描述的本主题的更具体描述。应该理解,这些附图仅描绘了各典型实施例,因此其不应被认为是对范围的限制,各实施例将通过使用附图用附加特征和细节来描述并解释,在附图中:
[0019] 图1示出了数据库恢复系统的各部分;以及
[0020] 图2示出了管理数据库恢复时间的方法。

具体实施方式

[0021] 此处描述的一些实施例包括根据系统中的脏页数量、活动日志大小和系统IO特征来对数据库系统的预期恢复时间建模的功能。此外在一些实施例中,系统IO特征可以是实际系统的观察到的特征。该模型可用于估计数据库的恢复时间,并试图保证用户指定的最小恢复间隔。可实现一些实施例,其中最小恢复间隔需要由用户指定,而无需指定如下参数:(1)启动期间的IO目标或(2)最后一个检查点后的日志的边界。IO目标基于用户,该用户知晓I/O系统如何执行以及规定用户愿意在恢复期间引发的I/O的量。最后一个检查点之后的日志的边界被用于限定应重做的日志。对最后一个检查点之后的日志的边界,用户必须理解其系统的重做速度并设置这一目标。这两个设置要求用户很好地理解其环境并根据所需的恢复间隔推断各值。相反,此处的一些实施例包括其中系统可动态地学习类似特征的功能。
[0022] 此外,可实现各实施例以按照FirstDirtiedLSN(首次弄脏LSN)次序维护分区列表,其中FirstDirtiedLSN是首次弄脏页的日志记录的LSN。各实施例可使用可在无需总体次序的情况下使用分区列表的算法。说明性地,每一数据库可维护脏缓冲区的列表。列表可按照FirstDirtiedLSN的次序排序。在存储器中的数据页的生存周期中,可在其被写入持久存储之前对其应用多个改变。FirstDirtiedLSN表示页面的这些尚未保存的更新中的最早一个。尽管在概念上,每一数据库可被认为具有单个列表,但为了避免全局资源上的争用,可对每一处理器维护一个列表。使用列表的组件可被设计成处理部分次序。
[0023] 各实施例可实现间接检查点。具体地,周期性地,数据库执行轻量间接检查点,该检查点使用脏页列表记录最小恢复LSN(即,来自重做应开始处的LSN)。然而,间接检查点本身不执行任何页写入,而是能够通过基于其它机制执行的写入记录最小恢复LSN来优化恢复。如此处所用,“周期性”不必定需要操作以给定间隔进行,但也不排除操作以给定间隔进行。相反,“周期性”可包括随机或伪随机时间周期、增加或减少的时间周期、恒定间隔的时间周期或任何其它合适的时间周期。
[0024] 各实施例可通过仅对弄脏的页进行操作来优化。即使在非常大的系统上,这些脏页通常也仅是整个存储器的一小部分。
[0025] 现在参考图1,示出了示例环境。图1示出缓冲池102。缓冲池102将数据库页(此处一般称为104,但是在104-1、104-2、104-3、104-4和104-5示出了具体示例)存储在存储器中。每一数据库页是被配置成存储数据库数据的预定大小的存储器量。每一页具有头部(一般被称为106,但是在106-1、106-2、106-3、106-4和106-5具体示出)。在所示示例中,头部存储了页面标识符和LSN。例如,头部106-1具有页面标识符01和LSN 101。头部106中的LSN标识了对页面作出最后即最新近改变的LSN。头部106中的LSN有时被称为pageLSN(页LSN)。如下所示,pageLSN与存储在脏页列表114中的LSN不同。
[0026] 头部104还可包括对页104是脏的的指示。在所示示例中,如果页为脏,则头部106包括D。然而,在实践中,各实施例可具有单个脏位或其它指示符来指示页104是脏的。一般而言,当缓冲池102中的页104在从持久存储112读取或被写入持久存储112之后被写入(即,使页中的值改变)时,页104为脏。具体地,缓冲池102中的脏页104有可能(但不必)与存储在持久存储112中的同一页不同。例如,在一些实施例中,页可能为脏,即使导致页为脏的动作包括用相同的值重写页104中的值,或页中的值被写成某一其它值然后使值还原成原始值。
[0027] 每一页还具有数据部分,此处一般称为108,但在108-1、108-2、108-3、108-4和108-5具体示出。数据部分存储要对数据库页操作的数据库数据。
[0028] 如图所示,一个或多个处理器(此处一般称为110,但在110-1-110-n具体示出)可用于从持久存储112读取数据,并将数据写入缓冲池102。持久存储112例如可以是一个或多个硬盘驱动器、一个或多个闪存驱动器、一个或多个磁带驱动器或可保存数据的其它存储,具体地在一些实施例中,持久存储112可保存数据而无需对持久存储设备施加电来保存数据。
[0029] 图1还示出了脏页列表,一般被称为114,但在114-1到114-n具体示出,在该示例中,n等效于用于处理器110的n,如下将更详细描述。
[0030] 尽管示出了示例示出了非分区缓冲池,但应理解,在其它实施例中,缓冲池本身可被分区,例如在非统一存储器访问(NUMA)机器的情况中。此处的实施例可对NUMA机器良好运作。
[0031] 在所示示例中,每一物理恢复单元维护以其FirstDirtiedLSN的升序链接的脏缓冲区的列表。当干净的缓冲区被页操作弄脏时,相应的LSN被标记为页104的FirstDirtiedLSN。对页面的相继更新更新了头部106的pageLSN,但不会影响脏页列表104中包括的FirstDirtiedLSN。干净的缓冲区不具有与之相关联的FirstDirtiedLSN。当脏缓冲区被保存在持久存储112中时,该FirstDirtiedLSN值被复位成NULL。
[0032] 与pageLSN不同,在页在缓冲池中为脏时FirstDirtiedLSN适用,从而它不必被保存。每一缓冲区头部106包含与缓冲区页104相关联的FirstDirtiedLSN的值;当缓冲区页104被首次修改并被插入到脏页列表114时,该值被置位。
[0033] 尽管在概念上,可对物理恢复单元概念化单个脏页列表,但维护一个脏页列表可能会引入瓶颈。从而,可实现一些实施例,在其中脏页列表114被分区以使得为每个处理器110维护一个脏页列表114。在一些实施例中,每一脏页列表114由单独的旋转保护。弄脏干净的缓冲区页104并更新FirstDirtiedLSN的线程(或处理器110)向与其处理器110相关联的列表添加缓冲区条目。添加缓冲区条目可包括将缓冲区条目添加到脏页列表114中的适当位置,并将缓冲区条目适当地(即,按次序)链接到其它缓冲区条目。当页面104被写入持久存储112时,从适当的列表中移除缓冲区条目。
[0034] 以下说明了各个过程。以下所述的过程被设计成它们不必从多个脏页列表构造单个脏页列表114或查看到脏页列表的一致视图(这可能包括周期性地阻塞对列表的改变)。
[0035] 如图1中所示,在缓冲区条目结构中维护FirstDirtiedLSN。在所示示例中,如图1中所示的缓冲区条目结构还维护至脏页列表114中的邻近缓冲区条目的链接。然而,这不是必需的。具体地,在一个示例中,维护FirstDirtiedLSN以及至脏页列表中下一条目的链接的结构可处于缓冲区条目结构之外,而缓冲区条目结构可仅具有对此外部结构的引用。
[0036] 在一些实施例中,对脏页列表114的分区是通过为每个主要调度器维护一个列表来实现的,其中给定主要调度器负责为给定处理器调度工作。每一列表受到旋转锁的保护。使用隐藏调度器作为用于调度和控制内部/后台任务的处理器时间切片的附加调度器。使这些后台任务在单独的调度器上独立调度,确保了它们不会与用户活动争用资源(以及饿死)。隐藏调度器使用与主要调度器相关联的列表,主要调度器与当前的工作程序正在其上运行的处理器110相关联。
[0037] 弄脏干净的缓冲区并更新FirstDirtiedLSN的工作程序将缓冲区条目添加到与其调度器相关联的脏页列表114。
[0038] 当页被写入持久存储之后,由处理IO完成的工作程序将缓冲区条目从其相应的脏页列表114移除。由于IO完成是在上下文切换期间处理的,列表访问可使用非挂起同步对象(诸如旋转锁)来同步。
[0039] 各实施例可实现并利用检查点和间接检查点。在一些实施例中,检查点如下操作:各实施例,写入标记检查点的起始的开始检查点日志记录。与开始检查点日志记录相关联的LSN是CheckpointLSN(检查点LSN)。日志118被刷新至CheckpointLSN。(2)各实施例可执行高速缓存刷新。这可包括在缓冲池102中刷新脏数据页。执行对缓冲池的随机走查以定位和写入在该检查点开始之前弄脏的所有脏页。(3)各实施例可考虑活动事务信息。生成包含关于活动事务的信息的日志记录。这些记录用于分析以构造事务表。(4)各实施例然后可刷新Delta(增量)计数,提交表内容等。(5)各实施例可写入标记检查点的结尾的日志记录。该日志记录标注CheckpointLSN和MinRecoveryLSN(最小恢复LSN)。MinRecoveryLSN是所有脏页列表114中的缓冲区条目之中的FirstDirtiedLSN的最小值。MinRecoveryLSN当前被设为CheckpointLSN,因为高速缓存刷新步骤中的逻辑确保在CheckpointLSN之前没有需要重做的日志记录。分析在MinRecoveryLSN开始。日志118中记录的活动日志信息可用于获取关于可能在MinRecoveryLSN之前启动的事务的信息,而不必实际地从最老的活动事务开始扫描日志118。(6)各实施例可将CheckpointLSN写入数据库引导页。(7)更新日志截断LSN来反映成功的检查点。
[0040] 一些实施例可实现间接检查点。间接检查点是轻量检查点,其不会将页或改变写入持久存储,但会记录标识最老脏页的信息。对间接检查点,高速缓存刷新不会写入脏页。相反,它计算作为最早的日志记录的MinRecoveryLSN,恢复的分析和重做阶段应从该日志记录开始扫描日志118。MinRecoveryLSN是物理恢复单元中的脏页列表中的脏缓冲区之中的FirstDirtiedLSN的最小值。可实现其中结尾检查点日志记录将与CheckpointLSN分开地标注MinRecoveryLSN的间接检查点实施例,因为两者均将在分析阶段使用。可实现其中MinRecoveryLSN和CheckpointLSN均分开写入引导页的间接检查点实施例。可实现其中MinRecoveryLSN可比CheckpointLSN早的间接检查点实施例,从而日志截断可由这些值的最小值控。
[0041] 由于在一些实施例中,页操作日志记录是在更新pageLSN和标记页面为脏之前生成的,各实施例可能有生成了日志记录但未被标记为脏且因此未被插入到脏页列表中的页。可实现对MinRecoveryLSN的计算以便不会错过这样的页,因为在恢复期间会跳过对这些页的更新。
[0042] 这是如下实现的:当弄脏缓冲区时,跟着进行以下步骤:(1)脏页列表114中的缓冲区条目被准备好弄脏。这是通过(a)设置检查点生成以及(b)将缓冲区条目添加到脏页列表114的头部,并将FirstDirtiedLSN设为NullLSN来完成的。(2)生成pageLog(页面日志)记录并修改页面104。(3)使缓冲区条目指示页104为脏。在将页标记为脏之前,FirstDirtiedLSN被设为来自步骤2的pageLSN,且在脏页列表114中移动缓冲区条目以维护经排序的次序。这可在脏页列表114旋转锁定的情况下进行。
[0043] 在一些实施例中,检查点线程如下计算MinRecoveryLSN:(1)如果在脏页列表114中存在其FirstDirtiedLSN为NullLSN、且在较老的检查点生成中弄脏的任何缓冲区条目,则检查点线程等待该缓冲区上的更新锁存。更新模式锁存确保在有其它线程可读取页的同时,没有其它实体可修改该页。(2)一旦所有的缓冲区条目或者在新检查点生成中被弄脏或者具有有效的FirstDirtiedLSN,将MinRecoveryLSN计算为所有脏页列表114中的缓冲区条目之中的FirstDirtiedLSN的最小值。
[0044] 各实施例可包括用于估计和限制恢复时间的功能。数据库恢复可包括三个阶段,即分析、重做和撤销。还将撤销阶段进一步分成撤销系统事务和随后撤销用户事务。在一些实施例中,直到系统事务撤销完成之前,数据库不可用。可使数据库可用于在并发运行撤销时进行用户连接。由于系统事务不频繁且较短,系统事务撤销可以近乎瞬时。从而,数据库可用性中的延迟很大程度上是由分析和重做阶段花费的时间来确定的。
[0045] 在所示示例中,分析阶段包括对日志118进行顺序扫描、并构建诸如脏页表等存储器中数据结构和在后续恢复遍期间使用的事务表的遍。可在分析中花费的时间很大程度上由日志118的活动部分的顺序IO所需的时间确定的假设下实现各实施例。
[0046] 重做阶段包括使用小的随机IO将数据页集合从持久存储112读入缓冲池102的遍。重做阶段所需的时间依赖于从持久存储112对所有受影响的数据页的读取效率有多高。重做遍还访问日志118中与由分析阶段所读取的相同的部分。在一些实施例中,不必考虑日志读取的IO,因为:(a)如果日志118和数据处于分开的持久存储设备(通常如此)上,则IO成本被读入脏页的成本掩盖,以及(b)分析阶段期间读取的日志118的尾部可被高速缓存以便在重做期间重新使用。
[0047] 数据库的恢复时间可如下大致估计:
[0048]
[0049] 可对其中以下为真或至少大致为真的实施例进行优化。要在恢复期间扫描的活动日志118的大小比日志118中的典型事务的覆盖区的跨度大得多。这对其中大多数事务较短的典型的在线事务处理工作负荷通常为真。页写入被记录在日志118中且可在分析遍中被发现。在一些实施例中,为具有对应于最老的页写入的FlushLSN(刷新LSN)的页集合生成页写入日志记录。这可招致恢复期间对一些页面的浪费的页读取。一些实施例在估计限制脏页的阈值时忽视这一不准确性。
[0050] 在一些实施例中,假定数据库的数据和日志118日志处于分开的持久存储设备上,如图1中所示。如果在数据库中存在多个数据文件,一些实施例可假定它们处于分开的存储设备上,如图1中的持久存储112中包括的多个存储设备所示。可扩展实施例以使用文件系统API来检测位于同处的文件。取决于所使用的数据库的类型,数据库中的数据布局可能对系统是已知的(或可使其对系统已知)。可实现其中数据基本上在所涉及的文件上均匀分布的实施例。然而,可通过基于对所有文件的平均测量而计算推断来实现其中数据不是均匀分布在所涉及的文件上的替换实施例。
[0051] 如上可见,脏页列表114可具有脏缓冲区及其相应的用于RecoveryUnit(恢复单元)的FirstDirtiedLSN。在给定时间,MinrecoveryLSN是所有脏缓冲区的最小FirstDirtiedLSN。按照FirstDirtiedLSN的升序发出页写入,确保MinRecoveryLSN保持前进,从而限制所需重做的数量。
[0052] 当允许数据库进行快速恢复时,快速恢复写入器116使用可用的计算资源在后台中连续写入脏页,以便限制恢复期间的重做工作。如上所述,快速恢复写入器116结合使用间接检查点可有助于减少恢复时间。
[0053] 可调整快速恢复写入器116所进行的后台写入的步伐,以提高后台写入的速率或降低后台写入的速率。例如,当弄脏页104的速率提升时,可调整快速恢复写入器116来提高后台写入的速率。在另一示例中,当日志118的活动部分的增加的速率显著高于使用后台写入使MinRecoveryLSN前进的能力时,可调整快速恢复写入器116以增加后台写入的速率。当弄脏页104的速率下降时,可调整快速恢复写入器116来降低后台写入的速率以节省系统资源。当日志118的活动部分的增加的速率显著低于使用后台写入使MinRecoveryLSN前进的能力时,可调整快速恢复写入器116以降低后台写入的速率。
[0054] 各实施例可包括用于估计分析阶段中花费的时间的功能。以下示出了可用于估计在分析阶段中花费的时间的示例公式:
[0055]
[0056] 为了简化该模型,各实施例可假定,为要在分析阶段期间处理的日志118的每个字节,完成了固定量的工作。从而,可例如通过假定分析遍受到对持久存储的IO操作限制,且因此使用在运行时观察到的顺序带宽来作为预期的日志处理速率,来计算LogProcessingRate(日志处理速率)。在替换实施例中,实施例可使用对分析时间和从之前恢复处理的日志字节的测量来估计日志处理速率。可附加地或替换地使用这些和其它估计方法的组合。
[0057] 各实施例可包括用于确定可在重做阶段期间发出的数据IO的数量的功能。以下示出了可用于这样的判断的示例公式:
[0058]
[0059] 在一些实施例中,使用观察到的IO统计数据来计算或确定平均读取IO等待时间。例如,可为数据文件中的每一数据文件维护关于观察到的IO特征的信息,诸如平均读取等待时间、平均写入等待时间、平均I/O队列长度等。然而,应注意到,这些仅是示例,且可使用替换或附加的这样的度量/特征。各实施例可实现对IO等待时间的统计采样来确保重做期间的预期读取等待时间的准确表征。
[0060] 各实施例可包括用于考虑多个存储设备的功能。在良好配置的系统中,可规划数据布局使得IO在多个持久存储设备(诸如磁盘或逻辑单元号(LUN))上均匀分布。从而,在适当的预读情况下,各实施例可假定,各实施例可在重做期间在多个存储设备上发出并行的读取。因此,当使用多个存储设备时,可调整以上计算的MAX_DATA_READS以考虑多个存储设备。以下示出了可用于考虑多个存储设备的示例公式:
[0061] MAX_DATA_READS=MAX_DATA_READS*#StorageDevices(存储设备)*DampingFactor
[0062] DampingFactor(阻尼因数)说明了非理想的数据布局以及由于有限的存储器可用而导致的预读不准确性。在一个实施例中,预先确定DampingFactor并将其设为0.6。然而,可以使用其它DampingFactor。具体地,一些实施例可能能够基于数据库增长的边界来确定DampingFactor。具体地,当持久存储112上的数据库大小增加时,DampingFactor通常基于预定量来增加。尽管增加预定量通过使用对持久存储的顺序型IO而导致较快速的页读取,增长的大小使得在数据库增长的边界处使用随机IO的情况下页要被存储。DampingFactor可用于考虑这些边界,或考虑可能降低数据读取能力的其它因数。
[0063] 各实施例可包括用于将MAX_DATA_READS转换成要由恢复写入器116写入的页的功能。在一些实施例中,当快速恢复写入器116将脏页写入磁盘时,它维护聚集所写入的页数和发出的IO数量的计数器。在一些实施例中,该信息可用于确定ContiguityFactor(邻近因数)。例如,这样的ContiguityFactor可被计算为:
[0064]
[0065] 在一些实施例中,数据库中的恢复时间可通过确保系统中的脏页被如下限制来限制:
[0066] MAX_DIRTY_PAGES(最大_脏_页)=MAX_DATA_READS*ContiguityFactor*DampingFactor
[0067] 一旦确定了MAX_DIRTY_PAGES,各实施例可包括用于确定要写入的页数的功能。在以下说明中,D(t)=时间t时脏范围的数量,T=FastRecoveryWriter(快速恢复写入器)周期的相继执行之间的时间,[D(t)-D(t-T)]是自从上一次运行FastRecoveryWriter以来被弄脏的页的数量而α是被设置为0.25的步进因数(pacing factor)。以下伪代码示出了用于确定要写入的页数的方法:
[0068]
[0069]
[0070] 如所注意到的,一些实施例可包括与多个处理器116相关的多个脏页列表114。从而,一些实施例可包括用于在多个脏页列表上分发页写入的功能。这些IO按照LSN次序发出以使MinRecLSN(最小恢复LSN)前进,并减少在恢复期间需要被处理的日志118的数量。由于一些实施例预期关于脏页的信息可能或多或少地均匀分布在各个脏页列表114上,这些页10可分布在各个脏页列表114上而不必实际上按照严格的LSN次序对脏页线性排序。
[0071] 在一些实施例中,根据这些脏页列表计算MinRecLSN的例程记住对MinRecLSN作出贡献(即,具有最老的缓冲区条目)的列表。尽管使页IO分布在各个脏页列表114上,可与其它列表相比更进取地修整对MinRecLSN作出贡献的脏页列表114。
[0072] 可通过将脏页刷新到系统中,从而对在后续崩溃恢复期间完成的工作量提供上界,来减少恢复时间。另外或另选地,可通过以FirstDirtiedLSN次序写入脏页,从而减少恢复期间需要被分析/处理的日志118的量,来减少恢复时间。
[0073] 在发出间接检查点时,使作为所有脏缓冲区的FirstDirtiedLSN的最小值的MinRecLSN前进。可比间接检查点的频率,频繁得多地发出页IO。
[0074] 强制的写入无论如何写入数据页,而尽力写入确定页是否正由另一事务使用,跳过该页,并在稍后该页不再使用时重新访问该页。强制的写入可对吞吐量造成不利影响,因为事务等待IO完成。在一些实施例中,在两个相继的间接检查点之间,强制写入可能不会提供任何优点。从而在一些实施例中,快速恢复写入器116通常使用尽力写入。然而,一个预期是通过使脏页强制进入磁盘可显著地使MinRecLSN前进。
[0075] 以下讨论现涉及可以执行的多种方法以及方法动作。虽然用特定次序讨论或用以特定次序发生的流程图示出了各个方法动作,但除非明确规定否则不需要特定次序,或因为一动作依赖于另一动作在执行该动作之前完成而需要特定次序。
[0076] 现在参考图2,示出了方法200。该方法可以在计算环境中实施。该方法包括用于管理数据库恢复时间的动作。该方法标识数据库的目标恢复时间。例如,可接收指定目标恢复时间的用户输入。这可以是用户确定他们想要数据库能够恢复的时间。可实施一些实施例,其中接收指定数据库的目标恢复时间的用户输入是在不接收指定启动期间的IO目标或最后一个检查点之后的日志边界的附加用户输入的情况下完成的。
[0077] 方法200还包括确定从持久存储读取数据库的数据页的时间量。例如,可实现实施例,其中确定从持久存储读取数据库的数据页的时间量基于数据库的持久存储的历史上观察到的IO特征。例如,如上所述,这可基于在运行时观察到的顺序带宽作为预期日志处理速率的。或者,这可基于对分析时间和从之前恢复处理的日志字节的测量来估计日志处理速率。
[0078] 方法200还包括确定处理数据库的日志记录以对数据页应用日志记录中指定的改变的时间量。
[0079] 方法200还包括确定如果发生数据库故障则当前要在恢复中要读取的脏页的数量。例如,在一些实施例中,这可通过检查脏页列表114来确定缓冲池中脏页的数量来确定。或者,实施例可标识缓冲池102中指示脏页的指示符,使得脏页的数量可被标识。
[0080] 方法200还包括确定如果发生数据库故障则要在恢复中处理的日志记录的数量。例如,实施例可检查日志118来确定在给定时间需要在恢复场景中应用多少日志记录。基于日志记录的数量,以及应用记录的时间量,可标识或确定应用所有未完成的日志记录的时间。
[0081] 方法200还包括根据标识的目标恢复时间,调整当前要在恢复中读取的脏页的数量或要在恢复中处理的日志记录的数量中的至少一个。例如,这可通过增加后台写入或减少后台写入以试图逼近目标恢复时间来完成。
[0082] 可在确定如果发生数据库故障则当前要在恢复中要读取的脏页的数量,确定如果发生数据库故障则要在恢复中处理的日志记录的数量,以及根据指定的目标恢复时间调整当前要在恢复中读取的脏页的数量或要在恢复中处理的日志记录的数量中的至少一个等步骤在正在进行的基础上重复的情况下实施方法200,以试图在数据库操作的一段时间上维持期望的恢复时间。
[0083] 如上所述,可在确定当前要在恢复中要读取的脏页的数量是基于一个或多个脏页列表来确定的情况下实施方法200。例如,脏页列表114可用于确定要在恢复中读取的多个脏页。在一些实施例中,一个或多个脏页列表是基于轻量检查点来维护的,轻量检查点不对持久存储写入页或改变,而是记录标识最老脏页的信息。以上示出的间接检查点示出了这样的轻量检查点的示例。
[0084] 可按照调度器维护一个或多个脏页列表的情况下实施实施例。每一调度器与一个或多个处理器相关联。在一些实施例中,避免线程在多个处理器上并发运行而在单个共同资源上形成瓶颈可能是有用的。从而,各实施例可为每个处理器维护一个列表。对一些实施例,数据库引擎对每个CPU具有一个(逻辑)调度器。因此,这些实施例可为每个调度器维护脏页列表。
[0085] 可在根据指定的目标恢复时间调整当前要在恢复中读取的脏页的数量或要在恢复中处理的日志记录的数量中的至少一个是基于数据库中的持久存储设备的数量的情况下实施方法200。示例在以上示出,其中实施例在计算中使用#StorageDevices变量。
[0086] 可在根据指定的目标恢复时间调整当前要在恢复中读取的脏页的数量或要在恢复中处理的日志记录的数量中的至少一个是基于ContiguityFactor的情况下实施方法200。ContiguityFactor是基于数据库增长大小的,数据库增长大小确定按照顺序读取的方式可从持久存储读取的数据页的数量。示例在以上示出,其中实施例在计算中使用ContiguityFactor变量。
[0087] 可在调整当前要在恢复中读取的脏页的数量或要在恢复中处理的日志记录的数量中的至少一个包括使用尽力写入来将页写入持久存储中的情况下实施方法200。如上所述,在一些实施例中,与强制写入相比,更偏好使用尽力写入。这可有助于减少对用户事务的吞吐量的影响。
[0088] 此外,各种方法可由包括一个或多个处理器和诸如计算机存储器等计算机可读介质的计算机系统来实施。具体而言,计算机存储器可存储计算机可执行指令,这些指令在由一个或多个处理器执行时使得诸如各实施例中所述的各个动作等各种功能被执行。
[0089] 本发明的各实施例可以包括或利用包含计算机硬件的专用或通用计算机,这将在下文中更详细地讨论。本发明范围内的各实施例还包括用于承载或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这样的计算机可读介质可以是可由通用或专用计算机系统访问的任何可用介质。存储计算机可执行指令的计算机可读介质是物理存储介质。承载计算机可执行指令的计算机可读介质是传输介质。由此,作为示例而非限制,本发明的各实施例可包括至少两种显著不同的计算机可读介质:物理计算机可读存储介质和传输计算机可读介质。
[0090] 物理计算机存储介质包括RAM、ROM、EEPROM、CD-ROM或其他光盘存储(如CD、DVD等)、磁盘存储或其他磁存储设备、或可用于存储计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的任何其他介质。然而,如此处所使用的物理计算机可读存储介质特别排除了所传播的信号
[0091] “网络”被定义为允许在计算机系统和/或模和/或其他电子设备之间传输电子数据的一个或多个数据链路。当信息通过网络或另一个通信连接(硬连线、无线、或者硬连线或无线的组合)传输或提供给计算机时,该计算机将该连接适当地视为传输介质。传输介质可包括可用于携带计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的网络和/或数据链路。以上介质的组合也被包括在计算机可读介质的范围内。
[0092] 此外,在到达各种计算机系统组件之后,计算机可执行指令或数据结构形式的程序代码装置可从传输计算机可读介质自动转移到物理计算机可读存储介质(或者相反)。例如,通过网络或数据链路接收到的计算机可执行指令或数据结构可被缓存在网络接口模块(例如,“NIC”)内的RAM中,然后最终被传送到计算机系统RAM和/或计算机系统处的较不易失性的计算机可读物理存储介质。因此,计算机可读物理存储介质可被包括在同样(或甚至主要)利用传输介质的计算机系统组件中。
[0093] 计算机可执行指令包括,例如使通用计算机、专用计算机、或专用处理设备执行某一功能或某组功能的指令和数据。计算机可执行指令可以是例如二进制代码、诸如汇编语言之类的中间格式指令、或甚至源代码。尽管用结构特征和/或方法动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于上述特征或动作。相反,上述特征和动作是作为实现权利要求的示例形式而公开的。
[0094] 本领域的技术人员将理解,本发明可以在具有许多类型的计算机系统配置的网络计算环境中实践,这些计算机系统配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器系统、基于微处理器的或可编程消费电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、路由器、交换机等等。本发明也可在其中通过网络链接(或者通过硬连线数据链路、无线数据链路,或者通过硬连线和无线数据链路的组合)的本地和远程计算机系统两者都执行任务的分布式系统环境中实施。在分布式系统环境中,程序模块可位于本地和远程存储器存储设备中。
[0095] 本发明可具体化为其他具体形式而不背离其精神或特征。所描述的实施例在所有方面都应被认为仅是说明性而非限制性的。因此,本发明的范围由所附权利要求书而非前述描述指示。落入权利要求书的等效方案的含义和范围内的所有改变被权利要求书的范围所涵盖。
QQ群二维码
意见反馈