Table of Contents [expand]
最終更新日 2025年03月28日(金)
このガイドでは、Postgres データベースを Vultr Managed Databases for PostgreSQL から Heroku Postgres に移行するプロセスについて説明します。このガイドでは、Vultr Object Storage を使用してデータベースダンプファイルを保存します。移行を開始する前に、「Heroku Postgres への移行の準備」のステップを完了していることを確認してください。
データベースのサイズを取得する
ほとんどの場合、データベースのサイズが 100 GB 未満であれば、ダンプと復元の移行戦略が適しています。Vultr のマネージドデータベースでは、Web UI を通じて、または psql クライアントによるデータベースのクエリを通じて、データベースのサイズを見積もることができます。Vultr アカウントにログインしたら、Databases (データベース) ページに移動し、移行するデータベースをクリックします。

データベースの Usage Graphs (使用量グラフ) タブには、ストレージとメモリの統計を示す General Usage (一般的な使用量) が表示されます。

この例では、利用可能なストレージは 55 GB のうち 3.02 GB です。ただし、この数値には、システムファイル、インストールなど、管理されたインスタンスで実行しているシステムのすべてのストレージが含まれます。そのため、実際のデータベースサイズはこの数値のほんの一部にすぎません。
より正確なサイズを読み取るには、データベースインスタンスに接続して list databases \l+ コマンドを使用します。データベースの Overview (概要) タブで、Connection Details (接続の詳細) セクションを見つけて、Copy Connection String (接続文字列をコピー) をクリックします。

psql クライアントを使用するための接続文字列には、次の形式を使用します。
postgres://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_NAME
サンプルデータベースの名前は defaultdb であるため、以下のコマンドでデータベースを psql クライアントに接続します。
$ psql postgres://vultradmin:thisismypassword@vultr-prod-7aca05a6-7c5e-4595-ac68-945a22dc0dcd-vultr-prod-bf29.vultrdb.com:16751/defaultdb
接続すると、list databases \l+ コマンドでデータベースのサイズを表示できます。
$ psql=> \l+
List of databases
Name | Owner | Encoding | Collate | Size |
----------------+------------+----------+-------------+--------+
Defaultdb | vultradmin | UTF8 | en_US.UTF-8 | 335 MB |
Size 列はデータベースのサイズが 335 MB であることを示しています。
データベースのサイズに適した Heroku Postgres プランを確認するには、「適切な Heroku Postgres プランの選択」を参照してください。
データベースダンプを準備する
開始する前に、システムを読み取り専用モードに設定するか、連動するすべてのサービスをオフラインにして、エンドユーザーに現在のメンテナンスステータスを通知します。
データベースが Heroku アプリにアタッチされている場合は、アプリをメンテナンスモードにします。
データをバックアップする
移行を実行する前に、Vultr にデータベースの最新のバックアップがあることを確認してください。Vultr は、Postgres のマネージドデータベースのスナップショットバックアップを毎日取得します。データベースの Overview (概要) タブで、Actions (アクション) セクションを見つけて、Restore From Backup (バックアップから復元) をクリックします。

ポップアップ表示されるモーダルには、Vultr が作成した利用可能なポイントインタイムバックアップが表示されます。移行の問題が発生した場合、このバックアップを Vultr の新しいデータベースクラスターに復元できます。

データベースをローカルファイルにダンプする
pg_dump を使用して、Vultr データベースをローカルファイルにダンプします。
$ pg_dump postgres://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_NAME \
-Fc -b -v \
-f /tmp/vultr-data-for-migration.sql
このコマンドの実行にかかる時間は、データベースのサイズによって異なります。/tmp/data-for-migration.sql のファイルサイズを監視し、長いプロセスが実行中であることを確認します。
ファイルを Vultr Object Storage にアップロードする
Heroku では、URL でアクセスできるファイルから Postgres データベースを復元できます。Vultr からのこの移行では、Vultr Object Storage にデータバックアップファイルをアップロードできます。
Object Storage のメインページで、バケットを作成します。この例では、バケットに postgres-for-migration という名前を付けました。

バケットを作成したら、「データベースをローカルファイルにダンプする」のステップの /tmp/data-for-migration.sql ファイルをアップロードします。Vultr Object Storage にアップロードするには、AWS CLI を使用する必要があります。指示に従って、バケットにアクセスするための適切な構成と資格情報と共に CLI を設定できます。AWS CLI で使用する情報については、メインの Object Storage ページの S3 Credentials (S3 認証情報) セクションで確認します。

Vultr にアクセスできるように AWS プロファイルを設定したら、データバックアップファイルを Vultr Object Storage バケットにアップロードします。
$ aws s3 cp \
/tmp/vultr-data-for-migration.sql \
s3://postgres-for-migration/vultr-data-for-migration.sql \
--profile=vultr
$ aws s3 ls \
s3://postgres-for-migration \
--profile=vultr
2024-10-17 10:44:00 34871869 vultr-data-for-migration.sql
復元移行を実行する
Heroku アプリを作成する
Heroku CLI を使用して Heroku アカウントにログインします。
$ heroku login
次に、Heroku アプリを作成し、postgres-migration-from-vultr のように名前を付けます。
$ heroku apps:create psql-migration-from-vultr
Creating ⬢ psql-migration-from-vultr... done
Heroku Postgres アドオンを作成する
Heroku アプリを作成したら、適切なプランで Heroku Postgres アドオンを追加します。「データベースのサイズを取得する」で取得したデータベース情報に基づいて、Essential-1 Postgres プランを使用します。
$ heroku addons:create \
--app psql-migration-from-vultr \
heroku-postgresql:essential-1
Creating heroku-postgresql:essential-1 on ⬢ psql-migration-from-vultr... ~$0.013/hour (max $9/month)
Database should be available soon
postgresql-defined-13934 is being created in the background. The app will restart when complete...
Use heroku addons:info postgresql-defined-13934 to check creation progress
Use heroku addons:docs heroku-postgresql to view documentation
Heroku は、Heroku アプリ向けに Postgres データベースのプロビジョニングを開始し、一意の名前を指定します。数分以内にデータベース名を指定して以下のコマンドを実行し、作成したデータベースを確認できます。
$ heroku addons:info postgresql-defined-13934
=== postgresql-defined-13934
Attachments: psql-migration-from-vultr::DATABASE
Installed at: Thu Oct 17 2024 11:15:00 GMT-0700 (Mountain Standard Time)
Max Price: $9/month
Owning app: psql-migration-from-vultr
Plan: heroku-postgresql:essential-1
Price: ~$0.013/hour
State: created
Heroku Postgres に必要な拡張機能をインストールする
データを移行する前に、Vultr Postgres インスタンスで使用していた拡張機能をインストールします。
まず、Heroku Postgres インスタンスにすでにインストールされている拡張機能を確認するため、pg:psql を使用して Heroku Postgres インスタンスに接続します。
$ heroku pg:psql --app psql-migration-from-vultr
--> Connecting to postgresql-defined-13934
psql (16.4 (Ubuntu 16.4-1.pgdg20.04+1), server 16.2)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
psql=> \dx
List of installed extensions
Name | Version | Schema | Description
--------------------+---------+------------+-------------------------------
pg_stat_statements | 1.10 | public | track planning and executio...
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
Vultr で使用していた拡張機能のうち、Heroku Postgres にまだインストールしていないものがあればインストールします。この例では、tablefunc 拡張機能です。
$ psql=> CREATE EXTENSION IF NOT EXISTS tablefunc;
CREATE EXTENSION
psql=> \dx
List of installed extensions
Name | Version | Schema | Description
--------------------+---------+------------+-------------------------------
pg_stat_statements | 1.10 | public | track planning and execution…
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
tablefunc | 1.0 | public | functions that manipulate…
(3 rows)
サポートされている拡張機能とそのインストール方法については、「Heroku Postgres での拡張機能、PostGIS、フルテキスト検索辞書」を参照してください。
Vultr Object Storage 内のファイルの署名付き URL を取得する
次に、pg_dump バックアップから新しい Heroku Postgres データベースにすべてのデータを復元します。これには、バックアップファイルを指す URL が必要です。ファイルのアップロードと同様に、aws CLI を使用します。
$ aws s3 presign \
s3://postgresql-for-migration/vultr-data-for-migration.sql \
--expires-in 600 \
--profile=vultr
この操作では、s3 presign はアクセスするファイルの S3 URI を取得します。また、Heroku のデータベース復元プロセスのためにこのファイルにアクセスして使用するには、--expires-in を 600 秒 (10 分) に設定します。
この例では、データベースダンプファイルの署名付き URL は以下のようになります。
https://ewr1.vultrobjects.com/postgres-for-migration/vultr-data-for-migration.sql?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=P2E4IUE037MG2HBIBHGZ%2F20241017%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241017T174614Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=63e91914dc1de6f691ff8d17ae4040bcd932b33f7929112736af8a6140c111c3
Heroku で復元する
署名付き URL が取得できたら、Heroku pg:backups:restore コマンドを使用して、Vultr Cloud Object Storage から Heroku Postgres データベースを復元します。コマンドは次のようになります。
$ heroku pg:backups:restore 'VULTR-PRESIGNED-URL-IN-QUOTES' \
--app psql-migration-from-vultr \
--confirm psql-migration-from-vultr
Use Ctrl-C at any time to stop monitoring progress; the backup will continue restoring.
Use heroku pg:backups to check progress.
Stop a running restore with heroku pg:backups:cancel.
Starting restore of [VULTR-PRESIGNED-URL] to postgresql-defined-13934... done
Restoring... done
このコマンドでは次の点に留意してください。
- Vultr Object Storage の署名付き URL を貼り付ける場合は、必ず引用符で囲みます。
--app 引数を提供し、操作するアプリケーションと対応するデータベースを Heroku に指示します。- このコマンドは破壊的であるため、確認が必要です。
--confirm 引数を提供しない場合は、続行する前に操作の確認を求められます。
カスタム設定を移行する
/tmp/settings_postgres.csv というファイルに Vultr Postgres の構成を保存したのと同様に、以下のコマンドを使用して、Heroku Postgres の構成も保存できます。
$ heroku pg:psql --app psql-migration-from-vultr \
-c "\copy (select * from pg_settings) to '/tmp/settings_heroku.csv' with (format csv, header true);"
Heroku Postgres の設定と Vultr Postgres の設定を比較します。Vultr Postgres の設定から構成を見つけて、Heroku Postgres インスタンスに再適用します。
移行が完了したことをテストで検証する
テストを実施して、データが正常に移行されたことを検証することをお勧めします。テストでは以下のことを実施できます。
- 2 つのデータベース間でテーブル数を比較する。
- 2 つのデータベース間で各テーブルの行数を比較する。
- 2 つのデータベース間でクエリ結果を比較する。
- 新しいデータベースでさまざまな受け入れテストを実施し、適切な動作とパフォーマンスを検証する。
既存のアプリケーションとサービスを接続する
データベースの移行が完了したことを確認したら、既存のアプリケーションとサービスを新しいデータベースに接続します。
Heroku Postgres の資格情報を取得する
Heroku Postgres アドオンを作成すると、Heroku は DATABASE_URL という新しい環境変数を自動的に設定します。これには、新しいデータベースの資格情報と接続情報が含まれています。変数を取得するには、heroku config:get コマンドを実行します。
$ heroku config:get DATABASE_URL --app psql-migration-from-vultr
postgres://ubakjtsu83gfqg:pc89708e066d76abaa88f11e8b5323dd6342e75a3f82abdbef6ed5774833e536e@cbhk6rs82poqi7.cluster-czrs8kj4isg7.us-east-1.rds.amazonaws.com:5432/d3vb4v6d29acr4
heroku:pg:credentials コマンドで資格情報を検索することもできます。
Postgres URI は次の形式に従うため、個々の部分を解析できます。
postgres://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_NAME
連動するシステムを更新してテストする
この情報を使用して、Heroku Postgres に接続するように既存のシステムを更新します。各システムをテストして、接続が完了したことを確認します。
まとめ
アプリケーションとサービスが Heroku Postgres に接続され、想定どおりに実行されるようになったため、メンテナンスウィンドウを終了して、エンドユーザーの全面的なアクセスを復元できます。
移行が成功し、Vultr データベースが不要になったことが確認できたら、完全に削除できます。データベースの Settings (設定) タブに移動し、Destroy Database Instance (データベースインスタンスを破棄) をクリックします。

移行が完了すると、Heroku Postgres の柔軟性と低コストの利便性を活用できるようになります。データベースの使用についての詳細は、Heroku Postgres のドキュメントを参照してください。