仅 H2 转储表内容

H2 dump tables content only

我尝试备份 H2 数据库的表内容。

I 运行 : SCRIPT TO '/opt/data/2019-10-10_tr.sql' TABLE EVENEMENT, PASSAGE, COURSE, LIGNE 但生成的文件包含一些信息,如 :

SET DB_CLOSE_DELAY -1;         
;              
CREATE USER IF NOT EXISTS SA SALT '7ab09337026fac20' HASH    'c...fa387' ADMIN;            
CREATE SEQUENCE PUBLIC.HIBERNATE_SEQUENCE START WITH 5664;     
CREATE MEMORY TABLE PUBLIC.COURSE(
...

这是我不想要的(这就是我只想转储表格的原因)。我不想要它们,因为当我 运行 RUNSCRIPT FROM '/opt/data/2019-10-10_tr.sql' 我有一个例外:

CREATE SEQUENCE PUBLIC.HIBERNATE_SEQUENCE START WITH 5664 [90035-197]: org.h2.jdbc.JdbcSQLException: Sequence "HIBERNATE_SEQUENCE" already exists; SQL statement:
CREATE SEQUENCE PUBLIC.HIBERNATE_SEQUENCE START WITH 5664 [90035-197]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)

我有这个异常,因为数据库是由 ddl 初始化的:<property name="hibernate.hbm2ddl.auto" value="create-drop" /> 我不想改变这个;基本上通过仅保存数据库内容并将其恢复到现有数据库中:它应该可以工作,不是吗?所以问题是我的 SCRIPT 语法有什么问题,尽管它不只保存表格内容?

SCRIPT 命令并非设计用于仅导出数据,它设计用于导出包含或不包含数据的架构。目前没有用于该目的的内置命令。

您可以尝试将 ˙DROP˙ 子句添加到此命令以生成用于删除现有表的命令,但您仍然可能遇到序列问题并且您的表将被重新定义,因此自动生成的模式中的所有更改都将是迷路了。

您可以使用自己的代码从脚本中过滤掉所有非INSERT命令。

您可以导出完整的脚本并在 RUNSCRIPT 之前执行 DROP ALL OBJECTS 并用它覆盖所有内容。