【问题标题】:False "CREATE SEQUENCE" lines of h2 SCRIPT commandh2 SCRIPT 命令的错误“CREATE SEQUENCE”行
【发布时间】:2019-08-31 14:28:41
【问题描述】:

在我的 java 应用程序中,我使用 SCRIPT 命令备份某些表。当我尝试将此生成的备份脚本还原到现有数据库中时,出现错误

Sequence "SYSTEM_SEQUENCE_6DBC2231_8C34_46B3_9CB9_2BC9E42CECA2" already exists

似乎“SCRIPT”命令正在为数据库中的每个系统序列生成一个“CREATE SEQUENCE”行。不仅适用于选择备份的表的序列,而且适用于所有表的所有序列。因此,在恢复时,备份脚本会尝试为未触及的表创建序列并失败。当然。

这是 SCRIPT 命令中的错误还是我遗漏了什么?

【问题讨论】:

    标签: java h2


    【解决方案1】:

    GitHub 上也有人问过这个问题: #2094。 这是我提到的问题中我的一些 cmets 的副本,供其他读者使用:

    SCRIPT 不是备份命令,它是数据/元数据导出命令。但是,您可以将其用于备份目的。但是你需要一个新的空数据库来加载这样的脚本。

    它根据设计从所有模式或仅从指定模式导出所有序列。

    1. 您可以使用SCRIPT 命令的DROP 子句。使用此子句,附加的DROP TABLE 命令将包含在此类脚本中。 DROP TABLE 命令还会删除自动创建的生成列序列。

    2. 您可以在RUNSCRIPT 命令之前执行DROP ALL OBJECTS 命令。

    3. 你可以关闭所有连接,删除数据库,新建一个并执行其中的RUNSCRIPT

    【讨论】:

    • 但是我怎样才能备份和恢复一个表呢?
    • 备份过程是针对整个数据库的。但是,您可以尝试使用SCRIPT NOSETTINGS DROP TABLE tableName TO 'fileName.sql'。它导出用户(带有IF NOT EXISTS 子句)、指定表的删除命令、为其创建表语句及其数据。您还可以指定多个用逗号分隔的表。
    • 即使使用“NOSETTINGS”,SCRIPT 命令仍会导出所有表的所有序列。
    • 我的解决方案是将备份脚本导入新数据库。然后 - 在原始数据库中 - 我将备份的表与 CREATE LINKED TABLE 链接。最后我删除原表中的所有行并将链接表数据复制到原表中:INSERT INTO backedup_table AS (SELECT * FROM linked_table)
    【解决方案2】:

    我不认为这是SCRIPT 命令中的错误,正如它所说...

    从数据库创建一个 SQL 脚本。

    因此,当您第一次创建序列时,请确保它不会创建序列,如果它存在类似下面的内容。

    CREATE SEQUENCE IF NOT EXISTS

    然后SCRIPT 命令应该在备份脚本时复制相同的内容。

    【讨论】:

    • IF NOT EXISTS 子句不保留,它只影响命令的当前执行。
    • 错误是 SCRIPT 导出所有表的所有自动生成的序列。即使您只选择了某些表格。这使得恢复到同一个数据库是不可能的。因为未导出表的序列已经存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多