2017-09-18 6 views
0

우리는 liquibase를 사용하여 응용 프로그램의 기본 관계형 데이터베이스의 구조 변경을 관리합니다. 데이터베이스 백엔드로서 우리는 PostgreSQL을 사용하고 있습니다.장기 실행중인 liquibase 데이터베이스 업데이트를 비동기로 실행

이제 수백만 개의 항목이있는 테이블이 있으며 이러한 대형 테이블에 인덱스를 추가해야합니다. 테이블의 크기 때문에 인덱스 작성에는 상당한 시간이 걸립니다. 응용 프로그램이 실제로 실행되기 전에 적절한 지속성 백엔드를 사용할 수 있도록 응용 프로그램의 부팅 단계에서 liquibase 변경 집합이 실행되므로 응용 프로그램 시작이 차단됩니다.

명백한 이유 때문에 응용 프로그램을 시작하기 전에 구조를 변경해야하지만 응용 프로그램이 이미 실행 중일 때 색인을 추가 할 수 있습니다. 따라서 내 질문 :

liquibase와 비동기 적으로 인덱스 생성을 수행하는 방법이 있습니까?

이미 CONCURRENT option provided by PostgreSQL을 사용해 보았습니다. 이는 인덱스 작성으로 각 테이블이 잠기지 않으므로 응용 프로그램 런타임 중에 인덱스를 작성할 때 도움이됩니다. 그러나 각각의 liquibase 변경 집합은 다음 변경 집합이 실행되기 전에 인덱스 생성이 완료되기를 기다립니다.

+0

나는 거기에 대해 liquibase에 대한 메커니즘이 없다고 생각합니다. 비동기 적으로 아무것도 실행하는 것은 나중에 (인덱스 생성이 완료 될 때 콜백하는 것과 같이) 어떻게 든 나중에 동기화하는 것을 의미합니다. DB에 성공적으로 적용된 경우 Liquibase는 모든 변경 사항과 로그를 추적합니다. 또한 "변경 집합 x이 성공적이지 않은 경우 전체 업데이트 중지"와 같은 추가 실행을 제어하기 위해 결과를 사용할 수 있습니다. 비동기 적으로 실행되는 경우에는 불가능합니다. 나는 그것이 가능하지 않을 것이라고 말하지 않고있다. 나는 이것이 단지 현재 liquibase에서 구현되지 않았다고 생각한다. – Jens

답변

0

이 직접 수 없습니다,하지만 당신은 해결 방법 할 수있는 문제 :

수동 당신이 liquibase을 실행 전에 인덱스 작성 를 실행해야합니다. (이렇게하면 "동시에"옵션을 사용할 수 있습니다).

변경 기록을 유지하려면 "동시에"옵션을 사용하지 않고 색인 생성 스크립트를 추가하고 onFail = "MARK_RAN"이라는 전제 조건을 추가하여 liquibase를 추가 할 수 있습니다.

다음에 liquibase가 실행되면 변경 집합을 실행으로 표시합니다.