Table of Contents [expand]
最終更新日 2025年03月28日(金)
このガイドでは、Postgres データベースを Linode Managed PostgreSQL から Heroku Postgres に移行するプロセスについて説明します。このガイドでは、Linode Object Storage を使用してデータベースダンプファイルを保存します。移行を開始する前に、「Heroku Postgres への移行の準備」のステップを完了していることを確認してください。
データベースのサイズを取得する
ほとんどの場合、データベースのサイズが 100 GB 未満であれば、ダンプと復元の移行戦略が適しています。Linode Postgres データベースの場合、データベースのサイズを最も簡単に判断する方法は、psql クライアントを使用して直接データベースのクエリを実行することです。データベースの Postgres 資格情報は、データベースの Summary (概要) ページの Connection Details (接続の詳細) セクションで確認できます。

これらの情報を組み合わせて Postgres 接続文字列を作成できます。psql クライアントを使用するための接続文字列には、次の形式を使用します。
postgres://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_NAME
サンプルデータベースの名前は acme_org_db であるため、以下のコマンドでデータベースを psql クライアントに接続します。
$ psql postgres://akmadmin:my-password@a232051-akamai-prod-183144-default.g2a.akamaidb.net:10033/acme_org_db
接続すると、list databases \l+ コマンドでデータベースのサイズを表示できます。
$ psql=> \l+
List of databases
Name | Owner | Encoding | Collate | Size |
----------------+-----------+----------+-------------+--------+
acme_org_db | democoder | UTF8 | en_US.UTF-8 | 63 MB |
Size 列はデータベースのサイズが 63 MB であることを示しています。
データベースのサイズに適した Heroku Postgres プランを確認するには、「適切な Heroku Postgres プランの選択」を参照してください。
データベースダンプを準備する
開始する前に、システムを読み取り専用モードに設定するか、連動するすべてのサービスをオフラインにして、エンドユーザーに現在のメンテナンスステータスを通知します。
データベースが Heroku アプリにアタッチされている場合は、アプリをメンテナンスモードにします。
データをバックアップする
移行を実行する前に、Linode にデータベースの最新のバックアップがあることを確認してください。Linode のマネージドデータベースプランには、データベースの定期的なバックアップが含まれています。プランとオプションによっては、バックアップを手動でトリガーすることもできます。

データベースをローカルファイルにダンプする
pg_dump を使用して、Linode データベースをローカルファイルにダンプします。
$ 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 のファイルサイズを監視し、長いプロセスが実行中であることを確認します。
ファイルを Linode Object Storage にアップロードする
Heroku では、URL でアクセスできるファイルから Postgres データベースを復元できます。この Linode からの移行では、データバックアップファイルを Linode Object Storage にアップロードし、そのファイルの署名付き URL を取得できます。
まず、バケットを作成します。この例では、バケットに postgres-for-migration という名前を付けました。

セキュリティ保護のため、必ずバケットのアクセスポリシーを Private に設定してください。

さらに、バケットが適切な暗号化を使用していることを確認してください。バケットを作成したら、「データベースをローカルファイルにダンプする」のステップの /tmp/data-for-migration.sql ファイルをアップロードします。

復元移行を実行する
Heroku アプリを作成する
Heroku CLI を使用して Heroku アカウントにログインします。
$ heroku login
次に、Heroku アプリを作成し、postgres-migration-from-linode のように名前を付けます。
$ heroku apps:create psql-migration-from-linode
Creating ⬢ psql-migration-from-linode... done
Heroku Postgres アドオンを作成する
Heroku アプリを作成したら、適切なプランで Heroku Postgres アドオンを追加します。「データベースのサイズを取得する」で取得したデータベース情報に基づいて、Essential-1 Postgres プランを使用します。
$ heroku addons:create \
--app psql-migration-from-linode \
heroku-postgresql:essential-1
Creating heroku-postgresql:essential-1 on ⬢ psql-migration-from-linode... ~$0.013/hour (max $9/month)
Database should be available soon
postgresql-elusive-11582 is being created in the background. The app will restart when complete...
Use heroku addons:info postgresql-elusive-11582 to check creation progress
Use heroku addons:docs heroku-postgresql to view documentation
Heroku は、Heroku アプリ向けに Postgres データベースのプロビジョニングを開始し、一意の名前を指定します。数分以内にデータベース名を指定して以下のコマンドを実行し、作成したデータベースを確認できます。
$ heroku addons:info postgresql-elusive-11582
=== postgresql-elusive-11582
Attachments: psql-migration-from-linode::DATABASE
Installed at: Mon Sep 30 2024 16:00:00 GMT-0700 (Mountain Standard Time)
Max Price: $9/month
Owning app: psql-migration-from-linode
Plan: heroku-postgresql:essential-1
Price: ~$0.013/hour
State: created
Heroku Postgres に必要な拡張機能をインストールする
データを移行する前に、Linode データベースインスタンスで使用していた拡張機能をインストールします。
まず、Heroku Postgres インスタンスにすでにインストールされている拡張機能を確認するため、pg:psql を使用して Heroku Postgres インスタンスに接続します。
$ heroku pg:psql --app psql-migration-from-linode
--> Connecting to postgresql-elusive-11582
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)
Linode で使用していた拡張機能のうち、Heroku Postgres にまだインストールしていないものがあればインストールします。この例では、tablefunc および uuid-ossp の拡張機能です。
$ 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、フルテキスト検索辞書」を参照してください。
Linode Object Storage 内のファイルの署名付き URL を取得する
次に、pg_dump バックアップから新しい Heroku Postgres データベースにすべてのデータを復元します。これには、バックアップファイルを指す URL が必要です。Linode CLI を使用すると、Linode Object Storage 内の任意のリソースの署名付き URL を生成できます。
まず linode-cli configure を実行し、ローカルマシンと Linode アカウントの接続を認証して設定します。次に、以下の obj signurl 操作を実行します。
$ linode-cli obj signurl \
postgres-for-migration \
data-for-migration.sql \
+300
この操作の引数は、オブジェクト postgres-for-migration を含むバケット、オブジェクト名 data-for-migration.sql、署名付き URL の有効期限 (秒) です。このコマンドでは、適切な有効期限を 300 秒 (5 分) に設定しています。
このコマンドにより、生成された共有リンクの有効期限を設定できるダイアログも開きます。適切な有効期限を選択し、ダイアログの下部にあるアイコンをクリックして共有 URL をコピーします。
この例では、データベースダンプファイルの署名付き URL は以下のようになります。
https://us-east-1.linodeobjects.com/postgres-for-migration/data-for-migration-sql?AWSAccessKeyId=NW2B8J3W7BGY7YQWBF4W&Signature=6wk3MJaQageHnDEauBPsIUMNyEE%3D&Expires=1727721969
Heroku で復元する
署名付き URL が取得できたら、Heroku pg:backups:restore コマンドを使用して、Linode Object Storage のファイルから Heroku Postgres データベースを復元します。コマンドは次のようになります。
$ heroku pg:backups:restore 'LINODE-SIGNED-URL-IN-QUOTES' \
--app psql-migration-from-linode \
--confirm psql-migration-from-linode
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 [LINODE-SIGNED-URL] to postgresql-elusive-11582... done
Restoring... done
このコマンドでは次の点に留意してください。
- Linode の署名付き URL を貼り付ける場合は、必ず引用符で囲みます。
--app 引数を提供し、操作するアプリケーションと対応するデータベースを Heroku に指示します。- このコマンドは破壊的であるため、確認が必要です。
--confirm 引数を提供しない場合は、続行する前に操作の確認を求められます。
カスタム設定を移行する
/tmp/settings_postgres.csv というファイルに Linode データベースの構成を保存したのと同様に、以下のコマンドを使用して、Heroku Postgres の構成も保存できます。
$ heroku pg:psql --app psql-migration-from-linode \
-c "\copy (select * from pg_settings) to '/tmp/settings_heroku.csv' with (format csv, header true);"
Heroku Postgres の設定と Linode データベースの設定を比較します。Linode の設定から構成を見つけて、Heroku Postgres インスタンスに再適用します。
移行が完了したことをテストで検証する
テストを実施して、データが正常に移行されたことを検証することをお勧めします。テストでは以下のことを実施できます。
- 2 つのデータベース間でテーブル数を比較する。
- 2 つのデータベース間で各テーブルの行数を比較する。
- 2 つのデータベース間でクエリ結果を比較する。
- 新しいデータベースでさまざまな受け入れテストを実施し、適切な動作とパフォーマンスを検証する。
既存のアプリケーションとサービスを接続する
データベースの移行が完了したことを確認したら、既存のアプリケーションとサービスを新しいデータベースに接続します。
Heroku Postgres の資格情報を取得する
Heroku Postgres アドオンを作成すると、Heroku は DATABASE_URL という新しい環境変数を自動的に設定します。これには、新しいデータベースの資格情報と接続情報が含まれています。変数を取得するには、heroku config:get コマンドを実行します。
$ heroku config:get DATABASE_URL --app psql-migration-from-linode
postgres://ue1eskibf1ind1:p4419f541f3383454eb1e4f2545ed7b7a42634e818a0c77de41f344435ca6812a@cenqjqs4iipva2.cluster-czrs8kj4isg7.us-east-1.rds.amazonaws.com:5432/d9kk4avcoh8j38
heroku:pg:credentials コマンドで資格情報を検索することもできます。
Postgres URI は次の形式に従うため、個々の部分を解析できます。
postgres://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_NAME
連動するシステムを更新してテストする
この情報を使用して、Heroku Postgres に接続するように既存のシステムを更新します。各システムをテストして、接続が完了したことを確認します。
まとめ
アプリケーションとサービスが Heroku Postgres に接続され、想定どおりに実行されるようになったため、メンテナンスウィンドウを終了して、エンドユーザーの全面的なアクセスを復元できます。
移行が完了し、Linode データベースが不要になったことが確認できたら、完全に削除できます。
移行が完了すると、Heroku Postgres の柔軟性と低コストの利便性を活用できるようになります。データベースの使用についての詳細は、Heroku Postgres のドキュメントを参照してください。