如果有未提交的事务,那么数据库将被标记为“不一致”。您可以使用 ESENTUTL /MH 对数据库进行检查。针对不一致的数据库调用 JetAttachDatabase 将始终失败。
因此,如果您的程序能够附加并打开数据库,那么它是一致的。有两种方法可以使数据库保持一致:
- 彻底关闭 ESENT。
- 在 JetInit 时使用日志文件运行恢复。
JetInit 做的第一件事是查找由 JET_paramLogFilePath 和 JET_paramBaseName 指定的日志文件。日志文件包含它们引用的数据库的完整路径,然后将日志文件中的事务提交到数据库。因此,如果您正确设置系统参数,那么 ESENT 将在附加数据库时加载日志。
另一方面,如果您没有正确设置参数,那么您的程序实际上将在不需要恢复的数据库上运行。JetInit 不会找到任何日志文件,因此它不会做任何事情并且附加会成功,因为数据库是一致的。
另一个转折是日志文件包含数据库的完整路径。这意味着如果您复制/移动了数据库,则恢复将不起作用。从 Windows Server 2003 开始,您可以通过将 JET_paramAlternateDatabaseRecoveryPath 设置为包含数据库的目录来处理此问题。
重要提示:为了安全起见,您应该始终使用只读标志附加和打开数据库。这将避免由错误的日志文件设置引起的任何问题。一个常见的问题是只读应用程序最终会在不同的目录中创建一组日志文件,这会阻止数据库正确恢复。