データのインポートとエクスポートに関するベスト プラクティス

このページでは、Cloud SQL を使用してデータのインポートまたはエクスポートを行う際のベスト プラクティスについて説明します。Cloud SQL にデータをインポートする手順については、データのインポートをご覧ください。データが Cloud SQL にある場合も、お客様が管理しているインスタンスにある場合も、データをエクスポートするための手順については、データのエクスポートをご覧ください。

インポートとエクスポートのベスト プラクティス

データをインポートおよびエクスポートする際に考慮すべきベスト プラクティスは次のとおりです。

Cloud Storage リクエスト元による支払いバケットを使用しない

Cloud SQL からのインポートとエクスポートに、リクエスト元による支払いが有効になっている Cloud Storage バケットは使用できません。

エクスポートのパフォーマンスへの影響を最小限に抑える

Cloud SQL からの標準エクスポートの場合、データベースがオンラインであるときにエクスポートが実行されます。エクスポートされるデータが小さい場合、影響は最小限であると考えられます。しかし、大きなデータベースがある場合や、BLOB などの大きいオブジェクトがデータベースにある場合、エクスポートによってデータベースのパフォーマンスが低下する可能性があります。これは、データベースに対するデータベース クエリとオペレーションの実行にかかる時間に影響します。エクスポートの開始後は、データベースのレスポンスが遅くなっても停止することはできません。

エクスポート中にレスポンスが低速になるのを回避するには、次のようにします。

  1. リードレプリカからエクスポートを取得します。エクスポートを頻繁に(毎日またはそれ以上の頻度で)行う場合、エクスポートされるデータ量が少なければ、これが適切な選択肢になります。リードレプリカからエクスポートするには、Google Cloud コンソール、gcloud、または REST API を使用して、リードレプリカ インスタンスに対してエクスポート機能を実行します。リードレプリカの作成と管理の方法については、リードレプリカの作成をご覧ください。

  2. サーバーレス エクスポートを使用します。サーバーレス エクスポートを使用すると、エクスポート オペレーションをオフロードするために、個別の一時的なインスタンスが Cloud SQL によって作成されます。エクスポート オペレーションをオフロードすると、プライマリ インスタンスのデータベースでクエリの送信を継続するので、通常のパフォーマンス速度でオペレーションを実行できます。データのエクスポートが完了すると、一時的なインスタンスは自動的に削除されます。大規模なデータベースの 1 回限りのエクスポートを作成する場合は、これが適切な選択肢になります。サーバーレス エクスポート オペレーションを実行するには、Google Cloud コンソール、gcloud または REST API で、offload フラグを指定してエクスポート機能を実行します。

    サーバーレス エクスポート オペレーションの最中は、インスタンスの編集、インポート、フェイルオーバーなどの他の一部のオペレーションを行えます。ただし、delete を選択すると、インスタンスを削除した後、エクスポート オペレーションはしばらく停止し、その間、データはエクスポートされません。

    サーバーレス エクスポート オペレーションの実行中にブロックされる可能性があるオペレーションについては、次の表をご覧ください。
    現在のオペレーション 新しいオペレーション ブロックの有無
    任意のオペレーション サーバーレス エクスポート あり
    サーバーレス エクスポート サーバーレス エクスポートを除くオペレーション なし
    サーバーレス エクスポートを除くオペレーション サーバーレス エクスポートを除くオペレーション あり

    サーバーレス エクスポートでは、一時インスタンスの作成に時間がかかるため、標準エクスポートよりも時間がかかります。最短でも 5 分以上かかりますが、大規模なデータベースの場合は、さらに時間がかかることもあります。使用するエクスポート方法を決定する前に、時間、パフォーマンス、費用への影響を検討してください。

SQL ダンプファイルの作成時に正しいフラグを使用する

データを SQL ダンプファイルにエクスポートするときに正しい手順で行わなかった場合、インポートが失敗する可能性があります。Cloud SQL にインポートするための SQL ダンプファイルの作成方法については、データのエクスポートをご覧ください。

コスト削減のためデータを圧縮する

Cloud SQL では、圧縮ファイルと非圧縮ファイルの両方のインポートとエクスポートがサポートされています。特に大きいインスタンスをエクスポートするときは、圧縮すると Cloud Storage のストレージ スペースを大幅に節約でき、ストレージ コストの削減にもなります。

SQL ダンプファイルや CSV ファイルをエクスポートする場合は、ファイル拡張子 .gz を使用してデータを圧縮します。ファイル拡張子 .gz のファイルは、インポートすると自動的に解凍されます。

長時間にわたるインポートおよびエクスポート プロセスの削減

処理対象のデータのサイズによっては、Cloud SQL へのインポートと Cloud SQL からのエクスポートが長時間にわたる可能性があります。その結果、次の影響があります。

  • 長時間実行されている Cloud SQL インスタンス オペレーションを停止できません。
  • 各インスタンスに対して実行できるインポートまたはエクスポート オペレーションは、一度に 1 つのみです。長時間にわたるインポートまたはエクスポートにより、毎日の自動バックアップなど、他のオペレーションがブロックされます。サーバーレス エクスポートの場合は、インスタンスの編集、インポート、フェイルオーバー、毎日の自動バックアップのブロック解除など、他のオペレーションを実行できます。

Cloud SQL のインポートまたはエクスポート機能をバッチサイズのより小さいデータで使用して、各オペレーションの完了に要する時間を短縮できます。

エクスポートの場合は、リードレプリカからエクスポートを行うか、サーバーレス エクスポートを使用してデータベースのパフォーマンスへの影響を最小限に抑えつつ、エクスポートの実行中にインスタンスで他のオペレーションを実行できます。

その他のヒントについては、Cloud SQL インスタンスにおける問題を診断するをご覧ください。

インポートしたデータベースを確認する

インポートが完了したら、データベースに接続し、該当するデータベース コマンドを実行して内容が正しいことを確認します。たとえば接続して、データベース、テーブル、特定のエントリを一覧表示します。

既知の制限事項

既知の制限事項のリストについては、データのインポートとエクスポートに関する問題をご覧ください。

エクスポート オペレーションの自動化

Cloud SQL にはデータベースのエクスポートを自動化するための組み込みの機能はありませんが、いくつかの Google Cloud コンポーネントを使用して、独自の自動化ツールを構築できます。詳細については、このチュートリアルをご覧ください。

トラブルシューティング

インポート オペレーションのトラブルシューティング

問題 トラブルシューティング
エラー メッセージ: permission denied for schema public PostgreSQL バージョン 15 以降では、ターゲット データベースが template0 から作成されている場合、データのインポートが失敗することがあります。この問題を解決するには、GRANT ALL ON SCHEMA public TO cloudsqlsuperuser SQL コマンドを実行して、cloudsqlsuperuser ユーザーに公開スキーマ権限を付与します。
HTTP Error 409: Operation failed because another operation was already in progress 保留中のオペレーションがインスタンスにすでに存在しています。一度に実行できるオペレーションは 1 つだけです。現在のオペレーションが完了してからリクエストを試してください。
インポート オペレーションに時間がかかりすぎる。 アクティブな接続が多すぎると、インポート オペレーションが妨げられる可能性があります。

未使用のオペレーションを終了します。Cloud SQL インスタンスの CPU とメモリの使用量をチェックして、十分なリソースがあることを確認します。インポートに最大限のリソースを確保するため、オペレーションを開始する前にインスタンスを再起動することをおすすめします。

再起動により、次の処理が行われます。

  • すべての接続を終了します。
  • リソースを消費している可能性のあるタスクをすべて終了します。
ダンプファイルで参照しているユーザーが存在しない場合、インポート オペレーションが失敗することがある。 ダンプファイルをインポートする前に、オブジェクトを所有しているデータベース ユーザーか、ダンプされたデータベース内のオブジェクトに対する権限が付与されているデータベース ユーザーがターゲット データベース内に存在している必要があります。そうでない場合、インポート オペレーションを実行すると、元の所有権または権限でのオブジェクトの再作成に失敗します。

インポートする前に、データベース ユーザーを作成します。

データをインポートした後は、データのディスク使用量が大幅に増大します。

データをインポートした後、予期しないディスク使用量が発生している可能性があります。この状況では、ポイントインタイム リカバリが使用されている可能性があります。

この問題を解決するには、データをインポートした後、ログを削除してストレージを復元する必要がある場合に、ポイントインタイム リカバリを無効にします。ストレージの使用量が少なくなっても、インスタンスにプロビジョニングされたストレージのサイズは縮小されません。

エラー メッセージ: GRANT stderr: ERROR: must be member of role ROLE_NAME

このエラー メッセージは、Cloud SQL データベースに、Cloud Storage にアップロードされた SQL ダンプファイルをインポートしようとしたとき、そしてインポート ジョブが約 4 日間実行された場合に表示されます。

ROLE_NAME は、移行元の PostgreSQL データベースで定義されたカスタム データベース ロールです。デフォルトの cloudsqlsuperuser ユーザーが SQL ダンプファイルをインポートします。ただし、このユーザーは ROLE_NAME ロールに属していない可能性があります。

この問題を解決するには、次の操作を行います。

  1. SQL ダンプファイルをインポートする宛先データベースに ROLE_NAME ロールを作成します。
  2. ファイルのインポートに cloudsqlsuperuser ユーザーを使用しないでください。代わりに、宛先のデータベースで ROLE_NAME ロールのメンバーであるユーザーを指定します。ユーザーを指定するには、次のコマンドを実行します。

    gcloud sql import sql INSTANCE URI [--async]
    [--database=DATABASE, -d DATABASE] [--user=USER] [GCLOUD_WIDE_FLAG …]

エクスポート オペレーションのトラブルシューティング

問題 トラブルシューティング
HTTP Error 409: Operation failed because another operation was already in progress. 保留中のオペレーションがインスタンスにすでに存在しています。一度に実行できるオペレーションは 1 つだけです。現在のオペレーションが完了してからリクエストを試してください。
HTTP Error 403: The service account does not have the required permissions for the bucket. バケットが存在し、バケットへのエクスポートを許可する Storage Object Creator ロール(roles/storage.objectCreator)が Cloud SQL インスタンス用のサービス アカウント(エクスポートを行っているアカウント)に付与されていることを確認します。Cloud Storage に適用される IAM ロールをご覧ください。
CSV のエクスポートは機能したが、SQL エクスポートに失敗した。 CSV 形式と SQL 形式ではエクスポート方法が異なります。SQL 形式ではデータベース全体がエクスポートされるため、完了までに時間がかかります。CSV 形式ではエクスポートに含めるデータベースの要素を定義できます。

CSV エクスポートを使用して必要なものだけをエクスポートします。

エクスポートに時間がかかりすぎる。 Cloud SQL では同時実行オペレーションの同期がサポートされません。

エクスポートをオフロードします。エクスポートをオフロードするときに、Cloud SQL はソース インスタンスでエクスポートを発行するのではなく、オフロード インスタンスを起動してエクスポートを実行します。エクスポート オフロードには、ソース インスタンスでのパフォーマンス向上、エクスポート実行中の管理オペレーションのブロック解除などの利点があります。エクスポート オフロードでは、合計レイテンシがオフロード インスタンスの起動時間まで増加する可能性があります。一般に、適当なサイズのエクスポートでは、レイテンシは重要ではありません。ただし、エクスポートが小さい場合、レイテンシが増加することがあります。

拡張機能の作成のエラー。 ダンプファイルに、サポートされていない拡張機能への参照が含まれています。

ダンプファイルを編集して参照を削除します

pg_dumpall の使用中にエラーが発生した。 --global フラグを指定して pg_dumpall ユーティリティを使用するには、スーパーユーザー ロールが必要ですが、このロールは Cloud SQL for PostgreSQL ではサポートされていません。ユーザー名を含むエクスポート オペレーションの実行中にエラーが発生しないようにするには、--no-role-passwords フラグも使用します。
エクスポートが完了する前にオペレーションがタイムアウトすると、Could not receive data from client: Connection reset by peer. というエラー メッセージが表示されます。 Cloud Storage が所定の時間(通常は約 7 分)内にデータを受信しないと、接続はリセットされます。最初のエクスポート クエリは、非常に時間がかかる可能性があります。

pg_dump ツールを使用して、手動でエクスポートします。

エクスポートを自動化したい。 Cloud SQL には、エクスポートを自動化する方法がありません。

自動バックアップの自動化に関する記事のように、Google Cloud プロダクト(Cloud Scheduler、Pub/Sub、Cloud Functions)を使用して、独自の自動エクスポート システムを構築できます。

次のステップ