记一次JPOM启动的时候,镶嵌在server服务下的H2数据库无法启动的问题修复

Jpom[2.11.9] 当前数据路径:/usr/local/jpom-server 外部配置文件路径:file:/usr/local/jpom-server/conf/application.yml
2024-08-30 09:10:47.257 [main] INFO o.d.j.c.JpomApplicationEvent [JpomApplicationEvent.java:133] - 本机安装 ID 为:5a273722d9ff416bad0506eb1217cfb2
2024-08-30 09:10:47.272 [main] INFO o.d.j.s.d.InitDb [InitDb.java:97] - 开始加载 H2 数据库
2024-08-30 09:10:48.242 [main] ERROR o.d.j.s.d.InitDb [InitDb.java:164] - 初始化数据库失败
cn.hutool.db.DbRuntimeException: JdbcSQLNonTransientException: General error: “org.h2.mvstore.MVStoreException: Chunk 380702 not found [2.1.214/9]” [50000-214]
at cn.hutool.db.ds.pooled.PooledDataSource.(PooledDataSource.java:88)

ChatGPT 说:
ChatGPT
你看到的错误信息表明,Jpom 使用的 H2 数据库出现了问题。具体来说,JdbcSQLNonTransientException: General error: “org.h2.mvstore.MVStoreException: Chunk 380702 not found” 这个错误提示数据库文件的一部分已损坏或丢失,导致数据库初始化失败。

解决问题的步骤
备份数据库:

在尝试恢复之前,首先确保备份现有的数据库文件。H2 数据库文件通常位于 /usr/local/jpom-server 目录中,文件扩展名可能是 .mv.db 或 .h2.db。
尝试恢复数据库:

H2 提供了一个恢复工具,可以用来尝试修复数据库。你可以通过 H2 的命令行工具运行以下命令:
bash
复制代码

java -cp h2*.jar org.h2.tools.Recover -dir /path/to/database/files -db databaseName

这个工具会尝试读取损坏的数据库并创建一个可能修复后的新版本。
使用备份或还原:

如果恢复工具不起作用,并且你有最近的数据库备份,可以考虑从备份中还原数据库。
检查问题原因:

查看系统日志以及 Jpom 和 H2 所运行的环境。数据库损坏可能由意外的系统关闭、硬件问题或文件系统问题引起。
数据库配置:

检查 /usr/local/jpom-server/conf/ 目录中的 application.yml 文件,确保数据库配置是正确的。
如果尝试这些步骤后问题仍未解决,可能需要重新创建数据库,但这会导致数据丢失,前提是没有可用的备份。

您说:

`/usr/local/jpom-server/db/Server.mv.db`

是这个文件吗
ChatGPT 说:
ChatGPT
是的,/usr/local/jpom-server/db/Server.mv.db 文件就是 H2 数据库的数据文件。这个文件包含了 Jpom 服务器使用的所有数据。

说明
.mv.db 是 H2 数据库文件的默认扩展名,表示数据库的数据存储在 MVStore 存储格式中。
这个文件可能会随着时间增长,尤其是当系统中存储了大量数据时。
操作建议
备份文件:

在进行任何修复操作之前,请务必先备份这个文件以及同目录下的其他数据库文件(如 .trace.db 文件,如果存在)。
备份可以通过简单的复制命令来完成:
bash
复制代码

cp /usr/local/jpom-server/db/Server.mv.db /some/backup/directory/

尝试恢复:

你可以使用 H2 的恢复工具尝试修复这个数据库文件,如前面提到的命令:
bash
复制代码
java -cp /path/to/h2*.jar org.h2.tools.Recover -dir /usr/local/jpom-server/db/ -db Server
这个命令会生成一个新的 .mv.db 文件,尝试修复原有的数据库。
考虑还原备份:

如果修复不成功,并且有之前的备份文件,可以通过还原备份来恢复数据库。
注意事项
确保 Jpom 服务器在进行这些操作时是停止的,以防止数据文件被占用或进一步损坏。
如果在还原或修复后,问题依然存在,可能需要重新初始化数据库,并手动恢复必要的数据(如果没有备份可用)。

您说:

 java -cp /path/to/h2*.jar org.h2.tools.Recover -dir /usr/local/jpom-server/db/ -db Server
错误: 找不到或无法加载主类 org.h2.tools.Reco

ver
ChatGPT 说:
ChatGPT
这个错误提示 org.h2.tools.Recover 类未找到或无法加载,通常是由于以下原因之一:

H2 Jar 文件路径不正确: 你可能指定了错误的路径,或者 H2 的 JAR 文件不在指定的路径中。
H2 版本问题: 某些版本的 H2 可能没有包含 Recover 工具类,或者类的位置有所变化。
解决方案

  1. 检查 H2 JAR 文件路径
    首先,确保 H2 数据库的 JAR 文件确实存在,并且路径正确。你可以使用以下命令列出 H2 JAR 文件所在目录中的内容:

bash
复制代码

ls /path/to/h2*.jar

如果找不到任何文件,说明路径可能错误。你可以尝试查找 H2 JAR 文件的位置,例如:

bash
复制代码
find / -name “h2*.jar”
2. 下载最新的 H2 数据库 JAR
如果你没有 H2 数据库的 JAR 文件,或者你不确定文件是否包含 Recover 工具,可以下载最新版本的 H2 数据库:

H2 Database Download
下载后,将 JAR 文件放在一个你容易访问的路径下。

  1. 使用正确的命令运行恢复工具
    确保你在正确的路径下运行恢复工具。示例:

bash
复制代码

java -cp /path/to/h2-2.x.x.jar org.h2.tools.Recover -dir /usr/local/jpom-server/db/ -db Server

注意事项
如果你在使用较新版本的 H2 数据库,命令行工具可能有所变化。你可以参考 H2 数据库的官方文档,确保你使用的命令与当前版本兼容。
在执行任何操作前,始终备份现有的数据库文件。
如果依然遇到问题,可能需要查看 H2 的文档或使用其他工具来修复数据库。

您说:

/usr/local/jpom-server/lib/server-2.11.9.jar 可能是镶嵌在这里

ChatGPT 说:
ChatGPT
/usr/local/jpom-server/lib/server-2.11.9.jar 文件可能包含了 H2 数据库的依赖,但通常这个 JAR 文件是 Jpom 的核心库,而不是专门的 H2 数据库 JAR。如果 H2 库嵌入在这个 JAR 文件中,直接调用 org.h2.tools.Recover 类可能会有一些挑战。

如何检查并使用

  1. 检查 H2 类是否存在
    你可以解压 server-2.11.9.jar 文件并检查是否包含 org.h2.tools.Recover 类。使用以下命令来解压 JAR 文件:

bash
复制代码

unzip /usr/local/jpom-server/lib/server-2.11.9.jar -d /some/temporary/directory/

然后检查解压后的目录中是否存在 org/h2/tools/Recover.class 文件。

  1. 运行恢复工具
    如果确认 org.h2.tools.Recover 类存在,你可以尝试从这个 JAR 文件中运行恢复工具:

bash
复制代码
java -cp /usr/local/jpom-server/lib/server-2.11.9.jar org.h2.tools.Recover -dir /usr/local/jpom-server/db/ -db Server
3. 如果类不存在
如果 server-2.11.9.jar 中没有 org.h2.tools.Recover 类,那么 H2 库可能不是直接嵌入在这个 JAR 文件中,你可能需要单独下载 H2 数据库 JAR 文件并尝试使用。

其他选项
查找嵌入的 H2 JAR 文件: 查看 lib 目录下是否有其他 JAR 文件可能包含了 H2 数据库。

bash
复制代码

ls /usr/local/jpom-server/lib/

从 Maven 仓库下载: 你可以从 Maven 中央仓库下载对应版本的 H2 JAR 文件,然后使用它来尝试修复数据库。

最后建议
如果嵌入的 H2 版本导致复杂性较高,直接从 H2 官方下载最新版本的 JAR 文件可能会更简单且有效。这样可以确保你拥有完整的工具集来处理数据库问题。

您说:

/data/jpom/BOOT-INF/lib/h2-2.1.214.jar 找到了

ChatGPT 说:
ChatGPT
记忆已更新
很好,现在你可以使用这个 H2 数据库 JAR 文件来尝试修复数据库。

使用 H2 恢复工具修复数据库
运行恢复工具: 使用以下命令来运行 H2 的恢复工具,并尝试修复你的数据库:

bash
复制代码

java -cp /data/jpom/BOOT-INF/lib/h2-2.1.214.jar org.h2.tools.Recover -dir /usr/local/jpom-server/db/ -db Server

检查恢复结果:

该工具会在指定的目录下生成修复后的数据库文件(如 .mv.db 文件)。你可以检查生成的文件是否恢复了原有数据。
如果修复成功,确保 Jpom 可以正常启动并访问数据库。
备份:

在进行任何进一步操作之前,请确保再次备份修复后的数据库文件。
如果遇到任何问题,请随时告诉我,我会继续帮助你解决。

您说:
开始加载 H2 数据库

2024-08-30 09:28:21.763 [main] ERROR o.d.j.s.d.InitDb [InitDb.java:164] - 初始化数据库失败 
cn.hutool.db.DbRuntimeException: JdbcSQLNonTransientException: General error: "org.h2.mvstore.MVStoreException: Chunk 380702 not found [2.1.214/9]" [50000-214]

还是报错了,执行之后
ChatGPT 说:
ChatGPT
如果在使用 H2 恢复工具后仍然遇到相同的错误,这表明数据库文件可能存在严重的损坏,且恢复工具无法修复。这种情况下,你可以考虑以下几种方法:

  1. 尝试使用 H2 的其他修复工具
    H2 提供了多种工具来处理数据库文件,你可以尝试使用 Script 工具导出数据库的 SQL 脚本,再重新导入到新的数据库中。

bash
复制代码

java -cp /data/jpom/BOOT-INF/lib/h2-2.1.214.jar org.h2.tools.Script -url jdbc:h2:/usr/local/jpom-server/db/Server -script /path/to/backup.sql

如果导出成功,你可以创建一个新的数据库并将脚本导入:

bash
复制代码

java -cp /data/jpom/BOOT-INF/lib/h2-2.1.214.jar org.h2.tools.RunScript -url jdbc:h2:/new/db/path -script /path/to/backup.sql
  1. 使用备份还原
    如果你有之前的数据库备份文件,可以考虑从备份中还原数据库。这是最快速的解决方法,但需要有最新的备份可用。

  2. 创建新数据库
    如果无法修复或恢复现有数据库,可能需要重新初始化数据库。这将导致所有现有数据丢失,所以建议仅在其他方法都失败时使用此方法。

  3. 联系支持或社区
    如果以上方法都无法解决问题,考虑联系 Jpom 或 H2 数据库的支持团队,或者在社区论坛中寻求帮助。

注意
如果你能导出部分数据,尽量在初始化新数据库前备份和恢复尽可能多的数据。

您说:

/usr/local/jpom-server/db/backup/20240829120000.sql

ChatGPT 说:
ChatGPT
你已经找到一个备份文件 /usr/local/jpom-server/db/backup/20240829120000.sql,这是一个 SQL 脚本文件,可能包含了数据库的备份数据。你可以使用这个备份文件来恢复数据库。

使用 SQL 脚本还原数据库
停止 Jpom 服务:

在还原数据库之前,确保 Jpom 服务已停止,以避免数据冲突。
备份当前数据库文件(可选):

虽然现有数据库可能已损坏,但仍建议备份当前数据库文件,以防万一:
bash
复制代码

cp /usr/local/jpom-server/db/Server.mv.db /usr/local/jpom-server/db/Server.mv.db.bak

删除旧数据库文件:

删除旧的、损坏的数据库文件,以便从备份脚本中重新创建:
bash
复制代码
rm /usr/local/jpom-server/db/Server.mv.db
使用 H2 工具还原数据库:

你可以使用 H2 提供的 RunScript 工具将 SQL 脚本文件导入到一个新的数据库中:

bash
复制代码

java -cp /data/jpom/BOOT-INF/lib/h2-2.1.214.jar org.h2.tools.RunScript -url jdbc:h2:/usr/local/jpom-server/db/Server -script /usr/local/jpom-server/db/backup/20240829120000.sql

这个命令会根据 SQL 脚本中的内容创建一个新的数据库文件。

启动 Jpom 服务:

还原完成后,重新启动 Jpom 服务并检查是否能够正常访问数据库。
结果检查
确保 Jpom 能够正常启动并加载数据库。如果一切顺利,数据库应该已经从备份中成功恢复。
如果你在执行过程中遇到问题或错误,请告诉我,我可以继续协助你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值