Spanner を PostgreSQL 言語データベースに移行する

このページでは、Spanner から別の PostgreSQL 言語データベースに移行する際の重要な考慮事項と手順について説明します。これは、Spanner または Google Cloudからアプリケーションを移行する場合に役立ちます。また、ストレス エグジットの障害対応計画など、データベースの移行の実現可能性を理解または実証する必要がある場合にも、このページの情報を使用できます。

Spanner の PostgreSQL Interface は、 Google Cloud社内または社外にある別の PostgreSQL 互換環境にデプロイするオプションが必要なアプリケーションに最適です。PostgreSQL Interface では、PostgreSQL エコシステムの使い慣れた構文と標準クライアントを使用して、デベロッパーとオペレーターが既存の PostgreSQL の知識とスキルを使用できます。

GoogleSQL 言語と同じクエリ処理、トランザクション調整、分散ストレージ、ネットワーク インフラストラクチャを使用します。ポータビリティをサポートするデータベースが必要な場合、PostgreSQL Interface を選択しても、Spanner のコア スケーラビリティ、整合性、コスト パフォーマンスのメリットを損なうことはありません。

Spanner の PostgreSQL 言語と GoogleSQL 言語の違いについて学習します。

大まかな手順は次のとおりです。

  1. クエリと DDL ステートメントから Spanner 固有の拡張機能を削除する
  2. スキーマを移行する
  3. データを移行する
  4. アプリケーションを移行する

Spanner 固有の検討事項

Spanner の PostgreSQL Interface は PostgreSQL クエリを標準でサポートしているため、Spanner PostgreSQL 言語データベースで実行されるほとんどの SQL クエリは、他の PostgreSQL 互換データベースと同じように動作します。このアプローチを使用すると、アプリケーションをプラットフォーム間で移動するために必要な SQL とデータアクセスの変更数が少なくなります。これにより、同様の GoogleSQL 言語データベースよりも移植プロセスが迅速かつ容易になり、エラーが発生しにくくなります。

PostgreSQL Interface は、PostgreSQL との幅広い互換性に加えて、Spanner 固有の拡張機能を多数提供しています。アプリケーションでこれらの拡張機能を使用する場合は、拡張機能を削除するか、PostgreSQL 機能に手動でマッピングする必要があります。注目すべき例については、クエリ構文の拡張スキーマ管理(DDL)の拡張をご覧ください。

クエリ構文の拡張

Spanner の PostgreSQL Interface は、Spanner 固有の拡張機能を多数提供しています。ほとんどは、識別に接頭辞 spanner. を使用します。次の表に、これらの拡張機能と、同じアプリケーションを PostgreSQL データベースで実行する前に必要な操作を示します。

拡張機能の種類 特定の拡張機能 移行前に行うべきこと
Spanner 固有の関数 接頭辞 spanner. の関数を見つけて、これらの呼び出しを削除します。
タイプ拡張機能 VECTOR LENGTH 構文を削除するか、pgvector の使用を検討してください。
クエリ構文 ヒントはコメント内に表示されるため、対応は必要ありません。
パフォーマンスに関する考慮事項の詳細については、クエリの移行をご覧ください。
ストアド システム プロシージャ spanner.cancel_query() の呼び出しを削除します。
必要に応じて、呼び出しを PostgreSQL の同等に置き換えることができます。
SET/SHOW オペレーション PostgreSQL には spanner. で始まる組み込みパラメータがないため、この接頭辞で変数を設定しても、想定される動作に影響しません。

スキーマ管理(DDL)拡張機能

Spanner には、データ定義言語(DDL)ページで説明されているように、データ マネジメントに関連するさまざまな拡張機能が用意されています。

拡張機能 移行前に行うべきこと
インターリーブされたテーブル
多対 1 の関連データを物理ストレージに配置することで、それらの間の結合を大幅に効率化します。
INTERLEAVE IN 句を削除します。
commit タイムスタンプ
トランザクションの commit タイムスタンプを列にアトミックに格納できます。
SPANNER.COMMIT_TIMESTAMP を PostgreSQL タイムスタンプ型に置き換えて、アプリケーションでタイムスタンプの設定を管理するか、その列を削除します。
ポイントインタイム リカバリ
偶発的な削除や書き込みから保護します。
spanner.version_retention_period を設定する DDL ステートメントを削除します。
有効期間(TTL)
レコードの自動削除を年齢に基づいてプロンプトします。
TTL INTERVAL 句を削除します。cron またはスケジュール設定されたタスクを使用して、古いデータを定期的に削除することを検討してください。行。
オプティマイザー オプション
クエリ オプティマイザーまたは統計情報が変更されたときのパフォーマンス低下の可能性を最小限に抑えるオプションを設定します。
オプティマイザー オプションを設定する DDL ステートメントを削除します。
変更ストリームは、Cloud Spanner データベースの
データ変更(挿入、更新、削除)を準リアルタイムで監視してストリーミングします。
変更ストリームに関連する DDL ステートメントを削除します。
デフォルトのリーダー
デュアルリージョン構成とマルチリージョン構成でデータベースのリーダーを指定できます。
spanner.default_leader を設定する DDL ステートメントを削除します。
地域別パーティション分割
データベース テーブル内の行をさらにセグメント化し、異なるインスタンス構成間で保存できます。
地域別パーティション分割に関連する DDL ステートメントを削除します。
シーケンス
Spanner は bit_reversed_positive シーケンスのみをサポートします。
bit_reversed_positive は、PostgreSQL で使用可能なシーケンスに置き換えます。spanner.default_sequence_kind を設定する DDL ステートメントを削除します。
地域グループ
列を個別に保存することや、階層ストレージを使用することのための列グループ戦略を定義できます。
地域グループに関連する DDL ステートメントを削除します。
検索インデックス
全文検索を実行するインデックスを定義できます。
検索インデックスに関連する DDL ステートメントをすべて削除します。

スキーマの移行

PostgreSQL 言語データベース スキーマは PostgreSQL 構文でエクスポートできます。PostgreSQL Interface を使用するように構成されたデータベースの場合、標準の PostgreSQL ドライバまたはクライアント ライブラリを使用して Spanner に接続できるサイドカー プロキシである PGAdapter を使用して psql でこれを実現できます。

psql -v ON_ERROR_STOP=1 \
  --host "$PGADAPTER_HOST" \
  --port "$PGADAPTER_PORT" \
  --dbname "$SPANNER_DATABASE" \
  -qAtX \
  -c "show database ddl"

次の gcloud コマンドを使用して、PostgreSQL 互換の SQL スクリプトとしてスキーマを出力することもできます。

gcloud spanner databases ddl describe databasename

データベースが スキーマ管理拡張機能で説明されているような Spanner 固有のスキーマ拡張機能を使用する場合、このコマンドを実行すると、それらの拡張機能が一覧表示されます。スキーマを PostgreSQL に移行する前に、これらのオブジェクトを削除する必要があります。

データの移行

Spanner の PostgreSQL Interface は、PGAdapter を使用して PostgreSQL の COPY TO STDIN 拡張機能と STDOUT 拡張機能をサポートしています。これは、Spanner との間でデータを読み込む方法の 1 つです。COPY コマンドの詳細については、Spanner の psql コマンドライン ツールのドキュメントをご覧ください。

このスクリプトは、Spanner の PostgreSQL Interface から新しい PostgreSQL データベースに少量のデータをエクスポートします(100 GB 未満のデータに推奨)。

psql -h pgadapter-host -c "COPY $TABLE TO STDOUT BINARY" | \
psql -h postgresql-host -c "COPY $TABLE FROM STDIN BINARY"

サイズの大きいテーブル(100 GB 以上のデータ)の場合は、Dataflow から CSV テンプレートにエクスポートを開始できます。

Debezium Kafka コネクタを使用してライブデータ移行を実行し、Spanner の更新を PostgreSQL にストリーミングできます。Spanner Change Streams API を使用して変更データ キャプチャ(CDC)ストリームに直接アクセスすると、さらにカスタマイズできます。

クエリの移行

Spanner の PostgreSQL Interface は、最も一般的な PostgreSQL クエリ構文、関数、演算子の多くを実装しています。

クエリでヒントを使用している場合、Spanner のクエリヒントは PostgreSQL 互換のコメントで定義されるため、クエリを書き換える必要はありません。

SELECT s.FirstName, s.LastName,
 s.SingerInfo, a.AlbumTitle, a.Charts
FROM Singers AS s
LEFT OUTER JOIN/*@JOIN_METHOD=APPLY_JOIN*/ Albums AS a
 ON s.SingerId = a.SingerId;

これらのコメントは Spanner のクエリ プランナーによって処理されますが、PostgreSQL データベースでは無視されるため、コメントを含めるか削除するかを選択できます。

新しい環境で最適なパフォーマンスを実現するには、クエリとデータベース スキーマ(インデックスなど)を新しい環境に合わせて最適化する必要があります。ベンチマーク チェックを実行して、これを実証的に確認することをおすすめします。

アプリケーションの移行

アプリケーションからの接続の場合、移行戦略は、Spanner を使用するようにアプリケーションを構成する際に行った最初の選択(PostgreSQL ドライバ、Spanner ドライバ、Spanner クライアント ライブラリを使用するかどうかなど)によって異なります。このセクションでは、各オプションの考慮事項について説明します。

PostgreSQL ドライバ

Spanner は、PGAdaper を使用して一般的な PostgreSQL クライアントをサポートします。PGAdaper は、PostgreSQL ワイヤ プロトコルを Spanner の低レベルの gRPC クエリ API に変換する軽量のプロキシです。これらのいずれかを使用している場合、別の PostgreSQL ターゲットに変更するには、接続文字列を更新して、PGAdapter プロキシではなく新しい PostgreSQL データベースを直接参照するようにします。このアプローチは優れたパフォーマンスと優れた互換性を備えているため、ポータビリティが最優先事項である場合に適しています。Spanner の PostgreSQL Interface で実行されるほとんどのクエリは、他の PostgreSQL 環境でも同じように機能します。ただし、その逆は必ずしも真実ではありません。PostgreSQL は、Spanner がサポートしていない構文と機能をサポートしています。

Spanner ドライバ

これらのドライバは、一般的な言語とアプリケーション フレームワーク用の Spanner 固有の実装です。たとえば、Spanner JDBC(Java)ドライバは PostgreSQL JDBC ドライバと同じ API を実装しているため、Spanner JDBC ドライバを使用するアプリケーションは、PostgreSQL でアプリケーションを実行するときに、同等の組み込み PostgreSQL ドライバをリンクするようにビルドプロセスを更新できます。このオプションは、すでに Spanner を使用している場合や、組み込みの PostgreSQL ドライバでは公開されない Mutations API などの Spanner 機能を活用する高パフォーマンスのソリューションを探している場合に最適です。組み込みドライバとの完全な互換性と値のポータビリティが必要な場合は、代わりに PGAdapter で PostgreSQL の組み込みドライバを使用して、ある程度のアプリケーション ポータビリティを確保することを検討してください。

詳細については、PostgreSQL ドライバと ORM をご覧ください。

Spanner クライアント ライブラリ

また、Spanner には、PostgreSQL 標準のインターフェースを実装することや、そのインターフェースを経由することなく、Spanner に直接アクセスできるさまざまな独自のクライアント ライブラリも用意されています。これらのクライアントは、Spanner 固有の機能に最大限にアクセスできますが、PostgreSQL ドライバと API 互換性はありません。これらのオプションは、特徴のパフォーマンスが最も高くなりますが、前述のオプションよりもポータビリティが低くなります。

次のステップ