HSQLDB 将大型数据库从 1.8 升级到 2.4.1 超时
HSQLDB times out upgrading large DB from 1.8 to 2.4.1
所以我继承了 HSQLDB 1.8.0.10 上的遗留应用程序 运行,它在断电后偶尔会出现恢复问题。随着过去 10 年稳定性和持久性的所有改进,我正在考虑将其升级到最新的 2.4.1.
我有多个数据库要测试。从几 KB 到最大的 2GB。
提供 第二大 数据库,它位于 270MB(不幸的是,几乎是下一个大小的十分之一)没有问题;然而,在 2GB 文件上启动服务器,导致 HSQL 永远坐在那里尝试加载文件。
这不是 v1.8 上的问题,v1.8 很快就开始了。在 v2.4 上,我等了 10 分钟就放弃了(即使它确实在 10 米内工作,让服务器花那么长时间启动仍然是非常不可接受的)。
我试过开启跟踪:
HsqlProperties p = new HsqlProperties();
p.setProperty("server.database.0", "db/TheDb");
p.setProperty("server.dbname.0", "TheDb");
p.setProperty("server.port", port);
p.setProperty("server.silent", "false");
p.setProperty("server.trace", "true");
Server server = new Server();
server.setProperties(p);
server.start();
结果如下:
: run() entered
...
: server.root=.
: openServerSocket() entered
: Got server socket: ServerSocket[addr=0.0.0.0/0.0.0.0,localport=37011]
: Server socket opened successfully in 6 ms.
: openServerSocket() exiting
: openDatabases() entered
: Opening database: [file:db/TheDb]
// Stuck here forever
数据库由以下文件组成:
$ ls
417028772 TheDb.backup
2147483608 TheDb.data
430165 TheDb.log
444 TheDb.properties
196938 TheDb.script
而.properties
文件目前如下:
#HSQL Database Engine 1.8.0.10
hsqldb.script_format=0
runtime.gc_interval=0
sql.enforce_strict_size=false
hsqldb.cache_size_scale=8
readonly=false
hsqldb.nio_data_file=true
hsqldb.cache_scale=14
version=1.8.0
hsqldb.default_table_type=cached
hsqldb.cache_file_scale=1
hsqldb.log_size=200
modified=no
hsqldb.cache_version=1.7.0
hsqldb.original_version=1.8.0
hsqldb.defrag_limit=50
hsqldb.compatible_version=1.8.0
.script
文件中未设置任何属性。 (对于其他成功升级的数据库,我确实注意到 props 大部分都从 .properties 移到了 .script 中)
我想知道是否还有其他人执行过类似的壮举,and/or 在 v2 之前的大型文件中看到了类似的行为。有没有办法在跟踪中有更多的可见性以识别加载数据文件时的问题?
提前致谢。
建议在使用版本 2.x 的数据库引擎打开数据库之前使用版本 1.8 执行 SHUTDOWN SCRIPT。使用此方法以版本 2.x 格式重新生成数据文件。这需要很长时间,但未来的创业会很快。
所以我继承了 HSQLDB 1.8.0.10 上的遗留应用程序 运行,它在断电后偶尔会出现恢复问题。随着过去 10 年稳定性和持久性的所有改进,我正在考虑将其升级到最新的 2.4.1.
我有多个数据库要测试。从几 KB 到最大的 2GB。
提供 第二大 数据库,它位于 270MB(不幸的是,几乎是下一个大小的十分之一)没有问题;然而,在 2GB 文件上启动服务器,导致 HSQL 永远坐在那里尝试加载文件。
这不是 v1.8 上的问题,v1.8 很快就开始了。在 v2.4 上,我等了 10 分钟就放弃了(即使它确实在 10 米内工作,让服务器花那么长时间启动仍然是非常不可接受的)。
我试过开启跟踪:
HsqlProperties p = new HsqlProperties();
p.setProperty("server.database.0", "db/TheDb");
p.setProperty("server.dbname.0", "TheDb");
p.setProperty("server.port", port);
p.setProperty("server.silent", "false");
p.setProperty("server.trace", "true");
Server server = new Server();
server.setProperties(p);
server.start();
结果如下:
: run() entered
...
: server.root=.
: openServerSocket() entered
: Got server socket: ServerSocket[addr=0.0.0.0/0.0.0.0,localport=37011]
: Server socket opened successfully in 6 ms.
: openServerSocket() exiting
: openDatabases() entered
: Opening database: [file:db/TheDb]
// Stuck here forever
数据库由以下文件组成:
$ ls
417028772 TheDb.backup
2147483608 TheDb.data
430165 TheDb.log
444 TheDb.properties
196938 TheDb.script
而.properties
文件目前如下:
#HSQL Database Engine 1.8.0.10
hsqldb.script_format=0
runtime.gc_interval=0
sql.enforce_strict_size=false
hsqldb.cache_size_scale=8
readonly=false
hsqldb.nio_data_file=true
hsqldb.cache_scale=14
version=1.8.0
hsqldb.default_table_type=cached
hsqldb.cache_file_scale=1
hsqldb.log_size=200
modified=no
hsqldb.cache_version=1.7.0
hsqldb.original_version=1.8.0
hsqldb.defrag_limit=50
hsqldb.compatible_version=1.8.0
.script
文件中未设置任何属性。 (对于其他成功升级的数据库,我确实注意到 props 大部分都从 .properties 移到了 .script 中)
我想知道是否还有其他人执行过类似的壮举,and/or 在 v2 之前的大型文件中看到了类似的行为。有没有办法在跟踪中有更多的可见性以识别加载数据文件时的问题?
提前致谢。
建议在使用版本 2.x 的数据库引擎打开数据库之前使用版本 1.8 执行 SHUTDOWN SCRIPT。使用此方法以版本 2.x 格式重新生成数据文件。这需要很长时间,但未来的创业会很快。