programing

스프링 부츠를 사용한 플라이웨이 수리

newnotes 2023. 4. 5. 22:11
반응형

스프링 부츠를 사용한 플라이웨이 수리

Spring Boot 프로젝트에서 Flyway를 사용하여 이행에 실패했을 때 어떻게 해야 하는지 잘 모르겠습니다.

Flyway를 활성화하기 위해 Flyway 의존성을 추가했습니다.pom.xml그리고 모든 것이 잘 작동한다.데이터베이스 스크립트는 Spring Boot 앱을 시작할 때 마이그레이션됩니다.

그러나 스크립트 중 하나에 오류가 발생하여 마지막 마이그레이션이 실패했습니다.마이그레이션을 시도하면 "이행 체크섬 불일치"가 발생합니다.평소 같으면 달리기를 하고mvn flyway:repair단, Spring Boot을 사용하고 있기 때문에 Flyway Maven 플러그인을 사용하면 안 됩니다.그럼 어떻게 해야 하죠?

데이터베이스 복구에는 몇 가지 방법이 있습니다.저는 개인적으로 단순한 SQL 문을 선호합니다.

SQL 문:

마이그레이션이 실패한 행을 삭제하기만 하면 됩니다.그런 다음 마이그레이션을 다시 실행할 수 있습니다.

플라이웨이를 직접 실행하다

Flyway를 로컬로 설치하고flyway repair콘솔로

Flyway Maven 플러그인 사용

Flyway Maven 플러그인을 폼에 추가하고 실행하세요.mvn flyway:repair이것은 Spring Boot의 개념과 모순되지 않는다고 생각합니다.

스프링 부트 확장

Spring Boot가 호출합니다.Flyway.migrate()데이터베이스 마이그레이션을 수행합니다.더 많은 제어를 원하는 경우@Bean을 구현합니다.FlywayMigrationStrategy.

에서FlywayMigrationStrategy플라이웨이에서 마이그레이션 또는 복구 방법을 호출할 수 있습니다.상세한 것에 대하여는, 「Spring Boot Reference Guide 」를 참조해 주세요.

난 그렇게 생각하지 않아.FlywayMigrationStrategy데이터베이스를 복구하기 위한 적절한 장소입니다.이행에 실패한 경우는 예외이며 애플리케이션 외부에서 처리해야 합니다.

다음 bean을 선언하면 코드를 통해 할 수 있습니다.

@Bean
public FlywayMigrationStrategy cleanMigrateStrategy() {
    return flyway -> {
        flyway.repair();
        flyway.migrate();
    };
}

Flyway Maven 플러그인

@Daniel의 답변에 이 정보를 추가하기 위해

1.

      ...
        <plugin>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-maven-plugin</artifactId>
            <version>4.1.0</version>
            <configuration>
                <url>jdbc:mysql://localhost:3306</url>
                <user>root</user>
                <password>root</password>
                <schemas>
                    <schema>[your_schema]</schema>
                </schemas>
            </configuration>
        </plugin>
      ...

2.

mvn 플라이웨이: 클린

3.

MVN 플라이웨이: 복구

추신: 순서 2와 3이 동작하지 않으면 순서를 변경합니다.

목표 달성에 대한 자세한 내용은http://https://flywaydb.org/documentation/maven/ 를 참조해 주세요.

데이터베이스 마이그레이션이 실패하면 스키마 기록 테이블에서 마이그레이션이 실패한 것으로 표시됩니다.(i.e flyway_schema_history)데이터베이스 수동 정리가 필요할 수 있습니다.그러나 데이터베이스가 DDL 트랜잭션을 지원하는 경우 마이그레이션은 자동으로 롤백되고 스키마 기록 테이블에 기록되지 않습니다. PostgreSQL,Amazon Redshift,MS SQLDDL 트랜잭션을 지원하는 데이터베이스는 거의 없습니다.Oracle Database,MySQL,MariaDB,Amazon Aurora는 DDL.

이행 엔트리에 장애가 발생했을 경우 @daniel-kéfer의 설명에 따라 이 엔트리를 복구하는 옵션이 몇 가지 있습니다(DDL 트랜잭션을 지원하지 않는 데이터베이스에만 해당).실패한 이행에 대처하기 위한 다른 방법(더 쉬운 방법일 수 있음)을 추가하고 싶습니다.

플라이웨이에 의해 지원되는 콜백이 몇 가지 있습니다.afterMigrateError아아아아아아아아아아아아아아아아아아아아아아."sql" 이라는 이름의 할 afterMigrateError.sql그런 다음 마이그레이션이 실패할 때마다 실행됩니다.간단하게 수 .afterMigrateError.sql(「」)에 .resources/db/migration하여 sql에서 flyway_schema_history

sql " " "afterMigrateError.sql 할 수 .

DELETE IGNORE FROM flyway_schema_history WHERE success=0;

는 테이블 입니다.flyway_schema_history그렇지 않으면 변경되지 않습니다. 다음 단순히 ''는 행을 찾습니다.success로 표제하다.0이행에 실패했을 합니다), 에는 모두 값 엔트리가 (이행에는 값 엔트리가 있습니다).1[ Success ]카람)에서 해당 엔트리를 삭제합니다.이제 최신 마이그레이션 파일을 변경하고 수정한 후 다시 실행할 수 있습니다.

와 같이 로컬로 플라이웨이를 설치하고 디렉토리를 설치로 변경한 후 실행합니다(H2의 예).

./flyway -url=jdbc:h2:/Users/mugo/dev/h2/das-boot -user=sa -password= repair

언급URL : https://stackoverflow.com/questions/37462550/flyway-repair-with-spring-boot

반응형