flyway 자바 자동 업그레이드 SQL 스 크 립 트 문제 및 해결 방법

왜 Flyway 를 써 요?
일상적인 개발 에서 우 리 는 다음 과 같은 문제 에 자주 부 딪 힌 다.
  • 자신 이 쓴 SQL 은 모든 환경 에서 실행 하 는 것 을 잊 었 습 니 다.
  • 다른 사람 이 쓴 SQL 이 모든 환경 에서 실행 되 었 는 지 확인 할 수 없습니다.
  • 누군가가 이미 실 행 된 SQL 을 수정 하여 다시 실행 하 기 를 기대 합 니 다.
  • 은 새로운 환경 을 추가 하여 데이터 이전 을 해 야 한다.
  • 매번 에 출시 될 때마다 DB 버 전 을 수 동 으로 제어 한 다음 에 응용 버 전 을 발표 해 야 한다.
  • 다른 장면...
    프로젝트 수요 의 변화 나 초기 디자인 결함 으로 인해 후기 에 데이터 베 이 스 를 수정 해 야 한다.이것 은 비교적 흔히 볼 수 있 는 일이 다.만약 에 프로젝트 가 아직 출시 되 지 않 았 다 면 시 계 를 삭제 하고 다시 만 들 수 있 지만 프로젝트 가 출시 되 었 다 면 이렇게 간단 하고 거 칠 어 서 는 안 된다.매번 에 프로젝트 를 운영 할 때마다 SQL 파일 을 수 동 으로 실행 해 야 한다.SQL 스 크 립 트 를 통 해 기 존 데이터 시트 를 바탕 으로 업그레이드 해 야 합 니 다.
    flyway 가 있 으 면 이 문제 들 은 모두 잘 해 결 될 수 있다.
    Flyway 를 사용 한 후 데이터베이스 버 전 업 그 레이 드 를 진행 하려 면 이전 데이터베이스 스 크 립 트 를 사용 하지 않 고 새로운 데이터베이스 스 크 립 트 를 만 듭 니 다.프로젝트 가 시 작 될 때 더 높 은 버 전의 스 크 립 트 를 감지 하면 자동 으로 실 행 됩 니 다.그러면 다른 동료 와 작업 할 때 도 편리 합 니 다.정상적으로 우 리 는 모두 Git 에서 코드 를 끌 어 내리 고 데이터베이스 스 크 립 트 를 끌 어 내리 지 않 기 때문에 누군가가 데이터 베 이 스 를 업데이트 하면 다른 동료 들 이 반드시 최신 통 지 를 받 을 수 있 는 것 이 아니 라 Flyway 를 사용 하면 이 문 제 를 효과적으로 피 할 수 있 습 니 다.
    모든 스 크 립 트 가 실행 되면 fly wayschema_history 표 에 기록 되 어 있 습 니 다.실수 로 잘못 되면 fly way 에서 수 동 으로schema_history 표 에서 기록 을 삭제 하고 SQL 스 크 립 트 를 수정 한 후 다시 시작 합 니 다(생산 환경 은 권장 하지 않 습 니 다).
    Flyway 는 어떻게 일 합 니까?
    Flyway 작업 절 차 는 다음 과 같 습 니 다.
    1.프로젝트 가 시작 되 고 응용 프로그램 이 데이터베이스 연결 풀 을 만 든 후에 Flyway 가 자동 으로 실 행 됩 니 다.
    2.처음 사용 할 때 Flyway 는 flyway_schema_history 표를 만들어 sql 실행 기록 을 기록 합 니 다.
    3.Flyway 는 프로젝트 가 지정 한 경로(기본 값 classpath:db/migration)의 모든 sql 스 크 립 트 를 스 캔 하여 flyway_schema_history 표 스 크 립 트 기록 과 비교 합 니 다.데이터베이스 기록 이 실 행 된 스 크 립 트 기록 이 프로젝트 의 sql 스 크 립 트 와 일치 하지 않 으 면 Flyway 가 잘못 보고 하고 프로젝트 실행 을 중단 합 니 다.
    4.검증 이 통과 되면 표 의 sql 에 따라 최대 버 전 번 호 를 기록 하고 모든 버 전 번 호 는 이 버 전의 스 크 립 트 보다 크 지 않 습 니 다.버 전 번호 에 따라 어 릴 때 부터 나머지 스 크 립 트 를 하나씩 실행 합 니 다.
    프로젝트 에 Flyway 사용 하기
    우선,pom 파일 에 flyway 의 핵심 의존 패 키 지 를 도입 합 니 다.
    1.핵심 의존 팩 도입:
    
     <dependency>
                 <groupId>org.flywaydb</groupId>
                 <artifactId>flyway-core</artifactId>
                 <version>5.2.4</version>
    </dependency>

    여 기 는 5.2.4 버 전 을 사용 합 니 다.테스트 를 통 해 7.0.0 버 전 은 현재 우리 가 사용 하고 있 는 springboot 버 전과 충돌 하여 fly way 가 실행 되 지 않 을 수 있 습 니 다.따라서 우 리 는 가능 한 한 높 은 버 전의 flyway 를 사용 하지 않 는 다.
    2.프로필:
    속성 을 간단하게 설정 하면 사용 할 수 있 습 니 다.
    
    # flyway   
     spring:
       flyway:
         #       flyway
         enabled: true
         # flyway   clean         schema      table,       。       false               。
         clean-disabled: true
         # SQL      ,               classpath:db/migration
         locations: classpath:db/migration
         #  metadata            flyway_schema_history
         table: flyway_schema_history
         #      flyway_schema_history    metadata  ,     flyway migrate     ,       flyway baseline   
         #     true   flyway      baseline    ,        baseline。
         baseline-on-migrate: true
         #    baseline     ,     1,         SQL   , migrate      
         baseline-version: 1
         #         UTF-8
         encoding: UTF-8
         #                 true       false
         out-of-order: false
         #    flyway     schema list,       flyway      ,   spring.datasource.url       schema,
         #       schema,        schema    metadata  ,       schema  migration sql   .
         #  flyway Clean         schema      .         spring.flyway.clean-disabled   true
         schemas: flyway
         #                                      DML        DDL      
         validate-on-migrate: true
    flyway 의 properties 설정 목록(속성 미 테스트):
    
    #              .
     flyway.baseline-description
     #        schema  ,            ,          ,  false.
     flyway.baseline-on-migrate =false
     #             schema      ,    1.
     flyway.baseline-version=1
     #             ,  false.
     flyway.check-location=false
     #              clean,  false.
     flyway.clean-on-validation-error=false
     #    flywary,  true.
     flyway.enabled=true
     #        ,  UTF-8.
     flyway.encoding
     #                 ,  false.
     flyway.ignore-failed-future-migration
     #            SQL.
     flyway.init-sqls
     #       ,  db/migration.
     flyway.locations
     #         ,  false.
     flyway.out-of-order
     #        .
     flyway.password
     #    placeholder   ,  ${.
     flyway.placeholder-prefix
     #      ,  true.
     flyway.placeholder-replacementplaceholders
     #    placeholder   ,  }.
     flyway.placeholder-suffix
     #  placeholder value
     flyway.placeholders.[placeholder name]
     #    flywary   schema,     ,        schema.
     flyway.schemas
     #       ,   V.
     flyway.sql-migration-prefix
     #           ,  __
     flyway.sql-migration-separator
     #       ,   .sql
     flyway.sql-migration-suffix
     #        ,   schema_version
     flyway.tableflyway
     #          ,   latest version
     flyway.target
     #      JDBC URL,        ,          
     flyway.url
     #         
     flyway.user
     #       ,   true
     flyway.validate-on-migrate
    fly way 의 yml 설정 목록(테스트 되 었 습 니 다.문제 없습니다.yml 형식의 설정 파일 을 추천 합 니 다)
    
    # flyway   
     spring:
       flyway:
         #       flyway
         enabled: true
         # flyway   clean         schema      table,       。       false               。
         clean-disabled: true
         # SQL      ,               classpath:db/migration
         locations: classpath:db/migration
         #  metadata            flyway_schema_history
         table: flyway_schema_history
         #      flyway_schema_history    metadata  ,     flyway migrate     ,       flyway baseline   
         #     true   flyway      baseline    ,        baseline。
         baseline-on-migrate: true
         #    baseline     ,     1,         SQL   , migrate      
         baseline-version: 1
         #         UTF-8
         encoding: UTF-8
         #                 true       false
         out-of-order: false
         #    flyway     schema list,       flyway      ,   spring.datasource.url       schema,
         #       schema,        schema    metadata  ,       schema  migration sql   .
         #  flyway Clean         schema      .         spring.flyway.clean-disabled   true
         schemas: flyway
         #                                      DML        DDL      
         validate-on-migrate: true
    spring.flyway.clean-disabled:이 속성 은 매우 중요 합 니 다.라 이브 러 리 에 있 는 시 계 를 지 울 지 여 부 를 표시 합 니 다.실행 중인 스 크 립 트 가 V1 이면xxx.sql,그러면 기 존 라 이브 러 리 에 있 는 시 계 를 제거 한 다음 에 스 크 립 트 를 실행 합 니 다.이것 은 개발 환경 에서 매우 편리 하지만 생산 환경 에서 죽 을 지경 입 니 다.그리고 기본적으로 제거 해 야 합 니 다.생산 환경 은 반드시 스스로 true 로 설정 해 야 합 니 다.
    3.db/migration 생 성
    flyway 는 기본적으로 resources/db/migration 의 폴 더 를 읽 기 때 문 입 니 다.이 경 로 를 수정 해 야 한다 면 설정 파일 에서 구현 할 수 있 습 니 다.

    4.sql 파일 작성
    이 곳 의 SQL 문 구 는 일정한 규범 에 따라 야 합 니 다.그렇지 않 으 면 실행 할 때 flyway 가 잘못 알 릴 수 있 습 니 다.명명 규칙 은 주로 두 가지 가 있다.
  • 한 번 만 실 행 될 수 있 는 SQL 이름 은 대문자'V'로 시작 하고 뒤에'0~9'숫자의 조합 을 따라 가면 숫자 사이 에'...'또는 밑줄''을 사용 할 수 있 습 니 다.분할 한 다음 에 두 개의 밑줄 로분할,그 다음 파일 이름,마지막 으로.sql 로 끝 납 니 다.예 를 들 어 V20210707__create_user.sql,V20210707__add_user.sql 이다.
  • 중복 실행 가능 한 SQL 은 대문자'R'로 시작 하고 그 다음 에 두 개의 밑줄 로 분할 한 다음 에 파일 이름과 마지막 으로'sql'로 끝 납 니 다.예컨대 R__truncate_user_dml.sql.
  • 이 가운데 V 로 시작 하 는 SQL 은 R 로 시작 하 는 SQL 보다 우선 순위 가 높다.
    V:고정 대문자
    202107.01:20210707 은 날짜 이 고 뒤에.01 로 번 호 를 대표 합 니 다.
    flyway 의 집행 은 순서 가 있 기 때 문 입 니 다.예 를 들 어 당신 이 V2021 를 실 행 했 기 때 문 입 니 다.create_user,또 V2020 실행update_user。잘못 보고 할 수 있 는 이 유 는 2020<2021.그래서 우 리 는 번호 가 순서대로 커진다 는 것 을 보증 해 야 한다.
    Flyway 는 어떻게 두 SQL 파일 의 우선 순 위 를 비교 합 니까?그것 은 왼쪽 정렬 원칙 을 채택 하고,결 위 는 0 으로 대신한다.몇 가지 예 를 들다.
     1.0.1.1 은 1.0.1 버 전보 다 높 았 다.
     ​
     1.0.10 은 1.0.9.4 버 전보 다 높 았 다.
     ​
     1.0.10 은 1.0.010 버 전 번호 만큼 높 고 버 전 번호 부분의 선도 0 은 무시 된다.
    __:이 건 두 개
    create_user 는 간단 한 sql 설명 입 니 다.
    .sql:.sql 로 끝 나 는 파일 접 두 사 는 약속 입 니 다.





    데이터베이스 에 fly way 라 는 데이터 베 이 스 를 만 들 고 프로젝트 를 시작 하면 fly way 는 sql 파일 을 실행 하고 user 표를 만 들 며 fly way 를 자동 으로 생 성 합 니 다.schema_역사 표

    이 시작 로그 에서 우 리 는 Flyway 의 실행 정보,데이터베이스 스 크 립 트 의 실행 을 볼 수 있 으 며,동시에 Flyway 는 fly way 도 만 들 었 다 고 말 했다.schema_history 표,이 표 는 데이터베이스 의 업데이트 역 사 를 기록 하 는 데 사 용 됩 니 다.

    flyway_schema_history 에 서 는 sql 파일 의 실행 기록 을 기록 합 니 다.프로젝트 를 시작 할 때마다 fly wayschema_history 는 sql 이 실 행 된 적 이 있 는 지,실 행 된 적 이 없 는 지,이 sql 이 새로운 sql 이라는 것 을 설명 하면 자동 으로 실 행 됩 니 다.그리고 표 에 기록 합 니 다.

    이 기록 이 있 으 면 다음 에 프로젝트 를 시작 합 니 다.V 20210707.01,V 20210707.02,V 20210708.01 이 세 개의 스 크 립 트 파일 은 실행 되 지 않 습 니 다.시스템 은 이 스 크 립 트 가 이미 실행 되 었 다 는 것 을 알 고 있 기 때 문 입 니 다.이 스 크 립 트 를 다시 실행 시 키 려 면 flyway 를 수 동 으로 삭제 해 야 합 니 다.schema_history 표 의 대응 기록 입 니 다.프로젝트 가 시작 되면 이 스 크 립 트 가 실 행 됩 니 다.
    R 로 시작 하 는 파일 과 V 로 시작 하 는 파일 이 약간 다 르 기 때문에 R 로 시작 하 는 파일 은 수정 사항 을 보 내 면 모두 한 번 씩 실 행 됩 니 다.V 로 시작 하 는 파일 이 일반적인 것 을 실행 하고 수정 사항 을 보 내 면 오류 가 발생 합 니 다.버 전 을 제어 하기 위해 서,우 리 는 가능 한 한 V 로 시작 하 는 파일 을 사용 합 니 다.그러면 우 리 는 모든 버 전의 sql 파일 을 똑똑히 볼 수 있 습 니 다.
    흔 한 문제
    질문
    질문
    원인:springboot 버 전과 fly way 버 전이 일치 하지 않 으 며,일반적으로 fly way 버 전이 너무 높 습 니 다.
    해결 방법:flyway 버 전 을 5.2.4 로 낮 추 면 ok 입 니 다.
    문제
    springboot 통합 flyway 가 적용 되 지 않 습 니 다.flyway 는 sql 을 자동 으로 실행 하지 않 습 니 다.
    원인:위 와 같다
    원인 2:프로젝트 에 데이터 베 이 스 를 설정 하지 않 았 고 sq 의존 또는 설정 을 도입 하지 않 았 습 니 다.
    해결 방법:위 와 같다
    해결 방법 2:sql 의존 도 를 도입 하여 yml 파일 에 sql 정 보 를 설정 합 니 다.
    질문
    Flyway 오류 Flyway 예외:유효성 검사 실패:감 지 된 실패 한 버 전 으로 의 마 이 그 레이 션
    원인:sql 스 크 립 트 와 데이터베이스 에 충돌 이 있 습 니 다.sql 스 크 립 트 가 어디 가 틀 렸 는 지 확인 해 야 합 니 다.쉽게 말 하면 V 로 시작 하 는 sql 파일 입 니 다.이미 실 행 했 습 니 다.fly wayschema_history 표 에 이 데이터 가 있 지만 sql 파일 을 바 꾸 어 다시 실행 할 때 오류 가 발생 했 습 니 다.
    해결 방법:sql 파일 을 새로 만 듭 니 다.원래 V 로 시작 하 는 파일 이나 fly way 를 수정 하지 마 십시오.schema_history 표 에서 파일 관련 실행 기록 을 찾 아 삭제 하고 다시 실행 합 니 다.
    작가:세상 에 유 료 bug 가 없습니다. 출처:https://www.cnblogs.com/LoveBB/ 본 고의 저작권 은 작가 와 블 로그 원 에 있 습 니 다.전 재 를 환영 하지만 작가 의 동의 없 이 반드시 글 페이지 에 원문 링크 를 제공 해 야 합 니 다.그렇지 않 으 면 법률 적 책임 을 추궁 할 권 리 를 보류 합 니 다.
    flyway 가 자바 자동 업그레이드 SQL 스 크 립 트 를 실현 하 는 문제 및 해결 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 자동 업그레이드 SQL 스 크 립 트 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기