liquibase 相关问题

Liquibase是一个独立于数据库的开源库,用于跟踪,管理和应用数据库更改。它建立在一个简单的前提上:所有数据库更改都以人类可读但可跟踪的形式存储,并检入源代码控制。

liquibase 使用 LIKE 子句更新 where

我想在 liquibase 更新中添加 LIKE 子句。已经做了类似的事情,但似乎无法正常工作: ...

回答 1 投票 0

Liquibase 校验和验证错误,没有任何更改

即使在变更集中没有进行任何更改,Maven 也会引发 liquibase 验证失败。 我的数据库是oracle。 情况: 在数据库变更日志表中记录了变更集 即使变更集中没有进行任何更改,Maven 也会引发 liquibase 验证失败。 我的数据库是oracle。 情况: 在数据库变更日志表中记录了变更集<changeSet id="1" author="me" dbms="oracle">; 然后我错误地添加了另一个变更集<changeSet id="1" author="me" dbms="hsqldb"> 重新运行 liquibase 脚本 Maven 引发校验和验证错误。 然后我将 hsqldb changeSet 更改为 <changeSet id="2" author="me" dbms="hsqldb"> Maven 仍然引发校验和验证错误。 然后我手动将数据库中的第一个changeSet校验和更改为当前checkSum并且脚本成功运行。 一切看起来都不错,但是当我重新部署整个应用程序并运行 liquibase 脚本时,第一个变更集的校验和仍然像第 6 步之前一样。 如果您确信您的脚本正确反映了数据库中“应该”的内容,请运行 liquibase:clearCheckSums maven 目标,这将清除所有内容。 这里的每个人都在讨论如何解决这个问题,但让我分享一个可能发生在您身上的典型场景。 简短回答:由于某种原因更改行分隔符可能会导致校验和验证错误,并且在代码中不可见 变化。 为什么它会发生在我身上?请阅读下文.. 假设你有一台tomcat服务器,时不时会有多人参与WAR部署。每个人都在 LINUX 上使用 INTELLIJ IDEA,但其中一位团队成员由于某种原因切换到 WINDOWS。 现在,当 WINDOWS 人员创建 WAR 时,他可能没有注意到 INTELLIJ IDEA for WINDOWS 中的默认行分隔符选择是 CRLF,但所有以前的版本都是从使用 LF 行分隔符的 LINUX 机器构建的。 行分隔符的更改会影响所有文本文件,其中也包括 SQL 文件。所以你可能在你的 liquibase 脚本中像我的团队一样使用了以下内容 changeSet(author: "aditya", id: "1335831637231-1") { sqlFile( path: "liquibase/quartz_oracle_tables.sql", "stripComments": true) } 并且文件的校验和与数据库中已存储的校验和不匹配,从而引发校验和验证错误。 就我而言,我忘记了Liquibase将所有变更日志写入数据库表。 转到 DATABASECHANGELOG 表并手动删除更改日志。 Liquibase 读取 databasechangelog 表来验证最近的更改。 因此,找出导致问题的 databasechangelog id 并将其删除,如下所示:select * from myschema.DATABASECHANGELOG; Delete from myschema.DATABASECHANGELOG where ID='prob_id'; 删除 Liquibase 中的错误变更日志 当我在解决这个问题时,我想让有同样问题的人变得更容易: 重要!,liquibase 有一个 liquibase 有一个 changlog.xml 文件 在 maven pom.xml 上放置以下属性。 <project ...> <plugins> <plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>*****</version> <configuration> <changeLogFile>src/main/resources/mychangelogfile.xml</changeLogFile> <driver>oracle.jdbc.driver.OracleDriver</driver> <url>jdbc:oracle:thin:@//X.X.X.X:PORT/XE</url> <username>yourusername</username> <password>password</password> </configuration> <executions> <execution> <goals> <goal>clearCheckSums</goal> </goals> </execution> </executions> </plugin> </plugins> </project> **** 我用的版本是3.2.0 在 url 中替换为正确的 IPADDRESS 和 PORT。 你终于跑了mvn liquibase:clearCheckSums 希望有帮助! liquibase 文档现在有第二个选项 The <validCheckSum> attribute The second option is to add a <validCheckSum> element to the changeset. The text contents of the element should contain the old checksum from the error message. 假设您很少需要更改历史变更日志 XML 文件,那么您很少会收到错误消息。如果您收到错误消息,请添加一个带有旧校验和的标签,确认没有问题。 示例: <changeSet id="example" author="former-author" runOnChange="false"> <validCheckSum>8:869....4e3</validCheckSum> <addColumn tableName="ye_olde_db_table"> <!-- fix some old typo or incompatibility, etc --> </addColumn> </changeSet> 在maven插件中配置liquibase的数据库链接信息。 像这样: <plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>${liquibase.version}</version> <configuration> <changeLogFile>${project.basedir}/src/main/resources/config/liquibase/master.xml</changeLogFile> <driver>com.mysql.cj.jdbc.Driver</driver> <url>jdbc:mysql://localhost:3306/hos_gateway</url> <username>root</username> <password>root</password> <referenceUrl>hibernate:spring:com.hos.physician.domain?dialect=org.hibernate.dialect.MySQL5InnoDBDialect&amp;hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&amp;hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy</referenceUrl> <verbose>true</verbose> <logging>debug</logging> <contexts>!test</contexts> </configuration> </plugin> 变更集 ID 不应重复。提供一个新的变更集 ID 并尝试,它应该可以工作。 <changeSet id= 就我而言,changelog.yml 文件的 ID 不正确。 数据库更改日志: 更改集: ID:1.0.xx 对于出现此错误的新手,我是在严重升级到 Spring Boot 3 和 Liquibase 从 4.19 升级到 4.9 版本后遇到的。更改日志中没有任何更改。 Liquibase 网站上的这篇文章描述了问题和可能的解决方案,我强烈推荐它:https://docs.liquibase.com/concepts/changelogs/changeset-checksums.html 干杯, 德米特里。

回答 10 投票 0

Liquibase 关于 Oracle 12c 中 SYS.DBA_RECYCLEBIN 的警告

我最初的更改集是: 我最初的更改集是: <changeSet id="1.2.0-01" author="Arya"> <createIndex tableName="org_message" indexName="ix_org_message_userid_peerid"> <column name="user_id"/> <column name="peer_id"/> </createIndex> </changeSet> 执行成功,没有任何警告。 然后我从 1.2.0-01 表中删除了已执行的 DATABASECHANGELOG 记录(注意:创建的索引仍然存在),并向变更集添加了 indexExists 前提条件: <changeSet id="1.2.0-01" author="Arya"> <preConditions onFail="MARK_RAN"> <not> <indexExists indexName="ix_org_message_userid_peerid"/> </not> </preConditions> <createIndex tableName="org_message" indexName="ix_org_message_userid_peerid"> <column name="user_id"/> <column name="peer_id"/> </createIndex> </changeSet> 在执行中,我看到了这个日志: JdbcDatabaseSnapshot$CachingDatabaseMetaData -|液体碱需要 访问 DBA_RECYCLEBIN 表,以便我们可以自动处理 删除和恢复约束的情况。由于 Oracle 没有 正确恢复引用的原始表名 约束,我们使用 DBA_RECYCLEBIN 中的信息来 自动纠正此问题。 您用来连接数据库的用户(ORG_PLATFORM)需要 在我们可以之前设置“SELECT ON SYS.DBA_RECYCLEBIN”权限 执行此操作。请运行以下 SQL 来设置 适当的权限,然后尝试再次运行该命令。 GRANT SELECT ON SYS.DBA_RECYCLEBIN TO ORG_PLATFORM; 但是更改集已成功执行:带有“MARK_RAN”的1.2.0-01记录已添加到DATABASECHANGELOG表中。 此警告是应该修复的重要问题还是只是默认日志记录(如 CORE-2940 问题中提到的)?我正在使用 liquibae 3.8.9 和 oracle 12c。 这是一个您可以忽略的警告。您可以使用以下属性禁用警告: liquibase.oracle.ignoreRecycleBin=true 没有让它工作,检查了最新的liquibase,看起来应该是: liquibase.ignoreRecycleBinWarning=true

回答 2 投票 0

Liquibae 关于 Oracle 12c 中 SYS.DBA_RECYCLEBIN 的警告

我最初的更改集是: 我最初的更改集是: <changeSet id="1.2.0-01" author="Arya"> <createIndex tableName="org_message" indexName="ix_org_message_userid_peerid"> <column name="user_id"/> <column name="peer_id"/> </createIndex> </changeSet> 执行成功,没有任何警告。 然后我从 1.2.0-01 表中删除了已执行的 DATABASECHANGELOG 记录(注意:创建的索引仍然存在),并向变更集添加了 indexExists 前置条件: <changeSet id="1.2.0-01" author="Arya"> <preConditions onFail="MARK_RAN"> <not> <indexExists indexName="ix_org_message_userid_peerid"/> </not> </preConditions> <createIndex tableName="org_message" indexName="ix_org_message_userid_peerid"> <column name="user_id"/> <column name="peer_id"/> </createIndex> </changeSet> 在执行中,我看到了这个日志: JdbcDatabaseSnapshot$CachingDatabaseMetaData -|液体碱需要 访问 DBA_RECYCLEBIN 表,以便我们可以自动处理 删除和恢复约束的情况。由于 Oracle 没有 正确恢复引用的原始表名 约束,我们使用 DBA_RECYCLEBIN 中的信息来 自动纠正此问题。 您用来连接数据库的用户(ORG_PLATFORM)需要 在我们可以之前设置“SELECT ON SYS.DBA_RECYCLEBIN”权限 执行此操作。请运行以下 SQL 来设置 适当的权限,然后尝试再次运行该命令。 GRANT SELECT ON SYS.DBA_RECYCLEBIN TO ORG_PLATFORM; 但是变更集已成功执行:带有“MARK_RAN”的1.2.0-01记录已添加到DATABASECHANGELOG表中。 此警告是应该修复的重要问题还是只是默认日志记录(如 CORE-2940 问题中提到的)?我正在使用 liquibae 3.8.9 和 oracle 12c。 这是一个您可以忽略的警告。您可以使用以下属性禁用警告: liquibase.oracle.ignoreRecycleBin=true 没有让它工作,检查了最新的liquibase,看起来应该是: liquibase.ignoreRecycleBinWarning=true

回答 2 投票 0

Spring boot r2dbc 和 jdbc Liquibase 不会在应用程序启动时更新

我希望我的应用程序在运行时使用 r2dbc 驱动器,并使用 jdbc 使用 Liquibase 处理数据库。我有这个作为参考。可以通过在应用程序内添加正确的配置来实现。

回答 1 投票 0

Quarkus liquibase postgres 更新分配大小序列

我尝试使用 quarkus postgres 和 liquibase 按值(allocationSize)更新实体的增量,问题是抛出错误,这些值不一致 我用来更新序列的脚本

回答 1 投票 0

liquibase 无法在数据库中执行变更集

我无法弄清楚为什么没有任何变更集被执行并反映在数据库中。 我也提到了这个链接,它也有同样的问题,不幸的是这篇文章没有答案。 在

回答 2 投票 0

Liquibase Java,变更集不适用

我目前正在为我的实习构建一个项目,两天来我试图在java中使用Liquibase,但我陷入了困境。一切似乎都正确:找到了变更日志文件,正确的 URI、用户名和密码...

回答 6 投票 0

如何使用 Liquibase 定义具有升序/降序列的表索引,最后为空

使用原生查询 如果索引不存在则创建索引 ON public.table 使用 btree (列 1 ASC NULLS 最后,列 2 ASC NULLS LAST); 如何使用 Liquibase 定义类似索引? 使用原生查询 CREATE INDEX IF NOT EXISTS index ON public.table USING btree (column1 ASC NULLS LAST, column2 ASC NULLS LAST); 如何使用 Liquibase 定义类似索引? <createIndex tableName="table" indexName="ACT_IDX_table" unique="true"> <column name="column1" /> <column name="column2" /> </createIndex> 数据库-Postgres 据我所知,您无法在 liquibase 中最后设置 NULL。当然,您始终可以使用标签来准确编写您需要的内容。 <sql> CREATE INDEX IF NOT EXISTS index ON public.table USING btree (column1 ASC NULLS LAST, column2 ASC NULLS LAST); </sql>

回答 1 投票 0

在 r2dbc 之前运行 liquibase

我知道我可以同时运行 R2DBC 和 liquibase,但我想知道如何确保 Liquibase 首先运行? r2dbc-mysql 驱动程序不支持创建数据库(如果丢失)...

回答 1 投票 0

Spring boot H2 数据库未找到且不是由 Liquibase 创建的

我正在尝试创建一个带有嵌入式数据库(H2)的 Spring Boot 应用程序,并在应用程序启动时使用 liquibase 创建数据,但绝对没有任何效果。 当我访问 http://localhost...

回答 3 投票 0

postgresql 上不允许 addAfterColumn

为了修复漏洞,我升级了 dockerfile 中的 docker 镜像版本: 老的: 来自 liquibase/liquibase:4.4 新的: 来自 liquibase/liquibase:4.20 但我开始出现错误: addAfterColumn 还不是全部...

回答 4 投票 0

LiquidBase 事务执行被中止

当我使用 yml 文件执行一些 yml 文件以在 gcp spanner 数据库上创建和修改时。 由于网络中断,LiquidBase 交易执行被中止。 然后液基就锁了...

回答 1 投票 0

Liquibase 是否有与 Flyway 的 clean-on-validation-error 类似的选项

由于版本问题,我们在 Spring Boot 3 环境中从 Flyway 切换到 Liquibase。 由于我们仍处于非生产环境中,我们的数据库架构正在快速变化,我们不在乎......

回答 1 投票 0

Liquibase 修复不可重新运行的变更集

我的 master-chaneglog.yaml 如下所示, 数据库更改日志: - 包括: 相对更改日志文件:true 文件:db_ver_1.0/scripts.yaml script.yaml 如下所示, 数据库更改日志: -

回答 1 投票 0

Liquibase H2 ./mvnw liquibase:update 时出现“不支持的数据库文件版本或文件中的文件头无效”

我使用 jhipster 生成了一个应用程序,H2 数据库保留在磁盘上,当我使用 ./mvnw liquibase:update 时,我不断收到以下错误。 有谁知道问题出在哪里? 谢谢

回答 1 投票 0

在liquibase上为H2数据库创建SQL函数

由于我需要在 liquibase 中使用 2 个数据库(psql 和 h2),我尝试以不同的方式创建 SQL 函数: 由于我需要在 liquibase 中使用 2 个数据库(psql 和 h2),我尝试以不同的方式创建 SQL 函数: <changeSet author="zina" id="calculate_test"> <sqlFile dbms="h2, psql" encoding="UTF-8" endDelimiter="/nGO" path="calculate_test.sql" relativeToChangelogFile="true" splitStatements="false" stripComments="false"/> </changeSet> calculate_test.sql 看起来像 CREATE OR REPLACE FUNCTION calculate() RETURNS int BEGIN RETURN 5; END; GO 或者直接在中使用sql代码 <changeSet author="xxx" id="sql-example"> <sql dbms="h2" endDelimiter="\nGO" splitStatements="true" stripComments="true">xxx</sql> </changeSet> 并得到同样的错误。 liquibase.exception.MigrationFailedException: Migration failed for change set migrations.xml::calculate_test::zkensche: Reason: liquibase.exception.DatabaseException: Syntax error in SQL statement "CREATE OR REPLACE FUNCTION[*] CALCULATE() RETURNS INT BEGIN RETURN 5; END; GO"; expected "FORCE, VIEW, ALIAS, SEQUENCE, USER, TRIGGER, ROLE, SCHEMA, CONSTANT, DOMAIN, TYPE, DATATYPE, AGGREGATE, LINKED, MEMORY, CACHED, LOCAL, GLOBAL, TEMP, TEMPORARY, TABLE, SYNONYM, PRIMARY, UNIQUE, HASH, SPATIAL, INDEX"; SQL statement: ... 有人设法在 H2 上创建 SQL 函数吗?还是这是在 Java 上编写 SQL 函数的唯一方法? 根据文档,没有创建CREAT FUNCTION SQL命令。 我将感谢您的评论、解决方法和 Java 片段。 最好的, 吉娜 为了创建类似于 H2 中的函数对象,您需要使用“CREATE ALIAS ...”表达式。该功能基本上是Java代码。 以下是该过程的模型调用示例,应以文本形式返回 JSON: CREATE ALIAS gen_pageGlobal AS $$ String nextPrime(String p1, String p2, String p3, String p4) { return "{\"type\" : \"page\", \"data\" : {\"rn\": 1, \"email\": \"[email protected]\", \"projectCount\": 6}}"; } $$; 请记住,为了创建 liquibase,必须设置正确的endDelimiter = "$$": <changeSet id="20231219070000-4-2" author="java" context="dev"> <sql dbms="h2" endDelimiter="$$"> DROP ALIAS IF EXISTS gen_pageGlobal; CREATE ALIAS gen_pageGlobal AS $$ String nextPrime(String p1, String p2, String p3, String p4) { return "{\"data\": []}"; } $$; </sql> </changeSet>

回答 1 投票 0

Liquibase 更新后出现重复的变更集 ID

我想将 liquibase 版本 4.9.1 的 Spring Boot (2.7.x) 项目更新到最新的 Spring Boot 版本(包含 Liquibase 4.21.1)。 现在我在启动系统时遇到以下异常: 钙...

回答 1 投票 0

JPA Buddy Liquibase 初始化变更日志

我想将 Liquibase (通过 JPA Buddy)用于现有的 Spring Boot 项目;我已经有一个数据库了。 我不清楚我应该先执行什么操作来注册当前状态...

回答 1 投票 0

Liquibase 缺少环境变量

我将通过以下演示来使用大查询设置 liquibase 版本控制: https://medium.com/google-cloud/version-control-of-bigquery-schema-changes-with-liquibase-ddc7092d6d1d 但我是

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.