--- Title: 'HerokuのPostgreSQLのアップグレード手順 #heroku #dev #postgresql' Keywords: - heroku - dev - postgresql Author: hiro_y Web: 'https://mimemo.io/m/D1V7LGw6K4YPNj3' --- PostgreSQLのバージョンを上げるときとか、プランを変更する場合に。 ## 公式のガイド - [Upgrading Heroku Postgres Databases | Heroku Dev Center](https://devcenter.heroku.com/articles/upgrading-heroku-postgres-databases) - [Heroku PGBackups | Heroku Dev Center](https://devcenter.heroku.com/articles/heroku-postgres-backups) ## 基本戦略 新規DBを作成し(その時点でのデフォルトバージョンになる、プラン変更すればそのプランのものができる)、そのDBに今使っているDBのデータをコピー。使うDBを、新しく作ったDBに向け直す。 アプリケーション側で `DATABASE_URL` に接続するようになっていると楽なので、もしそうでない場合はそのように変更してから作業すること。 ## 手順 1. 新規DB作成 `heroku addons:create heroku-postgresql:hobby-basic -a sushi` - `hobby-basic` の部分は新しく使うHeroku Postgresのプランによって変更 - Standard以上のプランなら `heroku pg:wait -a sushi` 1. メンテナンスモードON `heroku maintenance:on -a sushi` - workerのDynoなど動いていたらそれも停める `heroku ps:scale worker=0 -a sushi` 1. バックアップ `heroku pg:backups capture DATABASE_URL -a sushi` 1. バックアップが正常に取れたのを確認 `heroku pg:backups -a sushi` 1. データコピー `heroku pg:copy DATABASE_URL {NEW_DB_NAME} -a sushi` 1. 新規DBを昇格 `heroku pg:promote {NEW_DB_NAME} -a sushi` 1. 昇格を確認 `heroku config -a sushi` - `DATABASE_URL` が変わったのを確認する 1. メンテナンスモードOFF `heroku maintenance:off -a sushi` - 停めたworkerのDynoなどあれば再開 `heroku ps:scale worker=1 -a sushi` 1. 動作確認いろいろ 1. バックアップ設定確認 `heroku pg:backups schedules -a sushi` - `DATABASE_URL` がバックアップ対象であることを確認する 1. 旧DBを破棄 `heroku addons:destroy {OLD_DB_NAME} -a sushi` 1. バックアップが正常に取れたのを確認 `heroku pg:backups -a sushi` ## 注意事項 - `sushi` はアプリケーションの名前 - 随時 `heroku pg:info -a sushi` でDBの状態を確認しつつ進むこと - これでDBの名前やPostgreSQLのバージョンがわかる - [Postico](https://eggerapps.at/postico/)などクライアントソフトを使っている場合は接続先のURLが変わるので変更を忘れないこと - Standard以上のプランではsslmodeをONにして接続が必要になる。ただし、pg側の証明書がオレオレ証明書なので、 `ssl: { rejectUnauthorized: false }` のような設定が必要。