openfire 使用的嵌入式数据库是 Hsqldb,用 Java 编写。Openfire 有一种迁移指南,但它并不完全完整。首先,那里提到的程序 hsqldb-transfer 是:
- 一个 GUI 程序...
- 必须以与 hsqldb 数据库所有者相同的用户身份运行。读写权限不足?!
如果 openfire 在没有图形的服务器上运行,这意味着:
- 关闭机器一上的服务器
- 将 Path-To/embedded-db 复制到机器二上的(离线)openfire 安装,该机器恰好也有图形和与机器一相同的 openfire 设置(相同的插件、版本等)
- 在机器二上启动 openfire
- 重新启动安装向导以便识别复制的数据库
- 关闭机器二上的 openfire
- 将第二台机器上运行 openfire 的用户“升级”为完全成熟的人类用户
- 以 openfire 用户身份登录
- ...但由于 openfire 已关闭,数据库现在不在磁盘上...这意味着
- 运行 hsqldb-transfer 来传输数据库
不起作用。
在指南中,使用了 URL jdbc:hsqldb:Path-To/embedded-db/openfire。问题是:有时该文件在那里,有时不在。就我而言:星期一我在没有关闭机器一上的 openfire 的情况下进行试运行时它在那里,今天我关闭 openfire 时它不见了。
(我成功试运行的下一步是:
- 在传输过程中,动态更改新服务器不支持的数据类型,因为 hsqldb-transfer 本身无法在 sql 方言之间进行映射
- 在外部 sql-server 上手动运行数据库更改以获取所需版本(很容易,因为现有版本在表版本中)。我从 3.5.2 升级到 3.6.4...
- 转储该数据库的内容并在超级 SQL Server 机器三上进行导入,该机器是全新的
- 在机器四上设置 openfire,这台机器还没有老到崩溃,可以使用三上的外部数据库
- 利润!
)
如何获得离线、未更新的数据库副本以便 hsqldb-transfer 可以使用它?
答案1
这是一种蹩脚的方法,但如果您在离线时找不到该文件(我无法解释):
只要备份期间没有发生检查点,您就可以备份活动的 hsqldb。每次日志文件填满时都会发生检查点。嵌入式数据库的属性文件中有一个设置:
hsqldb.log_size=50
(单位:兆——50M)
只要日志文件在实时数据库文件的文件复制期间没有达到该大小,文件就会保持一致。日志文件中的任何内容都尚未写入数据库。如果您可以在非工作时间执行此操作,则可以获得相当不错的转储文件。
所以..您可以终止任何活动会话,执行文件复制,关闭服务器,然后从那里继续。