
本文介绍如何通过 java jdbc 调用 hsqldb 内置 sql 命令(如 perform export script for table ... data),精准备份与恢复指定表的完整结构(ddl)和数据(dml),避免全库备份,满足精细化数据迁移与测试场景需求。
本文介绍如何通过 java jdbc 调用 hsqldb 内置 sql 命令(如 perform export script for table ... data),精准备份与恢复指定表的完整结构(ddl)和数据(dml),避免全库备份,满足精细化数据迁移与测试场景需求。
HSQLDB 提供了轻量、原生的 SQL 级数据导出/导入能力,无需依赖外部工具或序列化框架。核心在于使用其专为单表设计的管理命令:
- PERFORM EXPORT SCRIPT FOR TABLE table_name DATA
导出指定表的 CREATE TABLE 语句 + INSERT 语句(含所有数据),结果为标准 SQL 脚本(.sql 文件); - PERFORM IMPORT SCRIPT DATA FROM 'path/to/file.sql'
执行脚本文件,重建表结构并插入全部数据(要求目标库中表不存在或已清空,否则可能因主键冲突失败)。
以下是一个完整的 Java 示例,展示如何批量导出多个表并安全导入:
import java.sql.*;
public class HsqldbTableBackup {
private static final String DB_URL = "jdbc:hsqldb:file:mydb;shutdown=true";
private static final String USER = "SA";
private static final String PASSWORD = "";
// ✅ 导出指定表为 SQL 脚本(含 DDL + DML)
public static void exportTables(Connection conn, String... tableNames) throws SQLException {
try (Statement stmt = conn.createStatement()) {
for (String table : tableNames) {
String exportSql = String.format(
"PERFORM EXPORT SCRIPT FOR TABLE %s DATA TO 'backup_%s.sql'",
table, table.toLowerCase()
);
stmt.execute(exportSql);
System.out.println("✅ Exported table '" + table + "' to backup_" + table.toLowerCase() + ".sql");
}
}
}
// ✅ 导入指定 SQL 脚本(需确保表不存在或已清理)
public static void importTableData(Connection conn, String scriptPath) throws SQLException {
try (Statement stmt = conn.createStatement()) {
String importSql = String.format("PERFORM IMPORT SCRIPT DATA FROM '%s'", scriptPath);
stmt.execute(importSql);
System.out.println("✅ Imported data from " + scriptPath);
}
}
public static void main(String[] args) throws SQLException {
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASSWORD)) {
// 导出 12 个关键表(示例)
exportTables(conn, "users", "orders", "products", "settings");
// 恢复时可选择性执行(注意:目标表应不存在,或先执行 DROP TABLE IF EXISTS)
importTableData(conn, "backup_users.sql");
}
}
}⚠️ 重要注意事项:
- 事务与锁:PERFORM EXPORT SCRIPT 在执行期间会对源表加读锁,建议在低峰期操作;导出过程非事务性,但数据一致性由 HSQLDB 快照保证(基于 MVCC)。
- 路径权限:HSQLDB 默认以 JVM 工作目录为基准解析文件路径;若使用绝对路径,请确保数据库进程有读写权限(如 C:/backups/ 或 /opt/db/backup/)。
- 导入前提:IMPORT SCRIPT DATA 不会自动创建表——它仅执行脚本中的 CREATE TABLE 和 INSERT。因此,若目标库中表已存在,需提前 DROP TABLE IF EXISTS table_name,否则 CREATE TABLE 将报错。
- 字符编码:导出的 .sql 文件默认为 UTF-8;Java 中若需读取/修改脚本内容,请显式指定编码(如 Files.readString(path, StandardCharsets.UTF_8))。
- 兼容性:该方案适用于 HSQLDB 2.0+(推荐 2.7.2+),不兼容 1.8.x 版本。
✅ 总结:相比全库 .tar.gz 备份,EXPORT SCRIPT FOR TABLE ... DATA 是面向开发与测试场景的理想方案——它粒度可控、格式标准(纯 SQL)、零外部依赖,且天然支持跨版本、跨环境的数据同步。合理封装上述逻辑后,可轻松集成至 CI/CD 流程或自动化测试数据准备环节。
立即学习“Java免费学习笔记(深入)”;










