봄 부팅이 전투 : 데이터베이스 버전의 이동 경로 관리 변경을 사용하여

1. 소개

프로젝트 데이터베이스 테이블 구조의 연속적인 반복을 통해, 데이터가 변경된다. 그리고 심지어 일부 사업은 여러 버전 환경에서 병렬로 실행합니다. 데이터는 시대의 왕 데이터베이스 버전이 급선무가되었다 관리 할 수 있습니다. 어떻게 내가 좋아 할 수있는 망할 놈의 버전 관리 도구는 데이터베이스를 관리 하시겠습니까? 자바는 일반적으로 항목을 사용 철새 이동 경로Liquibase을 데이터베이스 버전을 관리 할 수 있습니다. 어떤 이동 경로 상대적으로 인기.

2. 이동 경로 기능

이동 경로 는 다음과 같은 장점을 가지고 있기 때문에 인기가 있습니다 :

  • 간단하고 설치 및 마이그레이션는 개발자를 받아들이 또한 매우 간단하지만, 매우 쉽게 배울.
  • 특정 이동 경로는 데이터베이스 마이그레이션 아웃, 버전 제어 및 다른 부작용에 초점을 맞추었다.
  • 강력한 연속 전달 및 설계를위한 설계. 응용 프로그램이 시작될 때 이동 경로 마이그레이션 데이터베이스를 보자.

3. 이동 경로 작동 메커니즘

이동 경로가 해야 할 DB첫 번째 중 하나 만들 metadata테이블 (이름이 기본 테이블을 flyway_schema_history각각 테이블에 보유) migration레코드 (마이그레이션), 기록에 포함 된 migration버전 번호 및 스크립트 의 SQL 스크립트의 checksum값을. 아래 그림은 데이터베이스 버전의 복수를 보여줍니다.

해당 metadata테이블 기록 :

installed_rank 번역 기술 유형 스크립트 검사 installed_by installed_on 실행 시간 성공
1 1 초기 설정 SQL V1__Initial_Setup.sql 1,996,767,037 악셀 2016년 2월 4일 22 : 23 : 00.0 (546) 참된
먼저 변경 SQL V2__First_Changes.sql 1,279,644,856 악셀 2016년 2월 6일 09 : 18 : 00.0 127 참된

이동 경로의 클래스 경로는 파일 시스템을 검사 또는 응용 프로그램 읽기 DDLDML을 마이그레이션. 에 따르면 metadata마이그레이션 테이블을 확인합니다. 스크립트 구문의 버전 번호보다 작거나 현재 버전의 동일한 버전 번호 중 하나로 표시되어 있으면, 그것은 그들을 무시합니다. 응용 프로그램을 사용할 수 있지만 : 나머지 마이그레이션은 마이그레이션 보류 중입니다. 마지막으로, 버전 번호와 정렬 그들에 의해 실행에있어서 실행 순서 표 메타 데이터에 초래한다.

해당 metadata테이블 기록 :

installed_rank 번역 기술 유형 스크립트 검사 installed_by installed_on 실행 시간 성공
1 1 초기 설정 SQL V1__Initial_Setup.sql 1,996,767,037 악셀 2016년 2월 4일 22 : 23 : 00.0 (546) 참된
먼저 변경 SQL V2__First_Changes.sql 1,279,644,856 악셀 2016년 2월 6일 09 : 18 : 00.0 127 참된
2.1 리팩토링 JDBC V2_1__Refactoring 악셀 2016년 2월 10일 17 : 45 : 05.4 (251) 참된

이동 경로는 명령 행 (명령 줄 도구를 다운로드해야) 및 지원 자바 API를 또한 빌드 도구 지원, 메이븐Gradle을을 . 여기에서 우리는 볼 것이다 자바 API 에.

3. 이동 경로 규칙

이동 경로 두 비교하는 방법 SQL의 순서가 파일? 그것은 사용 왼쪽 정렬 원칙, 대체 0의 부재를 . 몇 가지 예 :

버전 1.0.1 이상 1.0.1.1.

1.0.9.4 버전보다 높은 1.0.10.

버전 번호 1.0.010 및 1.0.10 무시 될 각 섹션에 0을 선두의 버전 번호의 높은.

이동 경로SQL의 에 파일 버전 화 , 반복취소 세 가지 유형 :

  • 버전 업그레이드 버전, 각 버전에는 고유 한 버전 번호가 한 번만 수행 할 수 있습니다.
  • 반복이 때, 반복적으로 수행 할 수 있습니다 이동 경로가 감지 반복 유형의 SQL 스크립트 checksum, 변경 될 수 있습니다 철새 이동 경로는 스크립트를 다시 적용됩니다. 그것은 종류의 업데이트 된 버전이 아닌 migration항상 버전 화는 단지 실행 후에 수행된다.
  • 취소 마이그레이션을 제공합니다 버전의 동일한 버전에 영향을 취소 할 수 있습니다. 그러나, 롤백은 일반적으로 권장되지 않습니다, 너무 기계, 너무 거친. 일반 권장 버전 지정된 해결하는 모드.

이름 지정 규칙이 세 아래와 같이 :

naming.png

  • 접두사 구성 접두사 기본값은 식별 V표시 v 전화를 , R대표 반복 , U대표 취소를
  • 버전은 하나 개 이상의 숫자로 구성되는 버전 번호, 디지털 가능한 점 사이 세퍼레이터 식별 .또는 밑줄_
  • 세퍼레이터 버전 ID 및 설명 정보를 분리하기 위해 구성 될 수 있고, 기본 두 밑줄이고__
  • 설명 된 기술 정보는 밑줄로 될 수 _또는 공간 구분
  • 접미사 를 구성 할 수 있습니다, 이후의 식별, 기본.sql

4. 봄 부팅 통합 철새 이동 경로

봄 부팅 제공 이동 경로가 자동으로 구성. 우리가 상자 밖으로 할 수 있도록 이동 경로 데이터베이스 버전 제어 할 수 있습니다.

4.1 이동 경로는 의지

당신은에 의존 소개합니다 :

      <!-- 无需版本号 -->
 <dependency>
      <groupId>org.flywaydb</groupId>
      <artifactId>flyway-core</artifactId>
 </dependency>      
复制代码

물론, 당신은 당신의 관계형 데이터베이스 환경을 통합하려는. 여기에 우리가 사용하는 수소 하지만 다른 방언으로, 다른 데이터베이스 같은 방법을 보여 데이터베이스. 익숙하지 H2의 데이터베이스는 제 기능 문서에서 찾을 수 있습니다 H2 데이터베이스 통합 및 사용 : 봄 부팅이 전투 .

4.2 이동 경로 구성

에서 처음으로 직관적 인 구성을 설명하기 위해 봄 부트 구성 파일을 application.yml우리는 구성 H2의 데이터베이스를 :

 spring:
   datasource:
     #  h2 驱动
     driver-class-name: org.h2.Driver
     # h2  数据库 持久化到磁盘D:/h2 库名: flyway  mysql模式
     url: jdbc:h2:file:D:/h2/flyway;MODE=MySQL;DATABASE_TO_LOWER=TRUE
   h2:
     #    开启console 访问 默认false
     console:
       enabled: true
       settings:
         #      开启h2 console 跟踪 方便调试  默认 false
         trace: true
         #      允许console 远程访问 默认false
         web-allow-others: true
       #  h2 访问路径上下文
       path: /h2-console
复制代码

이동 경로에 해당하는 구성 :

# 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
复制代码

읽어주십시오 이동 경로의 구성 관련 지침을.

4.3 초기화 스크립트 작성 SQL

의는 초기화 만들어 보자 SQL의 파일의 H2의 데이터베이스는 자동으로 초기화 된 스키마를 flyway 추가 할 sys_user테이블을. 명명 규칙을 유의하시기 바랍니다 . 스크립트 이름 V1.0.1__Add_table_user.sql. SQL의 의 구성 스크립트의 위치 spring.flyway.locations는 다음. 말한다 :

use `flyway`;
CREATE TABLE `sys_user`
(
    `user_id`         int(10) unsigned NOT NULL AUTO_INCREMENT,
    `username`        varchar(1024)    NOT NULL unique ,
    `encode_password` varchar(1024)       NOT NULL,
    `age`             int(3)           NOT NULL,
    PRIMARY KEY (`user_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

insert into  flyway.sys_user values (1,'Felordcn','{noop}12345',18);
复制代码

시작 봄 부팅 응용 프로그램을. 열기 H2의 데이터베이스 콘솔 http://localhost:8080/h2-console의에서 JDBC의 URL의 열 및 붙여 넣기 jdbc:h2:file:D:/h2/flyway;MODE=MySQL;DATABASE_TO_LOWER=TRUE및 클릭 한 Connect다음 인터페이스를 입력 버튼 :

여기 -1때문에 우리의 기본값은 이동 경로가 의 필요 flyway_schema_history테이블. 0때문에 H2의 데이터베이스가 자동으로 초기화 스키마를 flyway 다른 데이터베이스는 수동으로 구축해야 할 수도 있습니다.

4.4 쓰기 SQL 변경 스크립트

우리는 쓰기 V1.0.0__Delete_sysuser_felordcn.sql삭제 V1.0.1__Add_table_user.sql초기화 사용자. 당신은 우리가 수표를 열 때문에, 시작을 주어지고 있음을 발견 할 것이다, 그래서 논리 잘못된 버전의 예외가 발생합니다 . 우리는에 버전 번호가 변경됩니다 V1.0.2__Delete_sysuser_felordcn.sql다시 시작합니다. 하여 H2의 데이터베이스 콘솔 우리는 변경 로그 이상을 발견 할 것이다 :

그동안 sys_user데이터 테이블은 기대와 일치 아니다.

5. 이동 경로 모범 사례

위의 설명을 통해 나는 당신이 곧 사용할 것으로 예상 이동 경로 데이터베이스 버전 제어를. 여기에 실제 개발 경험을 요약 한 것입니다 :

  1. 생산을 금지해야합니다 spring.flyway.cleanDisabled=false.
  2. 실행 취소 모드를 사용하지 않도록하십시오.
  3. 멀티 레벨 이름을 개발 가능한 버전 번호는 팀에 따라 혼란을 방지 할 수 있습니다. 예를 들어 V1.0.1__ProjectName_{Feature|fix}_Developer_Description.sql,이 이름은 자세한 내용은 스크립트 개발자 및 관련 기능을 얻을 수 있습니다.
  4. spring.flyway.outOfOrder생산 가치 사용하여 true개발에 사용을 false.
  5. 일반적인 데이터베이스 시스템의 다수의 schema구성을 spring.flyway.table다른 시스템은 서로 다른 설정 metadata의 기본 값이 아닌 테이블을 flyway_schema_history.

6. 요약

오늘, 우리는 데이터베이스 버전 철새 이동 경로 마이그레이션 관리 도구를 소개하고, 봄 부팅과 결합된다. 이것은 크게, 우리의 데이터베이스 관리를 표준화 생산 효율을 향상시킬 수 있습니다. 또한 몇 가지 매우 유용한 실무 경험을 공유했습니다.

** DEMO 번호로 대중의 관심에 관한 : Felordcn회신을 flyway획득. **

关注公众号:Felordcn获取更多资讯

개인 블로그 : HTTPS : //felord.cn

추천

출처juejin.im/post/5db80880518825647313b34f