首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Liquibase和LogLock表的创建在后期阶段没有失败已经执行的脚本

Liquibase和LogLock表的创建在后期阶段没有失败已经执行的脚本
EN

Stack Overflow用户
提问于 2020-04-22 08:19:21
回答 2查看 903关注 0票数 1

我有一个长时间运行的微服务,但几天前我们意识到,、自定义changelogchangeloglock表被错误地定义为()。见下文..。

代码语言:javascript
运行
复制
spring:
    liquibase:
        abc:
            change-log: classpath:/liquibase/changelog.yml
            database-change-log-table: CUSTOM_CHANGE_LOG
            database-change-log-lock-table: CUSTOM_CHANGE_LOG_LOCK

abc是在正确的路径之间添加的,我们已经执行了几乎18脚本,已经登录到主表DATABASECHANGELOGDATABASECHANGELOGLOCK中。

因此,如果我在下面以yml为单位更正路径

代码语言:javascript
运行
复制
spring:
    liquibase:
        change-log: classpath:/liquibase/changelog.yml
        database-change-log-table: CUSTOM_CHANGE_LOG
        database-change-log-lock-table: CUSTOM_CHANGE_LOG_LOCK

然后,它将继续和执行所有旧的18个脚本,这将导致失败。如何解决这个问题?

另外,我不确定它是否会自动创建自定义表,还是需要手动创建这些表?

任何对both the points的帮助都将不胜感激。如果您需要更多的详细信息,请发表评论

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-23 10:29:15

这个问题已经解决了。有两种方法可以运行任何手动脚本来完成这个w/o操作。但我更喜欢低于一个

我们将application.yml中不输入任何自定义表,而是在changelog中添加一个新查询。

changeset看起来会像这样

代码语言:javascript
运行
复制
- changeSet:
      id: your-id-here
      author: kunal-vohra
      #dbms: oracle #if you want it to run db specific then uncomment
      changes:
        - sqlFile:
            encoding: utf8
            path: ./liquibase/changes/sql-file-name.sql

sql-file-name.sql看起来就像

代码语言:javascript
运行
复制
declare
begin
  execute immediate 'CREATE TABLE CUSTOM_CHANGE_LOG AS SELECT * FROM DATABASECHANGELOG WHERE AUTHOR = ''kunal-vohra''';
  exception when others then
    if SQLCODE = -955 then null; else raise; end if;
    UPDATE CUSTOM_CHANGE_LOG  SET MD5SUM = null;
end;
/

在上面的查询中发生的情况是,如果表已经创建,那么它将不会创建新表,否则就会创建新表。

然后它放弃了所有的**HASH**

然后随着application.yml的变化,提出第二次公关

代码语言:javascript
运行
复制
spring:
    liquibase:
        change-log: classpath:/liquibase/changelog.yml
        database-change-log-table: CUSTOM_CHANGE_LOG
        database-change-log-lock-table: CUSTOM_CHANGE_LOG_LOCK

的主要好处是我们不必在PROD.上手动运行任何东西。

如果您想在一个PR中执行上述操作,的另一个方法是,只需将changeset移动到文件的顶部而不是下面。

票数 0
EN

Stack Overflow用户

发布于 2020-04-22 09:33:33

如果我正确理解你的问题,有两种选择:

  1. preConditions写到现有的changeSets中,并指定onFail="MARK_RAN“属性。这样,您的所有changeSets都将在preConditions上失败,并将在CUSTOM_CHANGE_LOG表中标记为RAN。您的应用程序将启动successfully.
  2. Specify CUSTOM_CHANGE_LOG表并从databasechangelog.

复制所有数据。

从表到表复制数据的ChangeSet可能如下所示:

代码语言:javascript
运行
复制
<changeSet id="foo" author="bar">
    <preConditions onFail="MARK_RAN">
        <tableExists tableName="databasechangelog"/>
        <tableExists tableName="CUSTOM_CHANGE_LOG"/>
        <sqlCheck expecterResult="0">
            SELECT COUNT(*) FROM databasechangelog; 
        </sqlCheck>
    </preConditions>
    <sql>
        INSERT INTO CUSTOM_CHANGE_LOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID)
        SELECT ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, EXECTYPE, MD5SUM, DESCRIPTION, COMMENTS, TAG, LIQUIBASE, CONTEXTS, LABELS, DEPLOYMENT_ID
        FROM databasechangelog
    </sql>
</changeSet>

这个changeSet应该是应用程序启动时第一个执行的。因此,您应该将这个changeSet放在changeLog中的所有其他changeSets之前。在复制所有数据之后,液化库应该将所有现有的changeSets处理得像它们已经执行一样。

我会使用选项1,因为您的changeSets无论如何都应该有preConditions。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61360388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档