source

리퀴베이스 잠금 - 이유?

factcode 2023. 3. 25. 11:56
반응형

리퀴베이스 잠금 - 이유?

Oracle 서버에 대해 많은 액화 베이스 스크립트를 실행할 때 발생합니다.Some Computer가 접니다.

Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Liquibase Update Failed: Could not acquire change log lock.  Currently locked by SomeComputer (192.168.15.X) since 2013-03-20 13:39
SEVERE 2013-03-20 16:59:liquibase: Could not acquire change log lock.  Currently locked by SomeComputer (192.168.15.X) since 2013-03-20 13:39
liquibase.exception.LockException: Could not acquire change log lock.  Currently locked by SomeComputer (192.168.15.X) since 2013-03-20 13:39
        at liquibase.lockservice.LockService.waitForLock(LockService.java:81)
        at liquibase.Liquibase.tag(Liquibase.java:507)
        at liquibase.integration.commandline.Main.doMigration(Main.java:643)
        at liquibase.integration.commandline.Main.main(Main.java:116)

동시 세션/트랜잭션 수에 도달했을 가능성이 있습니까?생각나는 사람?

업데이트 응용 프로그램이 갑자기 중지된 경우 잠금이 고정된 상태로 유지될 수 있습니다.

그러면 실행 중

UPDATE DATABASECHANGELOGLOCK SET LOCKED=0, LOCKGRANTED=null, LOCKEDBY=null where ID=1;

데이터베이스 도움말에 대한 도움말

, 이 경우, 이 경우 대체가 .LOCKED=0LOCKED=FALSE.

그냥 요.DATABASECHANGELOGLOCK츠키다

2020년 6월 편집

이 충고를 따르지 마세요.그것은 몇 년 동안 많은 사람들에게 문제를 일으켰다.오래전에 효과가 있었고 성의를 가지고 올렸지만, 분명히 그렇게 하는 방법은 아니에요.DATABASE CHANGELOCK 테이블에는 내용물이 필요하므로 테이블을 떨어뜨리지 않고 모든 내용을 삭제하는 것은 좋지 않습니다.

를 들어 Leos Literak은 이러한 지시에 따라 서버를 시작하지 못했습니다.

원답

아마도 죽은 리퀴베이스 프로세스가 DATABASE CHANGELOGLOCK 테이블에서 잠금을 해제하지 않았기 때문일 수 있습니다.그리고나서,

DELETE FROM DATABASECHANGELOGLOCK;

도움이 될 거야

편집: @Adrian Ber의 답변은 이보다 더 나은 해결책을 제공합니다.그의 솔루션을 실행하는 데 문제가 있는 경우에만 이 작업을 수행하십시오.

문제는 Liquibase에서의 SequenceExists의 버그가 있는 실장이었습니다.이러한 스테이트먼트를 사용한 변경 세트는 매우 오랜 시간이 걸리고 실수로 중단되었기 때문입니다.그런 다음 액상화기 스크립트를 실행하려고 하면 잠금이 유지되었습니다.

  <changeSet author="user" id="123">
    <preConditions onFail="CONTINUE">
      <not><sequenceExists sequenceName="SEQUENCE_NAME_SEQ" /></not>
    </preConditions>
    <createSequence sequenceName="SEQUENCE_NAME_SEQ"/>
  </changeSet>

회피책에서는 플레인 SQL을 사용하여 이를 확인합니다.

  <changeSet author="user" id="123">
    <preConditions onFail="CONTINUE">
            <sqlCheck expectedResult="0">
              select count(*) from user_sequences where sequence_name = 'SEQUENCE_NAME_SEQ';
            </sqlCheck>
    </preConditions>
    <createSequence sequenceName="SEQUENCE_NAME_SEQ"/>
  </changeSet>

잠금 데이터는 DATABASE CHANGELOCK 테이블에 저장됩니다.잠금을 해제하려면 1을 0으로 변경하거나 테이블을 삭제하고 다시 작성합니다.

Liquibase를 실행하기 위해 어떤 환경을 사용하는지는 언급되지 않았다. Spring Boot 2의 연장이 합니다.liquibase.lockservice.StandardLockServiceSQL sql sql sql sql sql sql sql sql sql sql sql sql sql sql sql sql sql sql §:

/**
 * This class is enforcing to release the lock from the database.
 *
 */
 public class ForceReleaseLockService extends StandardLockService {

    @Override
    public int getPriority() {
        return super.getPriority()+1;
    }

    @Override
    public void waitForLock() throws LockException {
        try {
            super.forceReleaseLock();
        } catch (DatabaseException e) {
            throw new LockException("Could not enforce getting the lock.", e);
        }
        super.waitForLock();
    }
}

코드가 잠금을 해제하고 있습니다.이는 오류 발생 시 또는 디버깅이 중단되었을 때 릴리스 콜이 호출되지 않을 수 있는 테스트 설정에서 유용합니다.

는 반드시 .liquibase.ext스프링 부츠 2 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」

리키베이스 4

Liquibase 4에서 익스텐션 로드 메커니즘이 변경된 점에 유의하십시오.

이제 파일 아래에 파일이 있습니다.META-INF/services구현된 풀 인터페이스 패키지 이름을 사용하여 이 파일에 모든 확장자를 나열해야 합니다.

이것은, 에 있는 것을 의미할 가능성이 있습니다.META-INF/services/liquibase.lockservice.LockService

다음 행을 추가해야 합니다.

com.company.liquibase.impl.ForceReleaseLockService

아직 시도하지 않았습니다만, Liquibase 3를 사용하고 있기 때문에, 수정해 주세요.

테이블을 수동으로 또는 쿼리를 사용하여 안전하게 삭제할 수 있습니다.자동으로 재생성됩니다.

DROP TABLE DATABASECHANGELOGLOCK;

이것이 OP의 문제가 아니었던 것은 감사하지만, 저는 최근에 다른 이유로 이 문제에 부딪혔습니다.참고로 SQL Server에서 Liquibase Maven 플러그인(liquibase-maven-plugin: 3.1.1)을 사용하고 있었습니다.

어쨌든 SQL Server "use" 문을 실수로 복사하여 데이터베이스를 전환하는 스크립트 중 하나에 붙여 넣었기 때문에 likibase가 실행 및 업데이트되었습니다.DATABASECHANGELOGLOCK올바른 데이터베이스로 잠금을 취득한 후 데이터베이스를 전환하여 변경을 적용합니다.올바른 데이터베이스에서는 변경사항이나 액상감사를 볼 수 없을 뿐만 아니라, 물론 다시 액상감사를 실행해도 "잘못된" 데이터베이스에서 잠금이 해제되어 "올바른" 데이터베이스에 잠긴 상태이기 때문에 잠금을 취득할 수 없었습니다.리퀴바이스가 잠겼는지 확인 후 해제될 줄 알았고, 리퀴바이스의 버그인지(아직 확인하지 않았지만) 이후 버전에서는 충분히 대처할 수 있을 것 같습니다!그렇다고는 해도, 특징이라고 할 수 있을 것 같습니다!

남학생의 실수가 적지 않다는 건 알지만, 같은 문제에 부딪힐 경우를 대비해서 이 문제를 제기합니다!

테이블 DATABASE CHANGELOGLOCK이 잘리거나 삭제되지 않을 수 있습니다.Postgre 사용SQL 데이터베이스와 여러 번 이 문제를 겪었습니다.이 문제를 해결하려면 해당 데이터베이스에 대해 백그라운드에서 실행 중인 준비된 문을 롤백해야 합니다.준비된 모든 문장을 롤백하고 액화효소의 변경을 다시 시도합니다.

SQL:

SELECT gid FROM pg_prepared_xacts WHERE database='database_name';

위의 문이 레코드를 반환하는 경우 다음 SQL 문을 사용하여 준비된 문을 롤백합니다.

ROLLBACK PREPARED 'gid_obtained_from_above_SQL';

테이블은 리키베이스가 알아서 하게 해주세요.user1434769가 언급했듯이 올바른 방법은 Liquibase의 releaseLocks 명령을 사용하는 것입니다.

때, 그래들, 그래들, 그래들, 들, 그래들(Gradle)은 다음과 같습니다.gradlew releaseLocks

이전에 장애 발생 후 잠금이 남아 있을 때 Database Change Log Lock 테이블을 잘라낸 적이 있습니다(일반적으로 이 방법은 여전히 유효합니다).

단, 이 프로젝트(https://github.com/blagerweij/liquibase-sessionlock)는 Oracle, Postgre 사용 시 Liquibase를 잠그기 위해 네이티브 데이터베이스 세션 잠금을 사용합니다.SQL 및 MySQL.

JAR 파일은 기존 Liquibase 4.x+ 응용 프로그램에 드롭할 수 있으며, Liquibase에 의해 자동으로 검출됩니다.이렇게 하면 잠금에 세션 잠금이 사용됩니다.잠금이 유지되고 있는 동안 응용 프로그램이 크래시 또는 셧다운되면 자동으로 해제됩니다.그러면 잠긴 상태가 발생하지 않을 수 있습니다(지원되는 데이터베이스 중 하나를 사용하는 경우).

postgres 12에서는 다음 명령을 사용해야 했습니다.

UPDATE DATABASECHANGELOGLOCK SET LOCKED=false, LOCKGRANTED=null, LOCKEDBY=null where ID=1;

리퀴베이스 변경 로그의 기본 테이블은 DATABASE CHANGELOCK이지만, 아래 속성을 설정하여 재정의하거나 커스텀 테이블로 설정할 수 있습니다.

in application.properties

database-change-log-lock-table=<SOME_CUSTOM_TABLE_NAME>

애플리케이션에 이 속성이 설정되어 있는 경우는,

UPDATE <SOME_CUSTOM_TABLE_NAME> SET LOCKED=0, LOCKGRANTED=null, LOCKEDBY=null where ID=1;     

또는 테이블을 삭제합니다.

drop table <SOME_CUSTOM_TABLE_NAME>

@Adrian이 게시한 솔루션이 작동하지 않는 경우 잠금에 대한 추가 정보가 포함된 INTERFACE_DATABASE CHANGELOGLOCK 테이블에서 동일한 작업을 시도할 수 있습니다.

UPDATE INTERFACE_DATABASECHANGELOGLOCK SET LOCKED=0, LOCKGRANTED=null, LOCKEDBY=null where ID=1;

또는 단순히 테이블을 치울 수도 있습니다.

TRUNCATE TABLE INTERFACE_DATABASECHANGELOGLOCK

언급URL : https://stackoverflow.com/questions/15528795/liquibase-lock-reasons

반응형