0

我正在尝试使用 H2 恢复脚本(H2 v.1.4.199,以及 .197 和 .200)恢复似乎已损坏的 H2 数据库,如下所示:

java -cp h2-1.4.200.jar org.h2.tools.RunScript -url "jdbc:h2:file:./testdb_recovered" -user test -password test -script testdb.h2.sql -showResults

出现以下错误:

CREATE CACHED TABLE PUBLIC.VECTORS_DATA(
    ID BIGINT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_08DF5748_291A_46FD_9B83_818A3975DAF2) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_08DF5748_291A_46FD_9B83_818A3975DAF2 SELECTIVITY 100,
    NAME VARCHAR(256) NOT NULL SELECTIVITY 1,
    WIDTH INT SELECTIVITY 1,
    HEIGHT INT SELECTIVITY 1,
    DATA_SIZE INT SELECTIVITY 4
);Exception in thread "main" org.h2.jdbc.JdbcSQLSyntaxErrorException: Sequence "SYSTEM_SEQUENCE_08DF5748_291A_46FD_9B83_818A3975DAF2" not found; SQL statement:

CREATE CACHED TABLE PUBLIC.VECTORS_DATA(
    ID BIGINT DEFAULT (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_08DF5748_291A_46FD_9B83_818A3975DAF2) NOT NULL NULL_TO_DEFAULT SEQUENCE PUBLIC.SYSTEM_SEQUENCE_08DF5748_291A_46FD_9B83_818A3975DAF2 SELECTIVITY 100,
    NAME VARCHAR(256) NOT NULL SELECTIVITY 1,
    WIDTH INT SELECTIVITY 1,
    HEIGHT INT SELECTIVITY 1,
    DATA_SIZE INT SELECTIVITY 4
) [90036-199]

“VECTORS_DATA”表对应于 Spring 项目中使用的 Java 实体:

@Entity
@Table(name = "vectors_data")
public class VectorData {

  /**
   * Database id.
   */
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  /**
   * Vector's data byte array.
   */
  @javax.persistence.Transient
  private byte[] data;

  /**
   * Vector's data byte array size. Used for persistency.
   */
  @Column(name = "dataSize")
  private int dataSize;

  /**
   * Vector's width in internal units.
   */
  @Column(name = "width")
  private int widthInternalUnit;

  /**
   * Vector's height in internal units.
   */
  @Column(name = "height")
  private int heightInternalUnit;

  /**
   * Vector's name.
   */
  @Column(name = "name")
  private String name;

H2 代码状态表明正在尝试访问一个不存在的序列。我不确定如何继续,尽管我尝试使用多个版本来恢复它,但没有帮助。有没有办法更有效地调试恢复过程?因为我认为实体本身没有问题。谢谢!

4

1 回答 1

0

经过一番挣扎,我找到了解决办法。由于 H2 抱怨找不到序列,我打开生成的 SQL 文件,找到了创建问题表的代码块(VectorData)。在其上方添加了一行,该行创建了导致错误的序列,如下所示:

CREATE SEQUENCE <sequence_name>;

运行命令以创建一个数据库:

java -cp h2-1.4.200.jar org.h2.tools.RunScript -url "jdbc:h2:file:./testdb_recovered" -user test -password test -script testdb.h2.sql -showResults

通过 IntelliJ 启动配置,瞧,数据就在那里。

于 2021-11-08T08:26:42.490 回答