문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
java:database:migration:flyway [2018/04/19 17:16] kwon37xi |
java:database:migration:flyway [2023/06/08 10:20] (현재) kwon37xi [migration history는 생성됐으나 success = 0] |
||
---|---|---|---|
줄 2: | 줄 2: | ||
* http:// | * http:// | ||
* [[https:// | * [[https:// | ||
- | |||
===== Flyway Gradle Plugin ===== | ===== Flyway Gradle Plugin ===== | ||
* http:// | * http:// | ||
+ | ==== config 파일 이용 ==== | ||
+ | * [[https:// | ||
+ | * 설정 파일을 만들고, 해당 파일을 다음 처럼 호출< | ||
+ | gradle -Dflyway.configFiles=path/ | ||
+ | gradle -Dflyway.configFiles=path/ | ||
+ | |||
+ | # 환경 설정 이용 | ||
+ | export FLYWAY_CONFIG_FILES=path/ | ||
+ | </ | ||
+ | * 혹은 '' | ||
+ | flyway { | ||
+ | configFiles = ['/ | ||
+ | } | ||
+ | // 이 얘기는 공통 설정 프로필은 gradle에 지정하고 프로필별 접속 정보 설정파일을 따로 두고 아래 처럼 할 수도 있다는 얘기 | ||
+ | flyway { | ||
+ | driver = ' | ||
+ | locations = [" | ||
+ | encoding = ' | ||
+ | // .... | ||
+ | configFiles = ['/ | ||
+ | } | ||
+ | |||
+ | // 혹은 -Pprofile=local 형태로 프로필을 지정하고 | ||
+ | flyway { | ||
+ | driver = ' | ||
+ | // ... | ||
+ | configFiles = [" | ||
+ | } | ||
+ | </ | ||
+ | ==== gradle 에 직접 설정 ==== | ||
+ | * [[https:// | ||
+ | // locations 에서 filesystem 사용시 file() 을 사용하지 않으면 상황에 따라 상대경로가 서로 다른 경로로 매핑되므로 주의필요. | ||
+ | flyway { | ||
+ | url = ' | ||
+ | user = ' | ||
+ | password = ' | ||
+ | locations = [" | ||
+ | schemas = [' | ||
+ | encoding = ' | ||
+ | outOfOrder = true // 여러브랜치에서 서로 다른 날짜로 만들어도 작동하도록 | ||
+ | validateOnMigrate = true | ||
+ | } | ||
+ | </ | ||
==== Task 직접 생성 ==== | ==== Task 직접 생성 ==== | ||
* [[https:// | * [[https:// | ||
줄 38: | 줄 80: | ||
compile " | compile " | ||
</ | </ | ||
- | * '' | + | * '' |
flyway: | flyway: | ||
enabled: true | enabled: true | ||
줄 46: | 줄 88: | ||
* DataSource 관련하여 지정하지 않으면 '' | * DataSource 관련하여 지정하지 않으면 '' | ||
* 기본 마이그레이션 디렉토리는 '' | * 기본 마이그레이션 디렉토리는 '' | ||
+ | * flyway 프로필별로 끄기< | ||
+ | # SpringBoot 1.x | ||
+ | flyway: | ||
+ | enabled: false | ||
+ | |||
+ | # SpringBoot 2.0 | ||
+ | spring: | ||
+ | flyway: | ||
+ | enabled: false | ||
+ | </ | ||
+ | * 가급적 **'' | ||
+ | |||
+ | ===== Version Number ===== | ||
+ | * Flyway 버전 번호는 날짜 포맷으로 하는게 좋아보인다.'' | ||
+ | * 연속된 숫자로 할 경우 둘 이상의 개발자가 동일 숫자를 지정하여 오류가 발생하기 쉽다. | ||
+ | * '' | ||
+ | * [[https:// | ||
+ | |||
+ | ===== SpringBoot & Flyway ===== | ||
+ | * [[springframework: | ||
+ | * 따라서 SpringBoot application에서는 아예 flyway 에 대한 의존성을 걸지 않는 것을 추천한다. | ||
+ | |||
+ | ===== 특정 migration 실패 대응 ===== | ||
+ | migration 을 실행했으나, | ||
+ | |||
+ | ==== migration history는 생성됐으나 success = 0 ==== | ||
+ | <code sql> | ||
+ | -- 먼저 데이터 확인 | ||
+ | select * from flyway_schema_history WHERE version = < | ||
+ | |||
+ | -- 성공으로 강제 update | ||
+ | update flyway_schema_history SET success = 1 WHERE version = < | ||
+ | </ | ||
+ | |||
+ | ==== migration history 자체가 생성이 안 됨 ==== | ||
+ | * migration history 가 생성이 안 됐다면, local DB 등에서 migration 을 전체 실행하고 실패한 version 관련 정보를 강제로 넣어준다. | ||
+ | |||
+ | <code sql> | ||
+ | -- MySQL 기준임. | ||
+ | -- local db 에서 | ||
+ | select concat( | ||
+ | 'SET @max_rank = (select MAX(installed_rank) from flyway_schema_history); | ||
+ | ' | ||
+ | ' | ||
+ | ' installed_rank = @max_rank + 1', | ||
+ | ', version = ', fsh.version, | ||
+ | ', description = ''', | ||
+ | ', type = ''', | ||
+ | ', script = ''', | ||
+ | ', checksum = ''', | ||
+ | ', installed_by = CURRENT_USER()', | ||
+ | ', installed_on = now()', | ||
+ | ', execution_time = ', fsh.execution_time, | ||
+ | ', success = ', fsh.success, | ||
+ | ';' | ||
+ | from flyway_schema_history fsh where version = < | ||
+ | |||
+ | -- 실제 flyway를 적용할 DB에서 위 쿼리를 실행해서 나온 SQL 문을 실행해주면 된다. | ||
+ | </ | ||
+ | |||
+ | ==== migration history 자체가 생성이 안 됨 - skipExecutingMigrations ==== | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * 마이그레이션을 누군가 수동으로 진행했을 때 마이그레이션을 실행하지 않고, 빠져있는 migration history 만 채워넣는다. | ||
+ | * 유료버전 기능. | ||
+ | |||
+ | <code gradle> | ||
+ | flyway { | ||
+ | skipExecutingMigrations = true | ||
+ | } | ||
+ | </ | ||
+ | * 이 기능을 사용할 수 없으면, local 에서 실행한 history 를 그대로 복사해서 넣거나 해야한다. | ||
+ | |||
+ |