質問するログイン新規登録

意見交換

1回答

84閲覧

DBマイグレーションの自動ロールバックの是非について

ymmr

総合スコア202

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2026/08/05 06:37

編集2026/08/05 06:39

0

0

質問したいこと

DBマイグレーションの自動ロールバックの是非についてご意見いただきたいです。

背景

CDパイプライン(GitHub Actions)で、DBマイグレーションを行っています。(golang-migrateを使用)

yaml

1jobs: 2 migrate: 3 runs-on: ubuntu-22.04 4 timeout-minutes: 30 5 6...(省略) 7 - name: migration up 8 id: migration_up 9 run: | 10 migrate -database "postgres://$DB_URL:5432/center?user=$DB_USER&password=$DB_PASS&sslmode=disable" -path ./database/migration up 11 12 - name: set dirty migrate version 13 if: failure() && steps.migration_up.outcome == 'failure' 14 id: dirty_migrate_version 15 run: | 16 version=$(migrate -database "postgres://$DB_URL:5432/center?user=$DB_USER&password=$DB_PASS&sslmode=disable" -path ./database/migration version |& awk '{print $1}') 17 echo "number=${version}" >> $GITHUB_OUTPUT 18 19 - name: migrate down 20 if: failure() && steps.migration_up.outcome == 'failure' && steps.current_migrate_version.outputs.number != steps.dirty_migrate_version.outputs.number 21 run: | 22...(省略)

自分はこれまでマイグレーションのロールバックを自動化したプロジェクトに参画したことはなかったのですが、現在参画中のプロジェクトでは上記の通りマイグレーションに失敗すると、マイグレーションレベルで自動的にロールバックされるようになっています。先日マイグレーションが失敗しロールバックされた際、このワークフロー内で行われているロールバック先のバージョンの計算にバグがあり、DBが壊れるということがありました。
幸いにもデモ環境であったため、Amazon RDSのクラスターバックアップから復元できたのですが、稼働中のリリース作業のため、本番環境であれば復旧も大変なことになるな、と危惧しておりました。結局チーム内では「自動ロールバックされないとマイグレーションが途中魔で成功した状態で放置されることになる」ということで、デモ環境で発生したマイグレーションの失敗自体の解消と、GHA内のワークフローのバグを修正して無事本番リリースすることができました。
ただ、結局これが安全なやり方だったのか疑問が残ります。
PrismaもAuto Rollbackはサポートしておらず、代わりに「expand and contract pattern」を推奨しているようです。
https://mintlify.wiki/prisma/prisma-engines/schema-engine/migrations#why-no-down-migrations

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

回答1

#1

投稿2026/08/05 06:59

編集2026/08/05 07:11

自動ロールバックって一見安全装置なんですが、今回のような「ロールバック処理自体のバグでDBが壊れる」という事例を見ると、安全装置そのものが新たな障害要因になり得るんだなと思いました!ロールバック処理は普段ほとんど実行されないのでテストも薄くなりがちですし、動くのは一番クリティカルなタイミングになりがちですよね...

一方で、dirtyのまま止めると人が対応するまで放置になるので、自動化したくなる気持ちもよく分かります。

Prismaがdown migrationをサポートしないのも、「downが本当にupの逆操作とは限らない」「データ変更には不可逆なものがある」という理由だったと認識しています。なので、expand and contractのように「ロールバックが不要な設計」を目指す考え方は理にかなっているのかなと思います

個人的には、「自動でdownする」より「そこで止めて人に通知し、必要ならPITRやバックアップで復旧する」運用のほうが安心できそうだと感じています。実際、本番で自動ロールバックを採用しているチームってどれくらいあるのでしょうかね...

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

この意見交換はまだ受付中です。

会員登録して回答してみよう

アカウントをお持ちの方は

関連した質問