본문 바로가기
DataBase

[Flyway] DB에 Flyway 적용하기

by dbjh 2022. 7. 31.
반응형

``출처: http://www.popit.kr/wp-content/uploads/2016/11/flyway-logo-tm.png

 

Flyway적용에 기본적인 환경 구성을 진행하도록하자. DB는 이미 실행되어 있다는 가정하에 진행하도록한다. 우선 실습을 진행하며 동작방식에 대해 정리해보도록하자.

flyway가 관리해줄 DB 및 스키마를 생성하도록하자.

-- DB 생성
create database flyway;

-- use flyway DB 
use flyway;

-- person table 생성
CREATE TABLE person (
 id bigint PRIMARY KEY AUTO_INCREMENT,
 name varchar(20)
);

-- table 확인
desc person;

테이블 생성까지 완료 되었다면, 아래 명령어를 실행하여 flyway를 설치하도록하자.

wget -qO- https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline/9.0.4/flyway-commandline-9.0.4-linux-x64.tar.gz | tar xvz && sudo ln -s `pwd`/flyway-9.0.4/flyway /usr/local/bin 

flyway가 설치된 것을 확인하고 해당 폴더 내부를 살펴보면 아래와 같이 노출되는 것을 확인할 수 있다.

root@258145ac3930:/flyway-9.0.4# ls
README.txt  conf  drivers  flyway  flyway.cmd  jars  jre  lib  licenses  sql

flyway를 실행하기 위해선 DB연결 정보를 세팅해줘야 하는데, "./conf/flyway.conf"파일을 수정하면된다. 아래와 같이 수정하도록하자.

# flyway.conf 파일에 DB연결 정보 세팅
flyway.url=jdbc:mysql://localhost:3306/database명
flyway.user=아이디
flyway.password=비번

# e.g.
flyway.url=jdbc:mysql://localhost:3306/flyway
flyway.user=root
flyway.password=1234

위와 같이 설정이 되었다면 flyway를 적용해보도록하자.

# 경로확인
pwd && ls

# output
/flyway-9.0.4
README.txt  conf  drivers  flyway  flyway.cmd  jars  jre  lib  licenses  sql


# flyway migrate 실행
./flyway migrate

# output
Database: jdbc:mysql://localhost:3306/flyway (MySQL 8.0)
Successfully validated 0 migrations (execution time 00:00.017s)
WARNING: No migrations found. Are your locations set up correctly?
ERROR: Found non-empty schema(s) `flyway` but no schema history table. Use baseline() or set baselineOnMigrate to true to initialize the schema history table.

migrate를 실행 했더니 위와 같은 에러가 발생하였다. 에러를 확인해보니 flyway history 테이블이 없다고 나오고 baselineOnMigrate를 true로 설정하라고 한다. conf파일을 다시열어서 세팅 후 실행하도록하자

# flyway.conf 파일 설정
flyway.baselineOnMigrate=true


# flyway migrate 재실행
./flyway migrate

#output
Flyway is up to date
Flyway Community Edition 9.0.4 by Redgate
See what's new here: https://flywaydb.org/documentation/learnmore/releaseNotes#9.0.4

Database: jdbc:mysql://localhost:3306/flyway (MySQL 8.0)
Successfully validated 0 migrations (execution time 00:00.016s)
WARNING: No migrations found. Are your locations set up correctly?
Creating Schema History table `flyway`.`flyway_schema_history` with baseline ...
Successfully baselined schema with version: 1
Current version of schema `flyway`: 1
Schema `flyway` is up to date. No migration necessary.

정상 실행되는 것을 확인할 수 있다. 그렇다면 schemahistory 테이블이 정상적으로 생성되었는지 확인해보도록하자.

mysql> show tables;
+-----------------------+
| Tables_in_flyway      |
+-----------------------+
| flyway_schema_history |
| person                |
+-----------------------+
2 rows in set (0.01 sec)


mysql> select * from flyway_schema_history;
+----------------+---------+-----------------------+----------+-----------------------+----------+--------------+---------------------+----------------+---------+
| installed_rank | version | description           | type     | script                | checksum | installed_by | installed_on        | execution_time | success |
+----------------+---------+-----------------------+----------+-----------------------+----------+--------------+---------------------+----------------+---------+
|              1 | 1       | << Flyway Baseline >> | BASELINE | << Flyway Baseline >> |     NULL | root         | 2022-07-31 06:47:41 |              0 |       1 |
+----------------+---------+-----------------------+----------+-----------------------+----------+--------------+---------------------+----------------+---------+
1 row in set (0.00 sec)

table이 정상적으로 생성된 것을 확인할 수 있다. flyway_schema_history 테이블이 바로 flyway가 DB 형상 관리를 위해 참고하는 테이블이라고 보면된다.

그렇다면 flyway는 어떻게 저 history 테이블을 이용해서 DB형상관리를 해줄까? 간단히 정리하자면, 아래와 같다.

  1. flyway에게 A 경로에 sql파일을 넣어둔다고 알려준다. (단, 알려줄때 파일명 규칙을 같이 알려줌)
  2. 실행할 sql파일을 파일명 규칙에 맞게 생성하여 A 경로에 넣어둔다.
  3. flyway 는 A 경로에서 sql 파일을 읽어 DB에 적용해준다. (단, 적용시 flyway_schema_history 테이블을 미리읽고 어떤 파일부터 적용할지를 결정)

출처: https://bkim.tistory.com/2

위의 3개의 flow대로 진행해보도록하자. 우선 flyway에게 어떤경로에 어떤 이름의 sql파일을 넣어둘지 알려주도록하자. 이 역시도 모두 conf파일에서 세팅할 수 있다.

# flyway.conf에 파일경로 설정
flyway.locations=filesystem:./sql/version

# 파일명 규칙 지정 - 파일명 'mig'로 시작
flyway.sqlMigrationPrefix=mig

flyway가 관리하는 경로와 .sql파일을 어떤 규칙의 이름으로 저장할지 세팅해두면 flyway는 history파일을 참조하여 sql파일을 적용해준다. 위처럼 설정하고 한번 migration을 진행해보자.

# 경로확인
pwd

#output
/flyway-9.0.4/sql/version

# 규칙에 맞게 .sql파일 생성
touch mig2__alter_table_person.sql

# 생성한 파일에 file에 DDL 작성
vi mig2__alter_table_person.sql

ALTER TABLE person ADD COLUMN phone_number varchar(30) NOT NULL;

 

위처럼 준비하고 migration을 진행하게되면 flway는 연결된 DB에 sql 파일을 적용해준다. 해당 파일이 정상적으로 동작되었는지 확인해보자.

mysql> select * from flyway_schema_history;
+----------------+---------+-----------------------+----------+------------------------------+------------+--------------+---------------------+----------------+---------+
| installed_rank | version | description           | type     | script                       | checksum   | installed_by | installed_on        | execution_time | success |
+----------------+---------+-----------------------+----------+------------------------------+------------+--------------+---------------------+----------------+---------+
|              1 | 1       | << Flyway Baseline >> | BASELINE | << Flyway Baseline >>        |       NULL | root         | 2022-07-31 07:09:00 |              0 |       1 |
|              2 | 2       | alter table person    | SQL      | mig2__alter_table_person.sql | -324677503 | root         | 2022-07-31 07:19:35 |             34 |       1 |
+----------------+---------+-----------------------+----------+------------------------------+------------+--------------+---------------------+----------------+---------+
2 rows in set (0.00 sec)


mysql> desc person;
+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| id           | bigint      | NO   | PRI | NULL    | auto_increment |
| name         | varchar(20) | YES  |     | NULL    |                |
| phone_number | varchar(30) | NO   |     | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

flyway_schema_history 테이블에 sql파일이 적용된 이력이 확인되고 person 테이블에도 DDL이 적용된 것을 확인할 수 있다.

flyway_schema_history 테이블은 installed_rank 컬럼으로 고유성을 관리하고 위에서 설정했던 sqlMigrationPrefix(mig)의 뒤에 설정된 값(2)을 이용해 versioning 한다. (mig2__~~~.sql 이기에 2가 버전이됨 - Int가 아니어도 무관)

init - SCHEMA_VERSION 을 baseline 과 함께 생성한다. 테이블이 이미 생성되어 있으면 수행되지 않는다.
migrate - 스키마정보를 리얼DB에 마이그레이션한다.
clean - flyway로 생성한 스키마를 모두 삭제한다고 하지만, 해당 데이터 베이스의 모든 테이블을 삭제한다.
info - DB에 적용된 스키마 정보와, 로컬에 pending 되어있는 변경 정보를 보여준다.
validate - DB에 적용된 스키마 정보와, 로컬의 변경점을 비교하여 보여준다.
repair - 마이그레이션 실패한 내역을 수정한다. (삭제, 교체)
baseline - flyway로 형상 버전관리를 시작 할 baseline 을 설정한다.

# 출처: https://bkim.tistory.com/2

 

추가적으로 알아두면 좋은사항이 있는데, flyway가 이미 적용되어 실서버와 sync된 개발환경과 그렇지 않은 개발환경이 있을 수 있다. sync가 맞지 않는 DB 형상을 맞추기 위해선 물론 추가적인 migration 작업이 필요할 것이다. migration 작업이 끝나서 flyway sql파일을 특정 시점부터 (e.g. 총 버전 10개중 6부터 적용) 적용해야하는 상황이 있을 수 있는데, 이럴때는 아래와 같이 '이 파일이 base야' 라는것을 flyway에게 알려줄 수 있다.

flyway.baselineVersion=5

위처럼 설정하고 flyway migrate를 진행하면 version 6 부터 sql파일을 적용할 수 있다.

그리고 젠킨스에서는 이미 flyway 플러그인을 제공해주기 때문에 좀더 쉽게 flyway를 적용할 수 있다.

 

flyway 적용하기 끝.

 

참고

 

Homepage - Flyway

Version control for your database. Robust schema evolution across all your environments. With ease, pleasure, and plain SQL.

flywaydb.org

 

반응형

'DataBase' 카테고리의 다른 글

[Flyway] Flyway란?  (0) 2022.07.31
[DataBase] SELECT 쿼리 실행 순서  (0) 2020.02.16

댓글