H2 数据库损坏

Posted

技术标签:

【中文标题】H2 数据库损坏【英文标题】:H2 database corruption 【发布时间】:2013-03-19 10:04:25 【问题描述】:

有没有办法在应用程序启动 H2 数据库之前检查数据库损坏?如果我发现数据已损坏,我想在应用程序启动时从备份 zip 文件运行自动恢复。

我不能通过连接数据库来检查它,因为如果数据库文件在那里,即使它是空的,我仍然可以连接并生成默认表。

我还想为数据库中的每个表创建一个选择语句以确保其正常工作。我没有在 H2 数据库中找到任何内置的 sql 函数来检查数据损坏。

【问题讨论】:

也可以考虑检查DatabaseMetaData 我发现 allTablesAreSelectable() 应该可以检查是否可以查询所有表:) 【参考方案1】:

要检查数据库文件是否存在,您可以使用

if (new java.io.File(databaseFileName).exists())  ... 

如果文件存在,但数据库已损坏,那么通常您将无法连接到它(尝试连接会抛出异常)。这是我知道的最快的验证方式。

存在数据库文件存在但未完全初始化的小风险。如果是这种情况,则某些表不存在。验证所有表是否存在的标准方法是使用DatabaseMetaData.getTables

但是,除非您使用一些危险的功能(例如禁用事务日志或禁用数据库文件锁定),否则如果您使用 H2 的最新版本,则数据库不应损坏。如果数据库确实损坏了,那么这可能是您如何使用 H2 的问题,或者可能是 H2 本身的错误。向 H2 Google Group 发送一封包含详细信息的邮件可能是有意义的。

【讨论】:

其实有一个异常:如果我手动删除数据库文件的全部内容,不会抛出异常,但是在下一次初始化时会创建新的空数据库——可能是打算完成的这样......我的意思是检查数据库结构是否正常。但总的来说你是对的 - 通常会抛出数据库损坏的异常。 只是提醒一下,损坏也可能来自硬件、坏内存或坏存储。对数据库进行完整性检查将非常有价值。 是的,H2 确实使用了校验和。 很抱歉重蹈覆辙,但如果发生这样的事情怎么办:java.lang.ArrayIndexOutOfBoundsException: -1 at org.h2.index.PageDataLeaf.getNextPage(PageDataLeaf.java:400) ? @BrainStorm.exe 在这种情况下,您需要使用恢复工具(请参阅文档)。

以上是关于H2 数据库损坏的主要内容,如果未能解决你的问题,请参考以下文章

从损坏的 h2 数据库文件中恢复所有可能的信息

从 Hibernate 处理的 h2 数据库的表中删除是不是会损坏表?

H2 数据库:如何解锁数据库文件以进行备份?

参照完整性被破坏

H2数据库使用

[h2两个数据库同步更新]h2数据库配置多个连接