edb数据库中的事务日志文件

时间:2011-05-16 12:36:07

标签: windows database exchange-server esent edb

在我尝试从不同的edb数据库集合中提取数据(转储和选择性读取列)时,我遇到了一个基本问题。我有一个带有几个日志文件的edb数据库。我知道数据库中有哪些信息,但我只提取了一半。我担心剩下的一半睡在日志文件中的某个地方。我假设EDB引擎知道日志文件的位置,并在附加数据库时自动加载它们(正确设置了JET_paramSystemPath,JET_paramLogFilePath和JET_paramBaseName)。这是一个错误的假设吗?如果是这样,我该怎么办才能加载日志?

或者,是否可以简单地将事务提交到EDB文件并删除日志?

1 个答案:

答案 0 :(得分:2)

如果存在未提交的事务,则数据库将标记为“不一致”。您可以使用ESENTUTL / MH对数据库进行检查。针对不一致的数据库调用JetAttachDatabase将始终失败。

因此,如果您的程序能够附加并打开数据库,那么它是一致的。有两种方法可以使数据库保持一致:

  1. 彻底关闭ESENT。
  2. 使用JetInit时间的日志文件运行恢复。
  3. JetInit做的第一件事就是查找JET_paramLogFilePath和JET_paramBaseName指定的日志文件。日志文件包含它们引用的数据库的完整路径,然后日志文件中的事务将提交给数据库。因此,如果正确设置系统参数,则ESEN​​T将在附加数据库时加载日志。

    另一方面,如果您没有正确设置参数,那么您的程序将实际处理不需要恢复的数据库。 JetInit将找不到任何日志文件,因此它不会执行任何操作,并且附加将成功,因为数据库是一致的。

    另一个问题是日志文件包含数据库的完整路径。这意味着如果您复制/移动了数据库,则恢复将不起作用。从Windows Server 2003开始,您可以通过将JET_paramAlternateDatabaseRecoveryPath设置为包含数据库的目录来处理此问题。

    重要说明:为了安全起见,您应始终使用只读标志附加和打开数据库。这将避免由错误的日志文件设置引起的任何问题。一个常见的问题是,只读应用程序最终会在不同的目录中创建一组日志文件,从而阻止数据库正常恢复。