我有一个长时间运行的微服务,但几天前我们意识到,、自定义、changelog
和changeloglock
表被错误地定义为()。见下文..。
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脚本,已经登录到主表DATABASECHANGELOG
和DATABASECHANGELOGLOCK
中。
因此,如果我在下面以yml为单位更正路径
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
的帮助都将不胜感激。如果您需要更多的详细信息,请发表评论
发布于 2020-04-23 10:29:15
这个问题已经解决了。有两种方法可以运行任何手动脚本来完成这个w/o操作。但我更喜欢低于一个
我们将在application.yml
中不输入任何自定义表,而是在changelog中添加一个新查询。
changeset
看起来会像这样
- 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
看起来就像
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
的变化,提出第二次公关
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
移动到文件的顶部而不是下面。
发布于 2020-04-22 09:33:33
如果我正确理解你的问题,有两种选择:
preConditions
写到现有的changeSets中,并指定onFail="MARK_RAN“属性。这样,您的所有changeSets都将在preConditions
上失败,并将在CUSTOM_CHANGE_LOG
表中标记为RAN。您的应用程序将启动successfully.CUSTOM_CHANGE_LOG
表并从databasechangelog
.复制所有数据。
从表到表复制数据的ChangeSet可能如下所示:
<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。
https://stackoverflow.com/questions/61360388
复制相似问题