H2转储表仅内容

时间:2019-10-10 08:02:27

标签: h2

我尝试备份H2 DB的表内容。

我运行: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" /> 我不想改变这个;基本上是通过只保存数据库内容并将其还原到现有的db中:它应该起作用,不是吗?所以问题是我的SCRIPT语法有什么问题,尽管它不只是保存表的内容?

1 个答案:

答案 0 :(得分:1)

SCRIPT命令并非旨在仅导出数据,而是旨在导出包含或不包含数据的模式。当前没有用于此目的的内置命令。

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

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

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