使用hsqldb 官方工具管理内嵌hasqldb——备份、恢复和可视化管理
由于工作要求:
在内嵌hsqldb数据库的java应用程序中,提供备份、恢复和可视化管理
三个功能的脚本程序,通过shell脚本触发。
通过官方文档:DbBackupMain API, DatabaseManagerSwing API 可通过上述API实现。
方案如下:
- 备份
- 离线模式
通过文件copy方式 - 在线模式
stmt.executeupdate("BACKUP DATABASE TO + destFilegetAbsolutePath() + "/' BLOCKING NOT COMPRESSED")
- 离线模式
- 恢复
- 利用DbBackupMain API
- 可视化
- 利用DatabaseManagerSwing API
前提
定义静态变量,url, username, password等
private static final String SWING_CLASS_NAME = "org.hsgldb.util.DatabaseManagerSwing";
private staticfinal String BACKUP_CLASS_NAME= "org.hsgldb.lib.tar.DbBackupMain";
private static String USER = "APP;
private static String PASSWORD ="APP":
private static DRIVER ="org.hsqldb.jdbc.JDBCDriver";
// test 为数据库名称
private static String URL="jdbc:hsqldb:file:/db/system/test";
备份工具
-
离线备份
if (offline) {FileUtils.copyDirectoryAbsolutely(srcFile,destFile)}
离线仅需要把生成的数据库文件(.script、.lobs、.logs)copy到destFile即可
-
在线备份
private void backup() { // name: 数据库生成的script文件名称 String name = test.script; String url = "jdbc:hsgldb:file:" + "jdbc:hsqldb:file:/db/system/" + namesubstring(0, name.index0f(".script")) conn = DriverManager.getConnection(url,USER,PASSWORD); stmt = conn.createStatement(); // destFile: 备份的目的地目录 stmt.executeupdate("BACKUP DATABASE TO'" + destFile.getAbsolutePath() + "/' BLOCKING NOT COMPRESSED") conn.commit(); }
在线模式,则是通过执行
BACKUP DATABASE
命令来执行备份动作。备份完成后会生成.tar文件,格式如 test-20221103T123921.tar
恢复工具
通过官方APIDbBackupMain
实现。
实现方法:
private void restore() {
String[] args = new Stringl[] {"--extract", "--overwrite", files[0].getAbsolutePath(), destFile.getAbsolutePathiclass};
Clazz clazz = getclassLoader().loadClass(BACKUP_CLASS_NAME);
// call main method of org.hsgldb.lib.tar.DbBackupMain
Method main = clazz.getDeclaredMethod( "main",String[].class);
main.invoke(null, args) ;
}
通过执行org.hsgldb.lib.tar.DbBackupMain 类中的main方法来执行备份。
可视化管理工具
- 通过官方API
DatabaseManagerSwing
实现。
- 谷歌翻译参数如下:
- 实际使用:
private void ui () {
String[] args = new String[]["--driver",driver,"--url", url,"--user", username."--password",password};
class clazz = getclassLoader().loadClass(SWING_CLASS_NAME);
// call main method of org.hsgldb.util.DatabaseManagerSwing
Method main = clazz.getDeclaredMethod("main",String[].class);
main.invoke( null, args) ;
}
shell 脚本
BASE= `dirname "$0"`
CLASSPATH="${CLASSPATH}:$BASE/lib/*";
"SJAVA" $JAVA_OPTS -cp "$CLASSPATH" com.test.hsql.utils.tools.DBToolManager
java 入口
public static void main(Stringl args) throws Exception {
String op = args.get("OPERATION");
switch(op) {
case "backup":
backup(args);
break;
case "restore":
restore(args);
break;
case "ui":
ui(args);
break;
default:
throw new UnsupportTypeException("Un support operation: "+ op)
}
}
可视化管理工具遇到的问题
-
1、出现
javaawt HeadlessException: NoX11 DISPLAY
异常Caused by: javaawt HeadlessException : NoX11 DISPLAY variable was set, but this program performed an operation which requires it
- 解决方法:
设置DISPLAY属性:格式:windowsIP:0.0
, 如: 199.167.253.147:0.0
export DISPLAY=199.167.253.147:0.0
- 解决方法:
-
2、出现
java.lang.UnsatisfiedLinkError:
异常
- 解决方法:
缺少依赖等,需要安装相关rpm包。如下:
yum -y install xorg-x11-xauth xorg-x11-server-utils xorg-x11-server-Xnest libXtst
- 解决方法:
-
3、修复以上问题后,还打不开可视化管理工具
可取消设置shell 窗口的X11转发方式。如下:可取消勾选X11转发模式。尝试是否能打开。
-
4、若上述问题都修复,正常打开hsqldb可视化管理工具,
未展示初始化创建的表
最可能的原因:是因为数据库名称没对应。
因为hsql默认会生成一个名称为
system
的数据库,而笔者这里创建指定的数据库名称为test
,那么实际生成的数据库配置文件中存在system
和test
两个数据库,查看链接url中数据库是否为你所需要的。