[Liquibase] change log lock error 발생 시 lock 해제하는 법

회사내에서 프로젝트를 진행할 때는 대부분 NestJS, TypeORM, RestAPI를 기본 스펙으로 잡고 진행하는데 외부에서 진행되던 프로젝트가 NestJS, TypeORM에 Liquibase 라는 처음 접하는 데이터베이스 버전 관리 툴을 사용하였는데 내부로 인수인계가 다 되진 않은 상태에서 local 환경에서 개발하다 $ npm run start:dev를 했는데 정상적인 상황이라면 아래처럼 서버가 실행되어야 정상이다.

 

정상적인 경우 update end가 뜨면서 서버가 실행된다.

>>> liquibase update start 뒤에 liquibase가 실행된다는 로그가 남아있는 채로 update end 로그가 뜨지 않고, 3 ~ 4분 뒤에 Caused by: liquibase.exception.LockException: Could not acquire change log lock. 가 뜨면서 postgres 쪽 로그에도 unexpected EOF on client connection with an open transaction만 남아있었다. 

 

에러 로그를 살펴보면 liquibase change log lock 관련 테이블에 lock이 걸려있어서 liquibase update 프로세스가 해당 테이블에 접근하지 못하는 거 같았다. 로컬 데이터베이스를 살펴보니 테이블명이 databasechangeloglock인 테이블이 존재했다. 

 

내부 row를 확인해보니 locked 칼럼의 boolean 값이 true가 되어있었다. 해당 칼럼의 값을 false로 변환한 뒤 정상적으로 실행되었다.

 

해당 에러가 발생한 원인을 추측해보면 개발 도중에 로컬 서버 node 프로세스가 비정상적으로 죽어버렸고, 비정상적인 프로세스의 종료로 인해 databasechangeloglock 테이블에 현재 상태가 반영되지 않은 것으로 생각된다. 만약 서버 프로세스가 정상적으로 종료되었다면 아래처럼 locked 칼럼은 false에 나머지 칼럼들은 null로 되어 있어야한다.

 

참고 글)

https://stackoverflow.com/questions/62455159/liquibase-lock-could-not-acquire-change-log-lock-in-postgresql-docker-image