【问题标题】:Upgrade problem with h2 database when upgrading from 192 to 200 : Scale must not be bigger than precision从 192 升级到 200 时 h2 数据库的升级问题:比例不得大于精度
【发布时间】:2020-11-07 11:47:30
【问题描述】:

几年前,我编写了一个应用程序来将数据捕获到 H2 数据文件中,以便于传输和归档。该应用程序是使用 H2 1.4.192 编写的。

最近,我一直在重新审视与该应用程序相关的一些加载代码,我发现我在 H2 1.4.200 中所做的一些事情有一些实质性的收获。

我希望能够加载我之前保存到其他数据库的数据。但是我有一些表使用了现在无效的精度比例规范。这是一个例子:

创建缓存表 PUBLIC.MY_TABLE(MY_COLUMN DATETIME(23,3) SELECTIVITY 5)

使用 1.4.192 创建的包含此类表的 H2 数据库不会在 1.4.200 上加载, 他们将收到以下错误:

Scale($"23") 不能大于precision({1}); SQL 语句: 创建缓存表 PUBLIC.MY_TABLE(MY_COLUMN DATETIME(23,3) SELECTIVITY 5) [90051-200] 90051/90051(帮助)

我的问题是如何纠正无效的表架构?我的应用程序利用到 H2 数据库的连接,然后将它包含的数据加载到另一个数据库中。理想情况下,我希望我的应用程序能够检测到这种情况并自动修复它,以便应用程序可以简单地利用旧数据文件。但在 H2 1.4.200 中,我在连接时立即收到错误。

是否有秘密/特殊模式允许我将 1.4.200 连接到数据库以修复其架构?我希望???

除此之外,似乎我唯一的选择是为不同版本的 H2 提供单独的类加载器,并在一个类加载器中进行补救操作,而加载操作在另一个类加载器中进行。要么启动另一个 JVM 实例来执行补救操作。

我想在做大量工作之前检查选项。

此问题与this 报告的问题类似,但没有具体说明他是如何解决的。

【问题讨论】:

    标签: h2


    【解决方案1】:

    此数据类型无效且 H2 从未支持,但旧 H2 由于错误,以某种方式接受了它。

    1. 您需要使用 1.4.192 Beta 将数据库导出到脚本
    SCRIPT TO 'source.sql'
    

    您需要使用原始数据库文件,因为如果您使用 1.4.200 打开 1.4.192 Beta 的文件,它可能会被它损坏,不支持这种自动升级。

    1. 您需要将DATETIME(23,3) 替换为TIMESTAMP(3) 或任何您需要的文本编辑器。如果导出的 SQL 对于常规文本编辑器来说太大,您可以使用流编辑器,例如sed
    sed 's/DATETIME(23,3)/TIMESTAMP(3)/g' source.sql > fixed.sql
    
    1. 现在您可以使用 1.4.200 创建一个数据库并将编辑后的脚本导入其中:
    RUNSCRIPT FROM 'fixed.sql'
    

    【讨论】:

    • 这是一个伟大的贡献。到目前为止,我完成了一个序列,我用 1.4.192 加载数据库并执行 alter table MY_TABLE alter column MY_COLUMN datetime;然后编写脚本并使用 1.4.200 加载。但是在体验了加载具有 5 个这样的列的 3GB 数据库之后,我怀疑您的方法最终可能会快得多,因为它涉及一次数据传递。谢谢。
    • 额外问题:有没有办法让 SCRIPT TO 'source.sql' 脚本到输出流,而不仅仅是使用 H2 api 到文件?如果我可以将输出脚本修复为它正在输出的数据——它将使处理这些较大的文件更加有效。我正在寻找但不太了解编程 API ...
    • 好的,我发现我可以这样做:ResultSet rs = st.executeQuery("SCRIPT");并可以通过该机制流式传输结果
    • 是的,你可以那样做,但是在升级过程中你仍然需要使用不同版本的H2。需要旧版本读取旧数据库文件,新版本创建新文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    相关资源
    最近更新 更多