20
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Flyway + MySQL + Docker でマイグレーション環境構築

Last updated at Posted at 2019-09-03

TL; DR

FlywayでMySQLのコンテナにマイグレーションします。

ソースはこちら
https://github.com/OskaMathis/flyway-sample

Flyway

オープンソースのDBマイグレーションツールです。使い方がシンプルなので好印象。
今回は公式で用意されているDockerイメージを使ってマイグレーション環境を構築します。

環境構築

設定ファイル作成

Flywayとマイグレーションを実行するDBの設定をします。

flyway.conf

flyway.url=jdbc:mysql://db/sample
flyway.user=root
flyway.password=root
docker-compose.yml

version: '3.4'

x-template: &flyway-template
  image: flyway/flyway:6.0.1
  volumes:
    - ./sql:/flyway/sql
    - ./conf:/flyway/conf

services:
  flyway-clean:
    <<: *flyway-template
    command: clean

  flyway-migrate:
    <<: *flyway-template
    command: migrate

  flyway-info:
    <<: *flyway-template
    command: info

  flyway-repair:
    <<: *flyway-template
    command: repair

  db:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: sample
      MYSQL_ROOT_PASSWORD: root
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    ports:
      - 3306:3306

SQL作成

Flywayで使用するSQLファイルには命名規則が存在するので要注意です。
(参考: https://flywaydb.org/documentation/migrations#naming)

V0.1.0__create_table.sql

CREATE TABLE users (id INT, name VARCHAR(45));
V0.1.1__insert_data.sql

INSERT INTO users VALUES (1, "anonymous user");

ディレクトリ構成


$ tree
.
├── conf
│   └── flyway.conf
├── docker-compose.yml
└── sql
    ├── V0.1.0__create_table.sql
    └── V0.1.1__insert_data.sql

実行

DBコンテナ起動


$ docker-compose up -d db
Creating network "sample_flyway_default" with the default driver
Creating sample_flyway_db_1 ... done

マイグレーション

sqlディレクトリ内のSQLファイルがバージョンの順に実行されます。
コンテナ起動直後に実行するとエラーが出ることがありますので、コンテナがちゃんと立ち上がりきるまで待ちましょう。


$ docker-compose run --rm flyway-migrate
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Successfully validated 2 migrations (execution time 00:00.032s)
Creating Schema History table `sample`.`flyway_schema_history` ...
Current version of schema `sample`: << Empty Schema >>
Migrating schema `sample` to version 0.0.1 - create table
Migrating schema `sample` to version 0.0.2 - insert data
Successfully applied 2 migrations to schema `sample` (execution time 00:00.264s)

マイグレーション履歴

どのバージョンのマイグレーションまで実行されているかを出力してくれます。


$ docker-compose run --rm flyway-info
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Schema version: 0.0.2

+-----------+---------+--------------+------+---------------------+---------+
| Category  | Version | Description  | Type | Installed On        | State   |
+-----------+---------+--------------+------+---------------------+---------+
| Versioned | 0.0.1   | create table | SQL  | 2019-09-11 03:15:25 | Success |
| Versioned | 0.0.2   | insert data  | SQL  | 2019-09-11 03:15:25 | Success |
+-----------+---------+--------------+------+---------------------+---------+

データベース上の全テーブル削除

やんごとなき理由でDBの中身を一度リセットしたい場合に実行すると良いでしょう。
Flywayで作成してないテーブルに関しても削除されます。


$ docker-compose run --rm flyway-clean
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Successfully cleaned schema `sample` (execution time 00:00.044s)
$ docker-compose run --rm flyway-info
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Schema version: << Empty Schema >>

+-----------+---------+--------------+------+--------------+---------+
| Category  | Version | Description  | Type | Installed On | State   |
+-----------+---------+--------------+------+--------------+---------+
| Versioned | 0.0.1   | create table | SQL  |              | Pending |
| Versioned | 0.0.2   | insert data  | SQL  |              | Pending |
+-----------+---------+--------------+------+--------------+---------+

マイグレーション失敗時の修復

マイグレーションに失敗すると、 StateFailed になるのですが、この状態でSQLを修正して再度マイグレーションしようとしてもエラーになります。

$ docker-compose run --rm flyway-info
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Schema version: 0.0.2

+-----------+---------+--------------+------+---------------------+---------+
| Category  | Version | Description  | Type | Installed On        | State   |
+-----------+---------+--------------+------+---------------------+---------+
| Versioned | 0.0.1   | create table | SQL  | 2019-09-11 03:28:11 | Success |
| Versioned | 0.0.2   | insert data  | SQL  | 2019-09-11 03:28:11 | Failed  |
+-----------+---------+--------------+------+---------------------+---------+
$ docker-compose run --rm flyway-migrate
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
ERROR: Validate failed: Detected failed migration to version 0.0.2 (insert data)

repair コマンドを実行することで該当のマイグレーションが Pending になるので、マイグレーションが実行可能になります。

$ docker-compose run --rm flyway-repair
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Successfully repaired schema history table `sample`.`flyway_schema_history` (execution time 00:00.073s).
$ docker-compose run --rm flyway-info
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Schema version: 0.0.1

+-----------+---------+--------------+------+---------------------+---------+
| Category  | Version | Description  | Type | Installed On        | State   |
+-----------+---------+--------------+------+---------------------+---------+
| Versioned | 0.0.1   | create table | SQL  | 2019-09-11 04:34:13 | Success |
| Versioned | 0.0.2   | insert data  | SQL  |                     | Pending |
+-----------+---------+--------------+------+---------------------+---------+
$ docker-compose run --rm flyway-migrate
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Successfully validated 2 migrations (execution time 00:00.033s)
Current version of schema `sample`: 0.0.1
Migrating schema `sample` to version 0.0.2 - insert data
Successfully applied 1 migration to schema `sample` (execution time 00:00.159s)

参考

20
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?