星瑞格数据库概述

  通过本文的学习,您将能够︰

  • 描述星瑞格数据库的主要组件

  • 定义数据库服务器术语

  • 描述主要的数据库服务器事件

1. SinoDB数据库服务器


  服务器实现了一个多线程架构,这意味着:

  • 执行DBMS 活动所需的进程数更少。
  • 通过使用线程,一个进程可以为多个应用程序工作。

  这些进程统称为数据库服务器 database server 。可以按需为数据库服务器动态地分配进程,因此称为动态服务器 Dynamic Server

  多线程体系结构允许更好的扩展性:当添加了更多的用户,服务器只需要最少的额外资源就可以容纳这些用户。这源自于高效的多线程实施的扩展性。

2. 数据库体系概述

  服务器由三个主要组件组成:进程组件、共享内存组件、磁盘组件。

进程组件

  进程组件(process component) 控制数据库服务器。组成数据库服务器的进程被称为虚拟处理器(virtual processors) 。在 UNIX系统上这些进程都叫作 oninit 。每个虚拟处理器 (VP) 属于一个虚拟处理器类(virtual processor class)。一个 VP 类就是一组负责一个特定任务集合的进程。

  在windows环境中, oninit 服务是一个为虚拟处理器(virtualprocessors) 服务的多线程Windows 程序。在 Windows 系统上,这些虚拟处理器 (VP) 是运行在oninit 实用程序内的 Windows 线程。每个 VP 属于一个虚拟处理器类(virtual processor class) 。一个 VP 类就是一个或多个负责一个特定任务集的 Windows 线程。

共享内存组件

  第二个组件是共享内存组件 shared memory component . 。共享内存组件由三部分组成:常驻部分、虚拟部分和消息部分。共享内存用于︰

  • 将磁盘数据高速缓存在共享内存中,以便更快速地访问(常驻部分)。
  • 维护和控制进程所需的资源(虚拟部分)。
  • 为客户端和服务器进程提供互相交流的通信机制,来协调他们的活动(消息部分)。

磁盘组件

  最后是磁盘组件(disk component)。这是一个分配给数据库服务器的、一个或多个磁盘空间单位的集合。数据库中的所有数据、及维护服务器所需的所有系统信息,都存储在磁盘组件内。

3. 进程组件:虚拟处理器

1698806429506

  组成数据库服务器的每个进程被称为一个虚拟处理器(virtual processors )。这些虚拟处理器(VP):

  • 调度和运行线程
  • 属于一个 VP类,负责一组特定的任务

  每个虚拟处理器 (VP) 属于一个虚拟处理器类。一个 VP 类是负责一组特定任务(以线程的形式)的一个或多个进程,如:写逻辑日志或从磁盘读取数据;一个特定类的 VP 只能运行同一类的线程。一个 VP 类中的每个 VP 只是同一程序的不同实例。一个 VP 只能属于一个类。一个 VP 类有一个或多个 VP,在大多数情况下由系统管理员进行配置。

  VPs 必须由 root 用户运行。这是因为 VP 必须以启动任务的用户身份运行某些任务(例如编写 SET EXPLAIN 输出或执行 SPL SYSTEM 命令)。以 root 权限运行 VP 更有利于保护数据库服务器进程。只有 root 或 informix 用户可以杀掉一个 VP。在 UNIX 中,如果使用 ps -e 命令检查进程状态,虚拟处理器会以 oninit 进程的形式呈现。

Windows系统
  在Windows 上的SinoDB数据库服务器由一个名为oninit.exe 的服务进程组成。这个进程是个多线程的 Windows 程序,与内存和磁盘交互来提供数据库的访问。每个SinoDB实例(或 oninit)都包含几个虚拟处理器 。一个虚拟处理器作为一个Windows 线程运行。每个虚拟处理器 (VP) 属于一个虚拟处理器类 。一个VP 类是负责一组特定的任务(以线程的形式)的一个或多个进程,如:写逻辑日志或从磁盘读取数据。这意味着一个特定类的 VP 只能运行同一类的线程。一个 VP 类中的每个 VP 是同一 Windows 线程的不同实例。一个 VP 只能属于一个类。一个 VP 类可以有一个或多个 VP,在大多数情况下是由系统管理员进行配置。

  SinoDB在VP 中执行自己的线程包,与Windows的无关。这使得SinoDB实例成为一个多线程和高度可扩展的数据库引擎。SinoDB在每个 VP 中创建、调度和运行自己的线程。

4.共享内存组件

1698719489267

  在数据库服务器中的共享内存可以分为三个部分:

  • 常驻部分——常驻部分包含缓冲池和其他系统信息。这部分共享内存可进行配置,驻留在主存中(如果操作系统支持此功能)。

  • 虚拟部分——虚拟部分包含关于线程和会话、及其所使用的数据的信息。这些信息经常增加或减少,所以由数据库服务器负责处理这部分的内存分配和释放。

  • 消息部分——这个可选的 optional 共享消息部分会保留用于客户端和服务器之间在共享内存里通信时所需的消息缓冲。

所有平台:

  在 Windows 平台上的SinoDB 的共享内存内没有消息部分,因为共享内存连接是不允许的(本地通信必须通过本地命名管道完成)。
  在Linux/UNIX 平台上的SinoDB,如果没有配置共享内存时,也没有共享内存的消息部分。

4.1 共享内存:常驻部分

  共享内存的常驻部分主要是用来存放缓冲池。缓冲池保存数据库表中的页。常驻部分也会跟踪服务器系统中的其他资源。

  在共享内存的这部分,服务器会分配定长数据结构的集合。这些结构有时被称为内部表,但请记住:这些都不同于数据库的表。

  数据库服务器为每个服务器系统中的主要资源都分配一个内部表。这些内部表的大小是靠在配置文件中调节共享内存资源的大小来配置的。

4.1.1 常驻部分:缓冲池

  缓冲池是:

  • 常驻部分中最大的部分
  • 用于高速缓存来自磁盘的数据页——减少磁盘访问

  共享内存驻留部分的最大部分用于缓冲池(buffer pool,也称为缓冲区缓存buffer cache),缓冲池是专用于保存或缓存磁盘中数据的缓冲区集合。在共享内存中保存数据页可以使得多个用户无需真正执行磁盘的读写就可以对数据进行读写入操作。
  SinoDB数据库允许使用多个缓冲池,每个缓冲池内的页大小是相同的。在配置文件中都有其自身的设置。实际上,在新版本数据库中,缓冲池被独立出来,使用onstat -g seg命令查看时,可以看到class标志为B的部分即代表缓冲池。

4.1.2 常驻部分:物理日志缓冲区

  共享内存常驻部分的另一个重要部分用于日志缓冲区。物理日志是用于服务器容错机制的一类特殊日志。它包含从磁盘中读入缓冲池后被修改过了的、存入缓冲池中的数据和索引页的前映像(仅第一个拷贝)。
为了减少维护此日志相关的物理 I/O,在写入日志时使用此缓冲区;不是将每个条目直接写入磁盘,而是先写入缓冲区,然后在某个时间点刷新到磁盘。由于服务器可以控制何时刷新这些缓冲区,因此它可以确保在需要时刷新它们。

4.1.3 常驻部分:逻辑日志缓冲区

  逻辑日志(ogical log) 实际上是磁盘上日志文件的集合,为有日志的数据库接收数据控制语言 (DML) 条目(插入、更新、删除),同时为所有数据库接收数据定义语言 (DDL) 条目。星瑞格数据库共享相同的逻辑日志文件集。不同数据库的事务在这些事务日志文件中是交错的。

  写入这些日志文件的数据量可能非常大。为了减少向磁盘中写这些数据所需的物理 I/O 量,这些数据先被放置在缓冲区内,然后在之后的某个时间点刷新到磁盘中。服务器为逻辑日志分配了三个缓冲区来使用。

4.1.4 常驻部分:LRU

  从磁盘中读取的页存储在共享内存缓冲区中,组织成LRU队列。

1698818091228

  当服务器需要从磁盘向共享内存加载一个页时,它必须首先找到一个可以存放页的缓冲区。每个缓冲区都由几个带有指针的列表来定位,即所谓的最近最少使用的 (LRU) 队列。LRU 队列对有一个干净的队列,称为 FLRU(空闲 LRU),以及一个脏队列,称为 MLRU(修改后的 LRU)。

  当一个服务器系统第一次联机时,所有页缓冲区为空,并且均匀地分布在多个 LRU 队列对的 FLRU 队列中。这种分布是为了平衡 FLRU 队列中页缓冲区的分配,以便单个队列不会成为瓶颈。

  当用户线程需要一个缓冲区,服务器随机地在 FLRU 队列中选择一个未被其他用户线程锁定的 LRU 缓冲区。如果该页被修改,那个缓冲区就会被放在 MLRU 队列的最近最常使用缓冲区中。如果页仅被读但未被修改,缓冲区就会返还给 FLRU 队列的最近最常使用缓冲区。

4.2. 共享内存分配:虚拟部分

  共享内存的虚拟部分被分配作为池(pools)

  • 每个池按4K的增量进行分配
  • 内存位图会追踪分配给每个池的所有4K 块
  • 这些块当不再被需要时会进行重新分配

1698723301106
  当服务器为特定用途需用内存时,它会保留虚拟部分中未被使用的内存。为特定目的保留的内存被称作共享内存池 。目前,可供分配的共享内存池有 50 多种。例如,一个内存池被分配给用户来保存私人数据。内存池可以在任何时间进行分配,当不再需要时解除分配。当内存池空间解除分配时,这部分空间又可以被服务器重用。

  服务器利用位图页来追踪内存的使用,处理内存池的内存分配。数据库服务器从虚拟部分中以 4K 的增量分配内存,这个值不能调整。位图页的每一位都会追踪一个 4K 块。

4.2.1 共享内存:虚拟部分

共享内存的虚拟部分被用于多种用途。其中的一些用途包括:

  • 跟踪用户会话数据——每个会话都有自己的内存池来保存会话的私有数据。会话池的名字跟提供给用户的唯一的会话 ID 相同。当一个会话断开与服务器的连接,它的会话池也被解除分配。
  • 高速缓存字典信息——字典池会高速缓存系统目录表的信息。
  • 高速缓存存储过程——一个会话中使用存储过程被高速缓存在过程池中。
  • 线程信息——多线程 (MT) 池用来保存控制线程所需的结构和堆栈。
  • 排序——用于排序数据的临时空间被分配为排序池。
  • 大缓冲区——AIO VPs 使用大缓冲区,这些VP 一次将一大块页面写入磁盘。每个 AIO VP 都会被分配一个大缓冲区。
  • 全局信息——不与会话直接关联的其他数据会被存储在全局池。

4.2.2 虚拟部分可以增加

  服务器的内存需求差别很大:

  • 池的数量和大小会被增加
  • 附加段会被自动分配
  • 起始段和附加段的大小可以由管理员来指定

  由于存储在共享内存虚拟部分的信息特性,服务器所需的共享内存的数量各异,取决于其活跃度。在活跃度高时,会创建更多的共享内存池,而且现有的内存池也可以进行扩展。如果虚拟部分需要更多的空间,附加的共享内存段会自动添加进来。

  您可以指定服务器共享内存虚拟部分起始段的大小。每个自动添加的附加段的大小也是可以配置的。也可以在服务器自动添加新段之前添加自己的任意大小的段。

  一旦共享内存被分配给服务器,它们就只在管理员运行 onmode 实用程序或将数据库服务器置于脱机模式时才被释放。

4.2.3 虚拟部分:高速缓存示例

  共享内存的虚拟部分包含一个内存池,用来高速缓存会话所用的系统目录表。另一个池用于高速缓存存储过程。

  当一个会话第一次执行一条需要表信息的 SQL 语句时,服务器必须从系统目录表中提取那些信息。如果系统目录表中的页还不在共享内存缓冲池中时,就可能需要一次磁盘读操作来获得相应的数据。当数据库服务器读入包含系统目录的页时,表的信息就会被放置在一个共享内存结构中,让数据库服务器可以更高效地访问。这个结构是共享内存字典池的一部分。随后,会话可从字典池中访问字典页,以避免高昂的磁盘读取代价。

  同样存储过程第一次被会话执行时,会被置于存储过程池中,这样后续的会话就可以从高速缓存中获取该过程。这样,高速缓存过程会节省时间和内存。

  存储过程池的缺省容量为 50 个过程。

4.3 共享内存:消息部分

  共享内存消息部分也被称为通信区,在数据库服务器初始化时进行分配。消息部分包含本地客户端程序的消息缓冲区,这些程序利用共享内存来与服务器进行通信。
  客户端应用程序和服务器连接到共享内存的同一段。客户端在消息部分为服务器保留消息,并从服务器留下的消息部分检索消息。对于使用共享内存与服务器通信的每个用户,消息部分的大小约为 12 KB。

5. 磁盘组件

5.1 磁盘组件:Chunks

  一个chunk是一个分配给服务器的连续磁盘空间单元。由下列因素唯一指定:

  • 绝对路径名

  • 偏移量

  • 以KB为单位设定大小

  • 可以是:
    原始( Raw 磁盘
    Cooked 文件

  • 由服务器在内部进行组织

  服务器不使用 UNIX 文件系统进行磁盘空间管理;相反,它使用自己的机制管理磁盘空间——这种机制更适合于数据库管理。

  为数据库服务器分配可用空间是很必要的。这些空间以chunk为单位进行分配。一个chunk是分配给服务器使用的连续空间单位;服务器在chunk内管理空间的使用。一个chunk是一个典型的UNIX原始设备(raw device),但也可能是一个 UNIX cooked file(熟文件)。

5.2 磁盘组件:页

  一个页是服务器中存储和 I/O 的基本单位。

  • 一个chunk被分解成的 I/O 单元,被称为
  • 页的大小是预设的
  • 一个页是从磁盘中读取/写入的最小 I/O 单位
  • 页具有内部结构
  • 有不同类型的页
  • 所有的数据库和系统信息都被存储在页中。页被存储在chunk中。

  当一个chunk被分配给数据库服务器时,就会被分解为称为 的更小单元。对于SinoDB数据库来说,页是 I/O 的基本单位。服务器中的所有数据都储存在页中。例如,如果您想存储一个数据库表的一行,那一行的数据就会被存储在一个页中。当数据从磁盘读入共享内存的缓冲区中时,就是读取存储数据的整个页到缓冲区中。

页大小

  服务器系统所用的页大小是由所在的特定的计算机系统决定的。最常见的页大小是 2KB,也有一些系统使用 4KB 的页。

  SinoDB允许为非根 dbspace 指定页大小。页大小范围可以从 2K 到 16K,并且必须是系统平台缺省页大小的倍数。

  用于 Windows 结构的默认页大小是是 4 KB。该页大小不能改变。

5.3 磁盘组件:Dbspaces

  一个 dbspace 是多个chunk的逻辑集合。

  • 是一个磁盘空间池,可以被服务器所创建的数据库和表使用
  • 一个 dbspcae 必须有至少一个chunk
  • 一个 dbspace 可以有很多chunk

  一个dbspace 是多个chunk的逻辑集合。每个 dbspace 起初必须至少分配有一个chunk。Dbspaces 中chunk的数量可以按需分配多个。如果在一个特定的 dbspace 的空间用完了(因为分配给它的所有chunk都满了),这时可以给它添加额外的chunk。

  可以在指定的 dbspace 中创建数据库和表。这意味着表和数据库的大小最多只能扩展到所在的 dbspace 的可用空间的大小。不能控制一个数据库或者表创建在一个dbspace中的哪些chunks上。如果想确保表或数据库只创建在特定的物理设备上,应该只将位于该设备上的chunks分配给指定 dbspace。

  每个服务器都必须有至少一个 dbspace: root dbspace。 这是在所有的控制服务器的重要系统信息所在的位置。

5.4 磁盘组件:Tblspaces

  一个tblspace 是包含一个数据库表的数据或索引的所有页的集合。

  • 本质上一个tblspace 跟一个表是相同的
  • 一个extent 是一组连续的物理页
  • tblspaceextent 的逻辑集合
  • 分配给一个表的extent不一定是连续的

  一个 tblspace 是分配给一个指定表的所有页的逻辑集合,或者当表以分段的形式分布在多个 dbspace 中时,则是某个dbspace中表的一个段的所有页的逻辑集合。

  一个tblspace 表示的空间不一定是连续的;其中的页可以分布在单一chunk上,或者在不同的chunk上。

  对于未分段的表,一个 tblspace 始终驻留在一个单一的 dbspace 中。如果 dbspace 只分配有一个chunk,则 tblspace 的所有页都驻留在那个chunk上。如果 dbspace分配有多个chunk,则 tblspace 的页可以驻留在那个 dbspace 中任意个chunk上。

  对于分段的表,每个片段都有一个唯一的 tblspace ID 号。这个 tblspace 号被存储在 systables 系统目录的 partnum 列中 和 sysfragments 表的 partn 域中。

5.5 逻辑分组:Dbspaces和Tblspaces

1698732270878
  您可以将 dbspaces 和 tblspaces 看做物理空间的逻辑 组合。

  一个 dbspace 是物理 chunk的逻辑 组合。即使是属于同一个dbspace的chunks,也可以在不同的磁盘上。

  一个 tblspace 是extent的逻辑 组合。一个tblspace中的extent可以位于不同的chunk上(因此在不同的磁盘上)。

5.6 特殊的数据类型:简单大对象

  • TEXT 用于存储基于字符的信息:
    — 源代码
    — 其他文本 ASCII 文件

  • BYTE 用于存储非字符类信息:
    — 数字图像
    — 数字音频
    — 电子表格
    — 任意字节值的任意文件

  简单大对象或者二进制大对象 (blobs)是包含任意值和长度的字节流。一个简单的大对象可能是一个数字化图像或声音、一个对象模块或一个源代码文件。

  可以存储在计算机的文件系统中的任何东西都可以存储为一个简单大对象。它们大小的理论限制为 2GB;这个大小是基于可在 4 字节整型数中所能保存的最大值。

  有两种类型的简单大对象:TEXT 和 BYTE。TEXT 数据类型用于存储可打印的 ASCII 文本,如源代码和脚本。BYTE 数据类型被用于存储任何类型的二进制数据,如保存的电子表格、程序加载模块、以及数字化图像或声音。

5.6.1 磁盘组件:Blobspaces

  一个 blobspace 是一种用于存储简单大对象的特殊类型的dbspace 。

  • 一个只能被用于储存简单大对象的磁盘池
  • 一个 blobspace 中必须有至少一个chunk
  • 一个 blobspace 中可以有多个chunk
  • 一个 blobspace 中可以包含来自下面几处的简单大对象:
    — 任何列
    — 任何表 (来自任何数据库)

  一个blobspace 是一个逻辑实体,表示的是一个以chunk的物理空间的集合。

  每个 blobspace 中必须至少分配有一个chunk。如果一个特定的 blobspace 的空间用完了(因为分配给它的所有chunk都满了),则给它可以添加额外的chunk。

  BYTE 和 TEXT 列可以存储在特定的 blobspace 中。不能选择 blobspace 内的chunk用于存储特定的 blob。

  一个服务器可以有任意多的 blobspaces。任意单一 blobspace 可以包含来自不同表中不同列,甚至是不同数据库的 blob 数据。Blobspace 形成了可用于存储服务器中任意简单大对象列的存储空间池。

5.7 特殊的数据类型:智能大对象

  智能大对象包括:

  • CLOB 和 BLOB 内置类型
  • 第三方的索引
  • 用户定义的数据类型 (UDT)

  在SinoDB中智能大对象有三个主要用途:

  • CLOB 和 BLOB 是用户定义的用于存储大量数据的数据类型。这些类型由每个数据库自动创建并存储在 sysxtdtypes 目录。
  • 第三方应用程序可能使用智能大对象来存储数据以便索引。该索引将仅由创建它的数据刀片进行控制。新的字节级锁使得智能大对象的这种用途更为可行。
  • 智能大对象为大型的用户自定义的数据类型 (UDT) 提供了理想的存储方法。

5.7.1 磁盘组件:Sbspaces

  一个 sbspace 是chunk的一个逻辑集合。

  • 用于存储智能大对象的、由服务器创建的表的磁盘空间池
  • 一个 sbspace 必须有至少一个chunk
  • 一个 sbspace 中可以包含多个chunk

  像其他动态服务器中的存储空间一样,sbspaces 是由一个或多个chunk组成的。然而,一个 sbspace 的第一个chunk结构会更复杂。
  Sbspaces 用于存储智能大对象 ,有时也被称为 smart LOs 或者 smart blobs

5.8 磁盘组件:镜像

  镜像是将相同的页面自动写入两个不同设备的过程。

  • 是在 dbspace 或 blobspace 级别决定的
  • 必须在服务器启动时启用
  • 允许磁盘恢复,无需用户中断
  • 使用同步写来提高性能

1698733622615

  镜像 是在写入操作时自动复制数据的过程。服务器提供对dbspace 或 blobspace中内容进行镜像的选择。在对可靠性和可用性有要求的情况下,磁盘镜像是可供选择的几种功能之一。如果没有磁盘镜像,故障磁盘的恢复将需要:

  • 使数据对用户不可用
  • 更换出现故障的硬件
  • 从存档磁带中恢复
  • 向前回滚任何事务日志

  有了磁盘镜像,恢复可以在不中断数据的可用性的情况下完成。

  当镜像磁盘时,镜像chunk上所涉及的文件都会被放到不同的磁盘驱动中(不仅仅是同一驱动器上的不同切片),最好是在不同的磁盘控制器上。

  是否允许磁盘镜像的选择是基于服务器配置做出的。然而,是否镜像单个 dbspace、blobspaces 或 sbspace可以在任何时候决定。

5.8 磁盘组件:逻辑日志

  逻辑日志是由逻辑日志文件 组成,它们是用于事务记录的连续 页的集合

  • 用与带日志数据库的逻辑恢复
  • 存储事务记录(以及其他信息)
  • 由服务器中的所有数据库共享

  在服务器中,有一定量的磁盘空间留给由许多的逻辑日志文件组成的逻辑日志。

  逻辑日志文件是磁盘上用于存储服务器事务记录的连续页的集合。这些事务记录用于跟踪对使用带日志的数据库所做的所有更改。所有数据库共享同一组逻辑日志文件。每个服务器必须至少有三个逻辑日志文件。

5.9 磁盘组件:物理日志

  物理日志是用于自动恢复的一个特殊日志。

  • 是磁盘上连续页的集合
  • 被用来记录在共享内存中修改过的页的前映像 (第一次复制)

1698733954196

  服务器有一个用于进行自动恢复的特殊日志。这个日志被称为物理日志 。物理日志是磁盘上一组连续页的集合。

  当一个页被读入到共享内存缓冲区并被用户修改时,该页初始状态的副本就会被写入到物理日志中。这页的副本称为前映像(页改变之前的副本)。只有在缓冲区中一个页的第一个变化会导致其前映像被写入物理日志。对同一页的任何后续更改不会导致额外的前映像被写入物理日志中。这些自动恢复机制所使用的前映像将在以后的模块中涉及。

6. 主要服务器事件:数据高速缓存

   数据高速缓存(Data caching) 是存储在磁盘上的数据页被读入共享内存缓冲池中的缓冲区时发生的。

  • 一个进程将数据读入共享内存缓冲区
  • 后续的页访问是针对页的共享内存副本进行的
  • 修改对于所有的服务器进程来说即刻生效

  当数据库服务器想要访问数据时,它首先查找存储数据的页。当定位到页后,将该页从磁盘读入共享内存缓冲池中的一个缓冲区中。

  一旦此页进入缓冲池中,想要读取该页上数据的任何其他用户就无需从磁盘重新读取它;并且共享内存缓冲池中的页被所有服务器进程共享。

  从磁盘中读取页到共享内存缓冲区被称为数据高速缓存

  如果页上的数据被服务器修改(例如,在插入、更新或删除过程中),就在缓冲区中直接修改。这意味着所有服务器进程都会立即访问到修改后的数据。在共享内存中修改过的缓冲区在稍后的时间会刷新回磁盘。

7. 主要服务器事件:检查点

  检查点是一个系统事件,在此期间,所有修改的缓冲区都将复制到磁盘。

  当从磁盘读页到共享内存缓冲区中并在那些缓冲区中修改时,磁盘上的页和这些页在共享内存缓冲区中的副本会变得不一致。两者需要间或性地重新同步,使它们相同。该重新同步是通过一个称为检查点 的系统事件来完成的。有两种类型的检查点:完全 (或同步检查点模糊检查点

  当页从磁盘读取到共享内存缓冲区中,然后在这些缓冲区中进行修改时,磁盘上的页和共享内存缓冲区中这些页的副本将变得不一致。两者需要间断性地重新同步,使它们相同。该重新同步是通过称为检查点的系统事件来完成。检查点完成后,共享内存缓冲区中的所有页面将再次与磁盘上的页面相同。

  检查点事件也可作为恢复点。如果系统发生故障,对共享内存中的页所做的任何更改都不会反映在这些页在磁盘的状态上。然而,我们知道,只有自上一个检查点以来所做的更改还未写到磁盘上。服务器的自动恢复机制将会负责恢复自上一个检查点以来所作的改变。