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

この例では、ストレージはこのインスタンスの合計 25 GB の 1.78%、約 440 MB です。ただし、この数値には、システムファイル、インストールなど、管理されたインスタンスで実行しているシステムのすべてのストレージが含まれます。そのため、実際のデータベースサイズはこの数値のほんの一部にすぎません。
より正確なサイズを読み取るには、データベースインスタンスに接続して list databases \l+ コマンドを使用します。データベースの Postgres 資格情報は、データベース情報ページの Public connection (パブリック接続) セクションで確認できます。

接続文字列を表示してコピーします。psql クライアントを使用するための接続文字列には、次の形式を使用します。
postgres://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_NAME
サンプルデータベースの名前は Adventureworks であるため、以下のコマンドでデータベースを psql クライアントに接続します。
$ psql postgres://upadmin:mydatabasepassword@public-demo-schcpsmhczcm.db.upclouddatabases.com:11569/Adventureworks
接続すると、list databases \l+ コマンドでデータベースのサイズを表示できます。
$ psql=> \l+
List of databases
Name | Owner | Encoding | Collate | Size |
----------------+-----------+----------+-------------+--------+
Adventureworks | democoder | UTF8 | en_US.UTF-8 | 112 MB |
Size 列はデータベースのサイズが 112 MB であることを示しています。
データベースのサイズに適した Heroku Postgres プランを確認するには、「適切な Heroku Postgres プランの選択」を参照してください。
データベースダンプを準備する
開始する前に、システムを読み取り専用モードに設定するか、連動するすべてのサービスをオフラインにして、エンドユーザーに現在のメンテナンスステータスを通知します。
データベースが Heroku アプリにアタッチされている場合は、アプリをメンテナンスモードにします。
データをバックアップする
移行を実行する前に、UpCloud にデータベースの最新のバックアップがあることを確認してください。UpCloud は、Postgres のマネージドデータベースのスナップショットバックアップを定期的に取得します。最新のバックアップがいつ行われたかを確認するには、データベースの Backups (バックアップ) ページに移動します。

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

バケットを作成したら、「データベースをローカルファイルにダンプする」のステップの /tmp/data-for-migration.sql ファイルをアップロードします。UpCloud の Object Storage ページの下部に、AWS CLI connection guide (AWS CLI 接続ガイド) というセクションがあります。

このセクションではローカルマシンを構成する方法を説明します。構成すると、AWS CLI を使用して UpCloud のオブジェクトストレージにアクセスできるようになります。これは AWS S3 を使用する場合と同様です。UpCloud にアクセスできるように AWS プロファイルを設定したら、データバックアップファイルを UpCloud のオブジェクトストレージバケットにアップロードします。
$ aws s3 cp \
/tmp/data-for-migration.sql \
s3://postgres-for-migration/data-for-migration.sql \
--profile=upcloud
$ aws s3 ls \
s3://postgres-for-migration \
--profile=upcloud
2024-09-29 21:00:00 19289064 data-for-migration.sql
復元移行を実行する
Heroku アプリを作成する
Heroku CLI を使用して Heroku アカウントにログインします。
$ heroku login
次に、Heroku アプリを作成し、postgres-migration-from-upcloud のように名前を付けます。
$ heroku apps:create psql-migration-from-upcloud
Creating ⬢ psql-migration-from-upcloud... done
Heroku Postgres アドオンを作成する
Heroku アプリを作成したら、適切なプランで Heroku Postgres アドオンを追加します。「データベースのサイズを取得する」で取得したデータベース情報に基づいて、Essential-1 Postgres プランを使用します。
$ heroku addons:create \
--app psql-migration-from-upcloud \
heroku-postgresql:essential-1
Creating heroku-postgresql:essential-1 on ⬢ psql-migration-from-upcloud... ~$0.013/hour (max $9/month)
Database should be available soon
postgresql-rectangular-63793 is being created in the background. The app will restart when complete...
Use heroku addons:info postgresql-rectangular-63793 to check creation progress
Use heroku addons:docs heroku-postgresql to view documentation
Heroku は、Heroku アプリ向けに Postgres データベースのプロビジョニングを開始し、一意の名前を指定します。数分以内にデータベース名を指定して以下のコマンドを実行し、作成したデータベースを確認できます。
$ heroku addons:info postgresql-rectangular-63793
=== postgresql-rectangular-63793
Attachments: psql-migration-from-upcloud::DATABASE
Installed at: Sun Sep 29 2024 21:30:00 GMT-0700 (Mountain Standard Time)
Max Price: $9/month
Owning app: psql-migration-from-upcloud
Plan: heroku-postgresql:essential-1
Price: ~$0.013/hour
State: created
Heroku Postgres に必要な拡張機能をインストールする
データを移行する前に、UpCloud Postgres インスタンスで使用していた拡張機能をインストールします。
まず、Heroku Postgres インスタンスにすでにインストールされている拡張機能を確認するため、pg:psql を使用して Heroku Postgres インスタンスに接続します。
$ heroku pg:psql --app psql-migration-from-upcloud
--> Connecting to postgresql-rectangular-63793
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)
UpCloud で使用していた拡張機能のうち、Heroku Postgres にまだインストールされていないものがあればインストールします。この例では、tablefunc および sslinfo の拡張機能です。
$ psql=> CREATE EXTENSION IF NOT EXISTS tablefunc;
CREATE EXTENSION
psql=> CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
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…
uuid-ossp | 1.1 | public | generate universally unique…
(4 rows)
サポートされている拡張機能とそのインストール方法については、「Heroku Postgres での拡張機能、PostGIS、フルテキスト検索辞書」を参照してください。
UpCloud Object Storage 内のファイルの署名付き URL を取得する
次に、pg_dump バックアップから新しい Heroku Postgres データベースにすべてのデータを復元します。これには、バックアップファイルを指す URL が必要です。ファイルのアップロードと同様に、aws CLI を使用します。
この操作では、s3 presign はアクセスするファイルの S3 URI を取得します。また、Heroku のデータベース復元プロセスのためにこのファイルにアクセスして使用するには、--expires-in を 600 秒 (10 分) に設定します。
この例では、データベースダンプファイルの署名付き URL は以下のようになります。
https://l40iu.upcloudobjects.com/postgresql-for-migration/data-for-migration.sql?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA01A66C4C55E16975%2F20240930%2Feurope-1%2Fs3%2Faws4_request&X-Amz-Date=20240930T045349Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=b70c61e1957311346455c64e0229e8e1415347cf163eb481e7b7f4486ae06984
Heroku で復元する
署名付き URL が取得できたら、Heroku pg:backups:restore コマンドを使用して、UpCloud Object Storage ファイルから Heroku Postgres データベースを復元します。コマンドは次のようになります。
$ heroku pg:backups:restore 'UPCLOUD-PRESIGNED_URL-IN-QUOTES' \
--app psql-migration-from-upcloud \
--confirm psql-migration-from-upcloud
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 [UPCLOUD-PRESIGNED-URL] to postgresql-rectangular-63793... done
Restoring... done
このコマンドでは次の点に留意してください。
- UpCloud Object Storage の署名付き URL を貼り付ける場合は、必ず引用符で囲みます。
--app 引数を提供し、操作するアプリケーションと対応するデータベースを Heroku に指示します。- このコマンドは破壊的であるため、確認が必要です。
--confirm 引数を提供しない場合は、続行する前に操作の確認を求められます。
カスタム設定を移行する
/tmp/settings_postgres.csv というファイルに UpCloud Postgres の構成を保存したのと同様に、以下のコマンドを使用して、Heroku Postgres の構成も保存できます。
$ heroku pg:psql --app psql-migration-from-upcloud \
-c "\copy (select * from pg_settings) to '/tmp/settings_heroku.csv' with (format csv, header true);"
Heroku Postgres の設定と UpCloud Postgres の設定を比較します。UpCloud 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-upcloud
postgres://u4pjafvp2at0o7:paa9b63e0bd441af5e1b2d829bf0e4601063b4cbb66dceeb4736b2e3db141c85d@cenqjqs4iipva2.cluster-czrs8kj4isg7.us-east-1.rds.amazonaws.com:5432/d32ljn8e55ahm5
heroku:pg:credentials コマンドで資格情報を検索することもできます。
Postgres URI は次の形式に従うため、個々の部分を解析できます。
postgres://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_NAME
連動するシステムを更新してテストする
この情報を使用して、Heroku Postgres に接続するように既存のシステムを更新します。各システムをテストして、接続が完了したことを確認します。
この時点で、UpCloud データベースを一時停止することもできます。UpCloud データベースページの右上にある Shut down (シャットダウン) ボタンをクリックします。

まとめ
アプリケーションとサービスが Heroku Postgres に接続され、想定どおりに実行されるようになったため、メンテナンスウィンドウを終了して、エンドユーザーの全面的なアクセスを復元できます。
移行が成功し、UpCloud データベースが不要になったことが確認できたら、完全に削除できます。
移行が完了すると、Heroku Postgres の柔軟性と低コストの利便性を活用できるようになります。データベースの使用についての詳細は、Heroku Postgres のドキュメントを参照してください。