Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Managing Database Migrations in Go Backend Systems

Managing Database Migrations in Go Backend Systems

https://pepabo.connpass.com/event/363869/

ペパボ & GO 〜 夏のGo祭り2025、あの夏〜でお話しました。

Avatar for Kazuhiko Yamashita

Kazuhiko Yamashita

September 16, 2025
Tweet

More Decks by Kazuhiko Yamashita

Other Decks in Programming

Transcript

  1. © GO Inc. 2 GO株式会社 山下 和彦 所属 開発本部 ソフトウェア開発統括部

     バックエンド開発部   バックエンド1グループ @pyama86
  2. © GO Inc. 4 sqldef k0kubunさんが開発したSQLで冪等にDBスキーマ管理が できるソフトウェア CREATE TABLE offices

    ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, address VARCHAR(255), city VARCHAR(100), phone VARCHAR(50), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE `offices` ADD COLUMN `city` VARCHAR(100)
  3. © GO Inc. 5 十分に解決されていないこと 1. sqldefを利用しているリポジトリに変更内容をPR 2. レビュー後マージ 3.

    開発環境は即時PR作成者が適用 4. 週に1回リリース担当のチームが変更を本番に適用
  4. © GO Inc. 7 十分に解決されていないこと 1. sqldefを利用しているリポジトリに変更内容をPR 2. レビュー後マージ 3.

    開発環境は即時PR作成者が適用 4. 週に1回リリース担当のチームが変更を本番に適用
  5. © GO Inc. 8 週に1回リリース担当のチームが変更を本番に適用 変更を行いたい人と作業者が異なるのとMySQLの特性 1. MySQLのレプリケーションは ALTERで詰まる※ 2.

    変更対象のテーブルの 件数が多い=ALTERが長期化する 3. 作業者がテーブルの行数を 確認する必要がある ※INSTANT DDLであれば高速に完了します
  6. © GO Inc. 10 運用課題を解決するalterguard作った 1. sqldefのDryRunの結果を食わせると、テーブルの行数に 応じてALTER実行するか、pt-oscするか自動で決定して実行 2. DryRunやSlack通知を備えており、自動化に特化

    3. テーブルのリネームやクリーンアップも対応 a. リネーム時に新旧のテーブル行数を精査 b. 成功時のクリーンアップだけじゃなく、失敗時の クリーンアップも対応 https://github.com/pyama86/alterguard/
  7. © GO Inc. 12 現在のバックエンドチームのDBマイグレーション 1. sqldefを利用しているリポジトリに変更内容をPR 2. レビュー後マージ 3.

    GitHub Actionsから開発環境、QA環境に自動適用 4. 週に1回リリース担当がGitHub Actionsをキック a. 本番はDryRunの後にActionsのApproveも必須
  8. © GO Inc. 13 残っている課題 1. pt-oscは銀の弾丸ではなく、メタデータロックを 取るのと、コピー時にレコードをロックするため、 状況によってはオンライン処理のトランザクションが 失敗したりする

    2. 交通インフラは高い可用性が求められるため、タクシーの 注文に重要なテーブルは深夜に適用している →運用枯れてきたら深夜に自動実行するかも?
  9. © GO Inc. 14 最後に 1. トイルをなくすために、ソフトウェア作った 2. pt-osc便利だけど、それでも様々あるね 3.

    GO、ベンチャーから会社の規模が大きくなるタイミングで 必要になる、仕組みで解決する仕事がたくさんある