可扩展存储引擎文件

适用于: Windows |Windows Server

可扩展存储引擎文件

可扩展存储引擎使用以下类型的文件:

此表包含由 ESE 管理的数据文件名称的概述。 对于 Windows Vista 及更高版本,JET_paramLegacyNames设置会影响使用的文件名。

Label

事务日志文件

事务日志文件包含对数据库文件执行的操作。 它们包含足够的信息,使数据库在进程意外终止或系统关闭后处于逻辑一致状态。

日志文件的名称依赖于三个字母的基名称,可以使用 JET_paramBaseName进行设置。 以下示例使用基名称“edb”,因为这是默认基名称。 事务日志文件的扩展名为 .log 或 .jtx,具体取决于是否在 JET_paramLegacyFileNames 参数中设置了JET_bitESE98FileNames。 有关详细信息,请参阅 可扩展存储引擎系统参数

事务日志文件命名为 <base><generation-number.log>,从 1 开始。 日志生成编号采用十六进制格式。 例如,edb00001.log 是第一个日志,edb000ff.log 是第 255 个日志。 日志文件名称中有五个十六进制数字,直到第 1048576 个日志文件,此时日志文件开始以 11.3 格式命名, (例如 edb00100000.log) 。 <base.log> 始终是当前正在使用的日志文件。 如果数据库引擎未处于活动状态,可以使用以下命令标识 edb.log 的生成: esentutl.exe -ml edb.log

尽管事务日志文件具有 。通常与文本文件关联的 LOG 扩展,事务日志文件采用二进制格式,永远不应由用户编辑。首先将数据库操作写入日志。 稍后可将数据写入数据库文件;可能立即,可能晚得多。 如果发生意外的进程或系统终止,日志文件中仍存在操作,并且可以回滚不完整的事务。 重播事务日志文件的行为称为 软恢复,在调用 JetInitJetInit2 时自动执行。 也可以使用Esentutl.exe程序的“-r”选项手动执行软恢复。 重播从备份还原的数据库上的事务日志文件的行为称为 硬恢复

日志文件的大小固定,可通过 JET_paramLogFileSize进行自定义。 当当前日志文件 (即 edb.log) 被填充时,它将重命名为 <base><generation-number.log>,并且事务日志流中需要一个新的事务日志文件。

每个数据库实例都有一个与之关联的日志文件序列。 Windows XP 引入了 JetCreateInstance,允许单个进程使用多个事务日志文件序列。 但是,同一目录中不能存在多个事务日志文件序列。

事务日志文件几乎永远不会被手动操作、重命名、移动或删除,因为可能会导致数据损坏。

事务日志文件将在完整备份期间由数据库引擎删除, (请参阅 JetBackupJetTruncateLogJetTruncateLogInstance) ,或者在正常操作期间(如果启用了循环日志记录)。

事务日志文件填满后,数据库引擎需要创建新的日志文件。 循环日志记录是数据库引擎在不再需要进行崩溃恢复时自动清理日志文件的一种方法。 此过程是删除日志文件作为执行备份的副产品的另一种替代方法。 可以使用 JET_paramCircularLog 系统参数控制循环日志记录。 不应使用任何其他方法删除事务日志文件。

临时事务日志文件

当 edb.log 填满时,ESE 需要创建新文件。 新日志事务日志文件在 ESE 使用之前称为临时事务日志文件。

创建新的日志文件并扩展其大小时,它将称为 <base>tmp.log。 创建新文件可能是一项成本高昂的操作,因此 ESE 会主动创建下一个日志文件作为后台任务。

由于临时事务日志文件是在预期需要新的事务日志文件时创建的,因此它不包含任何有用的信息。

保留的事务日志文件

当引擎开始允许记录重要操作以完全关闭时,会创建保留的事务日志文件。

Windows Vista: 在 Windows Vista 及更高版本中,保留事务日志文件命名为 <基本>RESXXXXX.jrs。

Windows Server 2003: 在 Windows Server 2003 及更早版本中,保留的事务日志文件名为 res1.log 和 res2.log。

数据库引擎磁盘空间不足时,无法创建新的日志文件。 最安全的做法是干净地关闭,但某些操作 ((如回滚操作) 仍必须记录在内。 在此阶段,大多数数据库操作都会失败。

由于保留的事务日志文件是在磁盘外方案中预期需要事务日志文件而创建的,因此它们不包含任何有用的信息。

检查点文件

检查点文件存储特定事务日志文件序列的检查点。 检查点文件命名为 <base.chk> 或 <base.jcp>,具体取决于JET_bitESE98FileNames是否在 JET_paramLegacyFileNames 参数中设置,并且其位置由 JET_paramSystemPath 提供。

数据库操作首先写入日志文件,然后缓存在内存中。 在以后的某个时候,操作会写入数据库文件,但出于性能原因,将操作写入数据库文件的顺序可能与最初记录操作的顺序不匹配。 写入事务日志文件的操作将处于以下两种状态之一:

  • 写入事务日志文件和数据库文件。

  • 已写入事务日志文件,但尚未写入数据库文件。

许多数据库操作可以存储在单个事务日志文件中。 给定的日志文件可以包含以下项:

  • 写入数据库文件的所有操作。

  • 没有写入数据库文件的操作

  • 写入数据库文件的操作和尚未写入数据库文件的操作的组合。

检查点是指事务日志流中的时间点,检查点之前的所有操作都已写入数据库文件。 无法保证检查点后发生的操作;有些可能位于内存中,有些可能写入数据库。

由于检查点之前的日志文件中的所有操作都表示在数据库文件中,只有检查点之后的事务日志文件才能使软恢复使特定数据库进入干净状态。

数据库文件

数据库文件包含数据库中所有表的架构、数据库中所有表的记录以及表上的索引。 其位置使用 JetCreateDatabaseJetCreateDatabase2JetAttachDatabaseJetAttachDatabase2 提供。

只有在成功调用 JetTerm 或 JetTerm2 后,才会完全关闭数据库

Esentutl.exe程序可以使用“-mh”选项检测数据库是否已完全关闭。 例如,“esentutl.exe -mh sample.edb”将读取名为 sample.edb 的数据库的数据库标头,并输出 sample.edb 的状态。 它可能会打印出“状态:干净关闭”或“状态:脏关机”。

尚未完全关闭的数据库处于脏关闭状态。 在 Windows XP 之前,此状态称为 不一致。 脏 (不一致的) 数据库可以通过软恢复进入干净状态。 损坏的数据库与脏 (“不一致”) 数据库不同。

损坏的数据库是指物理或逻辑损坏,无法通过软恢复进行修复。 物理损坏可能是位翻转,数据库页面上的校验和经常会捕获到。 数据库文件中失败的校验和本身显示为JET_errReadVerifyFailure错误。

只有干净关闭的数据库才能安全地移动或重命名。 如果数据库未完全关闭,则无法自动安全地移动或重命名该数据库。

多个数据库可以与单个事务日志文件序列相关联。

临时数据库

临时数据库用作诱人的后备存储,在创建索引时也使用它。

名称和位置配置了 JET_paramTempPath

诱惑是使用 JetOpenTempTableJetOpenTempTable2JetOpenTempTable3JetOpenTemporaryTable 创建的。 它们还由某些 API 调用创建,用于返回架构信息 (,例如 JetGetIndexInfo) 。

刷新映射文件

从Windows 10周年更新 (客户端) 和Windows Server 2016 (服务器) 开始,ESE 增加了针对丢失写入 (或刷新丢失) 1 的额外保护级别,使其能够检测此类事件跨进程重新初始化2。 此功能需要将元数据保存到名为“刷新映射”文件的单独文件中。

为每个数据库文件创建一个刷新映射文件,该文件位于同一目录中。 文件的名称与数据库文件类似,但扩展名不同。 例如,如果客户端应用程序创建具有完整路径 C:\MyDirectory\MyDabatase.edb 的数据库,则其相应的刷新映射文件为 C:\MyDirectory\MyDabatase.jfm。

此增强功能引入了两个对数据库文件必须如何命名的要求:

  • 同一目录中的两个数据库不能具有相同扩展名的文件名。 例如:C:\MyDirectory\MyDabatase.db1 和 C:\MyDirectory\MyDabatase.db2。

  • 2. 数据库不能具有 .jfm 扩展名。

手动复制或移动数据库文件时,其相应的刷新映射文件也应分别复制或移动到同一目标目录。 如果在通过 JetAttachDatabase (新的数据库附件时不存在刷新映射文件,则会在从数据库中读取页面时按需创建并重新填充一个新映射文件。 混合不匹配的数据库和刷新映射文件由 ESE 处理,并强制从头开始删除并重新创建不匹配的刷新映射。

刷新映射文件的大小与其关联的数据库文件成正比,大约等于 (所有大小(以字节为单位),结果必须向上舍入到下一个倍数(8,192) ):

8,192 + ((<database file size> / <database page size>) / 4)

例如:对于使用 32KB 页大小的 1.5GB 数据库,刷新映射的大致大小为 24,576 字节 (或 24KB) 。

刷新映射文件需要在刷新数据库页时刷新。 例如,如果 (启用事务日志记录, JET_paramRecovery 设置为“on”,则默认) ,刷新映射是在客户端应用程序对数据库进行修改时执行的。 平均而言,在生成的事务日志) ,每 20% 的 JET_paramCheckpointDepthMax 值 (字节数,整个刷新映射都会写入非易失性媒体一次。 写入操作的数量取决于修改在整个数据库中的分布方式。 但它最多 (所有大小(以字节为单位)) :

<flush map file size> / JET_paramMaxCoalesceWriteSize

例如,如果 (禁用事务日志记录, JET_paramRecovery 设置为“off”) ,则仅当数据库通过 JetDetachDatabase 显式分离干净 (时刷新映射一次,或者通过任何 JetTerm 函数终止其关联的 ESE 实例 (隐式分离,只要未) 传递 JET_bitTermDirty

1 丢失的写入 (或丢失刷新) 定义为从操作系统成功返回到 ESE 数据库引擎的写入操作,但实际数据永远不会保留在非易失介质中的数据库文件中。 这通常是由软件或硬件) (存储堆栈故障或配置错误引起的。 如果数据位于发生写入丢失事件的区域中,客户端应用程序可能会收到来自 ESE 函数的 JET_errReadLostFlushVerifyFailure 错误,该错误要求从数据库读取数据。

2 自Windows 8 (客户端) 和Windows Server 2012 (服务器) 以来,一直存在检测进程生存期内丢失写入的能力。