문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
|
java:database:migration:flyway [2018/04/19 17:18] 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 | ||
| 줄 56: | 줄 98: | ||
| enabled: false | 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 를 그대로 복사해서 넣거나 해야한다. | ||
| + | |||
| + | |||