当前位置: 首页 > 知识库问答 >
问题:

Liquibase-系统错误。重新执行迁移时的DATABASECHANGELOGLOCK

谷彦君
2023-03-14

我使用的是Liquibase 3.0.2、Ant task updateDatabase和直接在SQL脚本中定义的变更集,使用的注释如下

--liquibase formatted sql
--changeset com.noemalife:1 dbms:oracle

第一次运行工作正常,执行所有更改集并部署DB对象(oracle)。我可以看到DATABASE CHANGELOG和DATABASE CHANGELOGLOCK表填满了。

然后,我尝试用相同的精确配置重新运行Ant任务,希望Liquibase会说“好的,所有的都已经部署好了,这里什么都不用做。”

但我得到的是:

C:\Users\dmusiani\Desktop\liquibase-test>ant migrate
Buildfile: build.xml

migrate:
     [copy] Copying 1 file to C:\Users\dmusiani\Desktop\liquibase-test

BUILD FAILED
liquibase.exception.LockException: liquibase.exception.DatabaseException: Error executing SQL CREATE
 TABLE SYSTEM.DATABASECHANGELOGLOCK (ID INTEGER NOT NULL, LOCKED NUMBER(1) NOT NULL, LOCKGRANTED TIM
ESTAMP, LOCKEDBY VARCHAR2(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID)); on jdbc:oracl
e:thin:@localhost:1521:WBMDINSERT INTO SYSTEM.DATABASECHANGELOGLOCK (ID, LOCKED) VALUES (1, 0): ORA-
00955: nome giÓ utilizzato da un oggetto esistente

        at liquibase.lockservice.LockServiceImpl.acquireLock(LockServiceImpl.java:122)
        at liquibase.lockservice.LockServiceImpl.waitForLock(LockServiceImpl.java:62)
        at liquibase.Liquibase.update(Liquibase.java:123)
        at liquibase.integration.ant.DatabaseUpdateTask.executeWithLiquibaseClassloader(DatabaseUpda
teTask.java:45)
        at liquibase.integration.ant.BaseLiquibaseTask.execute(BaseLiquibaseTask.java:70)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.Target.execute(Target.java:357)
        at org.apache.tools.ant.Target.performTasks(Target.java:385)
        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337)
        at org.apache.tools.ant.Project.executeTarget(Project.java:1306)
        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        at org.apache.tools.ant.Project.executeTargets(Project.java:1189)
        at org.apache.tools.ant.Main.runBuild(Main.java:758)
        at org.apache.tools.ant.Main.startAnt(Main.java:217)
        at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
        at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)
Caused by: liquibase.exception.DatabaseException: Error executing SQL CREATE TABLE SYSTEM.DATABASECH
ANGELOGLOCK (ID INTEGER NOT NULL, LOCKED NUMBER(1) NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR
2(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID)); on jdbc:oracle:thin:@localhost:1521:W
BMDINSERT INTO SYSTEM.DATABASECHANGELOGLOCK (ID, LOCKED) VALUES (1, 0): ORA-00955: nome giÓ utilizza
to da un oggetto esistente

        at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:56)
        at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:98)
        at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:64)
        at liquibase.database.AbstractJdbcDatabase.checkDatabaseChangeLogLockTable(AbstractJdbcDatab
ase.java:771)
        at liquibase.lockservice.LockServiceImpl.acquireLock(LockServiceImpl.java:95)
        ... 21 more
Caused by: java.sql.SQLException: ORA-00955: nome giÓ utilizzato da un oggetto esistente

        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
        at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:754)
        at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:210)
        at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:963)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1192)
        at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1731)
        at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1701)
        at liquibase.executor.jvm.JdbcExecutor$1ExecuteStatementCallback.doInStatement(JdbcExecutor.
java:86)
        at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:49)
        ... 25 more

Total time: 1 second
C:\Users\dmusiani\Desktop\liquibase-test>

在我看来,Liquibase正在尝试重新创建DATABASE CHANGELOGLOCK表。

当我使用Oracle“系统”用户运行Liquibase时,我遇到了这个问题(我的补丁关心创建几个其他用户,因此出于测试目的,我直接使用系统来做到这一点)。另一个奇怪的事情是,在系统的补丁成功运行后,在锁表中我仍然可以看到锁是活动的。当我在其他模式(例如系统补丁创建的补丁)中运行其他补丁时,我成功完成了补丁并在锁表中释放了锁;重新启动该补丁的行为符合预期:Liquibase检测到补丁已经就位,广告什么也不做。

这就是说,现在我的疑问是,在系统模式中,Liquibase在检测锁表已经存在(并且尝试部署它失败)方面是否存在问题,或者是否存在某种锁/提交问题。

欢迎提出任何建议

谢啦

达维德

共有1个答案

王景山
2023-03-14

我和你面临着同样的问题。从源代码中可以看出,当作为系统运行时,以下条件(DatabaseSnapshot#include)被评估为true。

    if (database.isSystemObject(example)) {
        return null;
    }

正因为如此,创建将始终被尝试。我将在补丁上进一步工作并随时向您更新。

这是一个补丁提案。

 类似资料:
  • 我有一个问题启动我的Java应用程序 liqibase更新出错:

  • 我是一个绝对的初学者laravel。 我想在我的数据库中做一些改变。但是当我试图刷新我的数据库时,我一直在处理下面的错误。 在写这篇文章之前,我在谷歌上搜索了很多东西,阅读了很多参考资料。然而,所有这些都不起作用,帮助我解决了错误。 以前有人遇到过这个错误吗?如有任何建议,将不胜感激。提前谢谢。 PHP致命错误:未捕获异常“UnexpectedValueException”,消息为“流或文件”/w

  • 这是我在实体的源代码模型中的内容: 这是我在实体的目标模型中得到的: 如您所见,我将关系从多个更改为一个,从更改为。 但现在我有以下错误: 我不知道如何解决这个问题。有什么想法吗? 这是我设置核心数据堆栈的方式:

  • 有人能帮我一些建议我可以尝试吗?该应用程序在没有Spring Boot的情况下使用Liquibase 3.4.1运行良好。 下面是我的相关application.yml配置:

  • 在使用可重复迁移时,我观察到一些奇怪的飞行路线行为。文件指出: 在一次迁移运行中,可重复迁移始终在所有挂起的版本化迁移执行完毕后最后应用。 但在我的例子中,可重复迁移(正在重新创建一个DB视图)似乎失败了,因为它是在版本化迁移之前执行的。 迁移前的Flyway信息数据:

  • 嗨,我正在尝试升级到wagtail 2.0。我已经处理了一系列错误,但我无法克服迁移时出现的错误: 非常感谢任何帮助 谢谢 提姆 完全控制台错误: (wagtail-isa) MacBook-Air:wagtailcmsdemo tim$ ./manage.py makemigrations Traceback(最近一次调用最后一次):文件“./manage.py”,第 10 行,在 execut