PostgreSQLのメジャーバージョンを上げるときなど、通常のデータの読み書きとは異なる更新をDBに対して行うことがあります。 ここではHerokuの公式ドキュメントである「[Heroku Postgres データベースのバージョンのアップグレード](https://devcenter.heroku.com/ja/articles/upgrading-heroku-postgres-databases)」を参考に、このようなアップデート等の変更をDBに行うときの大まかな流れをご紹介します。 ## DBにアップデート等の変更を行うときの作業の流れ ### 新たなDBを作成する メジャーバージョンを上げるといった大きな更新をするときには、 何かあったときにすぐに戻せるよう、元のDBには手を入れずそのままにして温存します。 代わりに、`addons:create`コマンドなどで、大きな更新を行う別の新たなDBを作成します。 ### DBへの書き込みを停止させて、データを完璧に複製する `addons:create`コマンドの`--follow`オプションや`pg:copy`コマンドを利用して、 元のDBから新たなDBにデータをコピーします。 この際、適切にアプリをメンテナンスモードにするなどして、元のDBへの書き込みを停止させ、 停止している間に元のDBのデータの全てが新たなDBに複製されている状態にします。 ちなみに、公式ドキュメントには記載がありませんが、 バックアップが短時間で終わるデータの規模であるならば、 トラブルに備えてこの書き込みが停止しているタイミングで元のDBのバックアップを手動で作成しても良いように思います。 ### 新たなDBに手を加える メジャーバージョンの更新などの必要があれば、新たなDBに手を加えます。 ### アプリの接続先を元のDBから新たなDBに切り替える `pg:promote`コマンドを利用して、アプリが読み書きする対象を新たなDBに切り替えます。 ### アプリを公開してテストする メンテナンスモードを解除するなどして、アプリを公開状態に戻します。 本番環境が問題なく動いているかテストを行います。 何かしら問題がある場合には、アプリの接続先を元のDBに迅速に戻すことで、被害が最小化できるはずです。 ### 不要になったDBを削除する 元のDBなどが不要になった場合など、`addons:destroy`コマンドなどを利用して、不要になったDBを削除します。 ## (参考)ステージングアプリを利用したテスト より安全にDBの更新などを行うために、本番のアプリのDBを更新する前に、ステージングのアプリでDBの更新をテストすることも可能です。詳細は[PostgreSQL メジャーバージョンのアップグレードのテスト](https://devcenter.heroku.com/ja/articles/testing-postgresql-version-upgrades)をご覧ください。