Table of Contents [expand]
最終更新日 2025年03月28日(金)
このガイドでは、Postgres データベースを Google Cloud SQL から Heroku Postgres に移行するプロセスについて説明します。このガイドでは、Google Cloud Storage を使用してデータベースダンプファイルを保存します。移行を開始する前に、「Heroku Postgres への移行の準備」のステップを完了していることを確認してください。
データベースのサイズを取得する
ほとんどの場合、データベースのサイズが 100 GB 未満であれば、ダンプと復元の移行戦略が適しています。Google Cloud SQL データベースには、データベースのサイズを判断する方法がいくつかあります。Google Cloud SQL ダッシュボードからデータベースを選択すると、Overview (概要) ページの上部にメトリクスのビジュアル化が表示されます。ストレージを表示するには、Storage usage (ストレージ使用量) チャートを選択します。

この例では、ストレージ使用量は 0.36 GB、つまり約 390 MB です。ただし、この数値には、システムファイル、インストールなど、管理されたインスタンスで実行しているシステムのすべてのストレージが含まれます。そのため、実際のデータベースサイズはこの数値のほんの一部にすぎません。
より正確なサイズを読み取るには、データベースインスタンスに接続して list databases \l+ コマンドを使用します。Overview (概要) ページには、Google Cloud SQL インスタンスに接続するための Public IP address (パブリック IP アドレス) が表示されます。

psql クライアントを使用するための接続文字列には、次の形式を使用します。
postgres://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_NAME
Google Cloud SQL PostgreSQL データベースの場合、DB_USERNAME は postgres、DB_HOST はパブリック IP アドレスです。
サンプルデータベースの名前は coffeeshopdb であるため、以下のコマンドでデータベースを psql クライアントに接続します。
$ psql postgresql://postgres:mypassword@35.222.61.199:5432/coffeeshopdb
接続すると、list databases \l+ コマンドでデータベースのサイズを表示できます。
$ psql=> \l+
List of databases
Name | Owner | Encoding | Collate | Size |
----------------+----------+----------+-------------+--------+
coffeeshopdb | postgres | UTF8 | en_US.UTF-8 | 251 MB |
Size 列はデータベースのサイズが 251 MB であることを示しています。
データベースのサイズに適した Heroku Postgres プランを確認するには、「適切な Heroku Postgres プランの選択」を参照してください。
データベースダンプを準備する
開始する前に、システムを読み取り専用モードに設定するか、連動するすべてのサービスをオフラインにして、エンドユーザーに現在のメンテナンスステータスを通知します。
データベースが Heroku アプリにアタッチされている場合は、アプリをメンテナンスモードにします。
データをバックアップする
データベースの Backups (バックアップ) ページに移動して Create Backup (バックアップを作成) をクリックし、 Google でデータベースをバックアップします。

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

セキュリティ保護のため、必ず公開アクセスを防止するようにバケットのアクセスポリシーを設定してください。

さらに、バケットが適切な暗号化を使用していることを確認してください。

Google Cloud Storage でバケットを作成したら、「データベースをローカルファイルにダンプする」のステップの /tmp/data-for-migration.sql ファイルをアップロードします。

復元移行を実行する
Heroku アプリを作成する
Heroku CLI を使用して Heroku アカウントにログインします。
$ heroku login
次に、Heroku アプリを作成し、postgres-migration-from-google のように名前を付けます。
$ heroku apps:create postgres-migration-from-google
Creating ⬢ postgres-migration-from-google... done
Heroku Postgres アドオンを作成する
Heroku アプリを作成したら、適切なプランで Heroku Postgres アドオンを追加します。「データベースのサイズを取得する」で取得したデータベース情報に基づいて、Essential-1 Postgres プランを使用します。
$ heroku addons:create \
--app psql-migration-from-google \
heroku-postgresql:essential-1
Creating heroku-postgresql:essential-1 on ⬢ psql-migration-from-google... ~$0.013/hour (max $9/month)
Database should be available soon
postgresql-elliptical-46201 is being created in the background. The app will restart when complete...
Use heroku addons:info postgresql-elliptical-46201 to check creation progress
Use heroku addons:docs heroku-postgresql to view documentation
Heroku は、Heroku アプリ向けに Postgres データベースのプロビジョニングを開始し、一意の名前を指定します。数分以内にデータベース名を指定して以下のコマンドを実行し、作成したデータベースを確認できます。
$ heroku addons:info postgresql-elliptical-46201
=== postgresql-elliptical-46201
Attachments: psql-migration-from-google::DATABASE
Installed at: Mon Sep 30 2024 05:15:00 GMT-0700 (Mountain Standard Time)
Max Price: $9/month
Owning app: psql-migration-from-google
Plan: heroku-postgresql:essential-1
Price: ~$0.013/hour
State: created
Heroku Postgres に必要な拡張機能をインストールする
データを移行する前に、Google Cloud SQL インスタンスで使用していた拡張機能をインストールします。
まず、Heroku Postgres インスタンスにすでにインストールされている拡張機能を確認するため、pg:psql を使用して Heroku Postgres インスタンスに接続します。
$ heroku pg:psql --app psql-migration-from-google
--> Connecting to postgresql-elliptical-46201
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)
Google Cloud で使用していた拡張機能のうち、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、フルテキスト検索辞書」を参照してください。
Google Cloud Storage 内のファイルの署名付き URL を取得する
次に、pg_dump バックアップから新しい Heroku Postgres データベースにすべてのデータを復元します。これには、バックアップファイルを指す URL が必要です。gcloud CLI を使用すると、gcloud storage sign-url 操作を使用してこの URL を生成できます。Cloud Storage オブジェクトにアクセスする権限を持つサービスアカウントを作成したことを確認してください。コマンドは次のようになります。
$ gcloud storage sign-url \
gs://postgres-for-migration/data-for-migration.sql \
--private-key-file=/path/to/service/account/key-file.json \
--duration=10m
署名付き URL は、指定した期間のみ一時的に有効です。適切な有効期限 (10 分など) を選択してください。生成される署名付き URL には、署名のほか、クエリパラメータなどのその他のメタデータが含まれます。次の例のようになります。
https://storage.googleapis.com/postgres-for-migration/data-for-migration.sql?x-goog-signature=8bd06523e76bc303158880306af5c4fe9626b21427f69f70d2453aa95e63fd142f6825b2b0c5115d2b4ecbbf92ce9dcb3b206f92062f77db43d5ff631e083a64aa0bbe126672cf57ede6d33a229d444882db88cc5e408295f627e75f73393b9a7a42056c311f4b8b173b36836aa8aaf80ff59d4fc4819f14d33745219bb04dbc831ad85b74721201ab7be2f83afbba0601b0cf6817ed93f43121331fdc5aabb40efa2d9f606d4313255c3f85a75f6787e1ca8e58776ea9547954910522002784b3f0fab784559d6b8f97cb1648c22b229ab82811cb0185c709226502462a2fc90d44f6406d925150b4ec1f252cff18f5c1eaa43ada3b06247209bcd2445e2f1c&x-goog-algorithm=GOOG4-RSA-SHA256&x-goog-credential=gloud-sign-urls%40postgres-migration-437205.iam.gserviceaccount.com%2F20240930%2Fus-east1%2Fstorage%2Fgoog4_request&x-goog-date=20240930T063217Z&x-goog-expires=600&x-goog-signedheaders=host
Heroku で復元する
署名付き URL が取得できたら、Heroku pg:backups:restore コマンドを使用して、Google Cloud Storage のファイルから Heroku Postgres データベースを復元します。コマンドは次のようになります。
$ heroku pg:backups:restore 'GOOGLE-SIGNED-URL-IN-QUOTES' \
--app psql-migration-from-google \
--confirm psql-migration-from-google
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 [GOOGLE-SIGNED-URL] to postgresql-elliptical-46201... done
Restoring... done
このコマンドでは次の点に留意してください。
- Google の署名付き URL を貼り付ける場合は、必ず引用符で囲みます。
--app 引数を提供し、操作するアプリケーションと対応するデータベースを Heroku に指示します。- このコマンドは破壊的であるため、確認が必要です。
--confirm 引数を提供しない場合は、続行する前に操作の確認を求められます。
カスタム設定を移行する
/tmp/settings_postgres.csv というファイルに Google Cloud SQL Postgres の構成を保存したのと同様に、以下のコマンドを使用して、Heroku Postgres の構成も保存できます。
$ heroku pg:psql --app postgres-migration-from-google \
-c "\copy (select * from pg_settings) to '/tmp/settings_heroku.csv' with (format csv, header true);"
Heroku Postgres の設定と Google Cloud SQL の設定を比較します。Google の設定から構成を見つけて、Heroku Postgres インスタンスに再適用します。
移行が完了したことをテストで検証する
テストを実施して、データが正常に移行されたことを検証することをお勧めします。テストでは以下のことを実施できます。
- 2 つのデータベース間でテーブル数を比較する。
- 2 つのデータベース間で各テーブルの行数を比較する。
- 2 つのデータベース間でクエリ結果を比較する。
- 新しいデータベースでさまざまな受け入れテストを実施し、適切な動作とパフォーマンスを検証する。
既存のアプリケーションとサービスを接続する
データベースの移行が完了したことを確認したら、既存のアプリケーションとサービスを新しいデータベースに接続します。
Heroku Postgres の資格情報を取得する
Heroku Postgres アドオンを作成すると、Heroku は DATABASE_URL という新しい環境変数を自動的に設定します。これには、新しいデータベースの資格情報と接続情報が含まれています。変数を取得するには、heroku config:get コマンドを実行します。
$ heroku config:get DATABASE_URL --app psql-migration-from-google
postgres://u7j1fm3qa8npss:p890a576e7717f06e81f4bba65f8f901cd00c7a402ef6570af470c251933347eb@c2ihhcf1divl18.cluster-czrs8kj4isg7.us-east-1.rds.amazonaws.com:5432/d4sqvro2ljuspb
heroku:pg:credentials コマンドで資格情報を検索することもできます。
Postgres URI は次の形式に従うため、個々の部分を解析できます。
postgres://DB_USERNAME:DB_PASSWORD@DB_HOST:DB_PORT/DB_NAME
連動するシステムを更新してテストする
この情報を使用して、Heroku Postgres に接続するように既存のシステムを更新します。各システムをテストして、接続が完了したことを確認します。
この時点で、Google Cloud SQL データベースを停止することもできます。データベースの Overview (概要) ページの上部に移動し、Stop (停止) をクリックします。

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