Slide 1

Slide 1 text

SQLだけで マイグレーションしたい! MyNA望年LT大会2025

Slide 2

Slide 2 text

はじめまして ● 牧内大輔(MakKi) ○ @makki_d ○ makiuchi-d ● KLab株式会社 ○ スマホゲーム、主にサーバサイドや同期通信まわり ○ DBはだいたいAurora MySQL ● OSS ○ gozxing: バーコードQRコードリーダーライター ○ arelo: 自動リロードユーティリティ ○ EMLauncher: スマホでバッグアプリ配信 ○ WSNet2: スマホゲーム同期通信ライブラリ

Slide 3

Slide 3 text

https:/ /github.com/makiuchi-d/migy

Slide 4

Slide 4 text

● スキーマの変更を管理・適用する仕組み ○ 状態を進めたり(Up)戻したり(Down) ● いろいろなツールがある ○ 独立したツールだったり ORMやフレームワークに付属することも ● DSLやORMの構文で記述する場合もある DBのマイグレーション

Slide 5

Slide 5 text

DSLとかORMとか…… こんなふうに思ったこと ありますよね?

Slide 6

Slide 6 text

SQLで書いたほうがはやい!!

Slide 7

Slide 7 text

データのコピーを伴うテーブル作成 ● カラムを別テーブルに切り出す場合など ● ORMでやると……SELECTして1件1件INSERT ● SQLなら: INSERT INTO new_table (id, col) SELECT id, col FROM old_table

Slide 8

Slide 8 text

オンラインでインデックス追加 ● 長時間のロックを避けたい ● M3 Tech Blog でも話題に ○ 巨大テーブルにインデックスを追加したい、 Flywayで ○ PostgresSQLの CREATE INDEX CONCURRENTLY ● MySQLなら: CREATE INDEX … ALGORITHM=INPLACE, LOCK=NONE

Slide 9

Slide 9 text

マイグレーションもぜんぶ SQLで書きたい!

Slide 10

Slide 10 text

SQLで記述するマイグレーションツール ● Flyway, Goose, … など ● 自由なSQLが書ける ● 適用履歴の管理などをしてくれる

Slide 11

Slide 11 text

SQLの整合性は管理してくれない (Up/Downの可逆性とか)

Slide 12

Slide 12 text

https:/ /github.com/makiuchi-d/migy

Slide 13

Slide 13 text

可逆性チェック ● MySQL互換のDBエンジンを内蔵 ○ go-mysql-server ○ インプロセスDBとしてスタンドアロンで動作、 DBサーバ不要 1. チェックしたいマイグレーションの直前まで全部適用 2. スナップショット記録 3. UpのSQLを適用 4. DownのSQLを適用 5. スナップショットと現状を比較

Slide 14

Slide 14 text

可逆性チェック:スキーマ不一致 ● テーブルの構造の一致しない部分を Diff表示 $ migy check applying: 000000_init.all.sql applying: 000010_create.up.sql ---- up/down applying: 000020_alter_add.up.sql applying: 000020_alter_add.down.sql checking... create table "table1" differs: ... `val` text NOT NULL DEFAULT '', + `val2` int DEFAULT '0', PRIMARY KEY (`id`) ... check failed

Slide 15

Slide 15 text

可逆性チェック:レコード不一致 ● レコードの差分も検出(特定のカラムの違いは無視する指定も可能) $ migy check applying: 000030_insert.all.sql ---- up/down applying: 000040_alter_drop.up.sql applying: 000040_alter_drop.down.sql checking... records in "table1" differs: (1, 'aaa', 10) -(2, 'bbb', 20) -(3, 'ccc', 30) +(2, 'aaa', 20) +(3, 'aaa', 30) check failed

Slide 16

Slide 16 text

SQLだけで完結する履歴管理 ● ボイラープレート生成 ○ Up: 履歴テーブルへの INSERT文 ○ Down: 履歴の存在チェックと DELETE文 ● 本番サーバにツール不要 ○ migyで列挙したSQLファイルをmysqlコマンドに流し込む ■ .mylogin.cnf を活用できる -- Generated by migy (https://github.com/makiuchi-d/migy) INSERT INTO _migrations (id, title, applied) VALUES (10, 'user_table', now()); -- Write your forward migration SQL statements below. -- Generated by migy (https://github.com/makiuchi-d/migy) CALL _migration_exists(10); DELETE FROM _migrations WHERE id = 10; -- Write your rollback SQL statements below. user_table.up.sql user_table.down.sql

Slide 17

Slide 17 text

スナップショット( dump)生成 ● マイグレーション適用済みの SQLダンプファイルを生成 ○ Upを順に適用して出力 ○ ALTERの積み重ねが適用済み ● テーブルの最新状態がわかる ● 新規環境セットアップが迅速に

Slide 18

Slide 18 text

詳しくは技術同人誌に ● KLab Tech Book Vol. 16 ○ SQLによるDBマイグレーションの再設計 ● 技術書典オンラインマーケット ● 電子版無料

Slide 19

Slide 19 text

https:/ /github.com/makiuchi-d/migy