データのエクスポート

このページでは、Cloud SQL インスタンスからデータをエクスポートする方法について説明します。

エクスポートではデータベース リソースが使用されますが、インスタンスがプロビジョニングされていない限り、エクスポートによって通常のデータベース オペレーションが妨げられることはありません。

データのエクスポートのベスト プラクティスについては、データのインポートとエクスポートのベスト プラクティスをご覧ください。

始める前に

必要なロールと権限

Cloud Storage にデータをエクスポートするには、サービス アカウントまたはユーザーに次のいずれかのロールが必要です。

  • Cloud SQL 編集者のロールと roles/storage.legacyBucketWriter IAM ロール。
  • 次の権限を含むカスタムロール:
    • cloudsql.instances.get
    • cloudsql.instances.export
    • storage.buckets.create
    • storage.objects.create

サービス アカウントまたはユーザーがインポート オペレーションも実行する場合は、Storage Object Admin IAM ロールを付与して、インポートとエクスポートの両方に必要なすべての権限を付与すると便利な場合があります。

IAM ロールについては、Cloud Storage の Cloud Identity and Access Management をご覧ください。

Cloud SQL から Cloud Storage の BAK ファイルにデータをエクスポートする

Cloud SQL インスタンス上のデータベースから Cloud Storage バケットの BAK ファイルにデータをエクスポートする手順は次のとおりです。

Console

  1. Google Cloud Console で、Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. インスタンス名をクリックして [概要] ページを開きます。
  3. [エクスポート] をクリックします。
  4. [ファイル形式] セクションで [BAK] をクリックします。
  5. [エクスポートするデータ] セクションでプルダウン メニューを使用して、エクスポートするデータベースを選択します。
  6. [送信先] セクションで [BROWSE] を選択して、エクスポート先の Cloud Storage バケットまたはフォルダを検索します。
  7. [エクスポート] をクリックしてエクスポートを開始します。

gcloud

  1. Cloud Storage バケットをまだ作成していない場合は、作成します。

    バケットの作成方法については、ストレージ バケットの作成をご覧ください。

  2. ファイルをバケットにアップロードします。

    ファイルをバケットにアップロードする方法については、オブジェクトのアップロードをご覧ください。

  3. エクスポート元の Cloud SQL インスタンスのサービス アカウントを見つけます。これを行うには、gcloud sql instances describe コマンドを実行します。出力で serviceAccountEmailAddress フィールドを探します。
    gcloud sql instances describe INSTANCE_NAME
      
  4. gsutil iam を使用して、サービス アカウントに storage.objectAdmin IAM ロールを付与します。IAM 権限の設定については、IAM 権限の使用をご覧ください。
  5. データベースをエクスポートします。
    gcloud beta sql export bak INSTANCE_NAME gs://BUCKET_NAME/sqldumpfile.sql.gz \
    --database=DATABASE_NAME
      

    gcloud beta sql export bak コマンドの使用方法については、コマンドのリファレンス ページをご覧ください。

  6. 以前に設定した IAM ロールを保持する必要がない場合は、この時点で取り消してください。

REST v1

  1. エクスポート先のバケットを作成します。
    gsutil mb -p PROJECT_NAME -l LOCATION_NAME gs://BUCKET_NAME
    

    このステップは必須ではありませんが、他のデータへ一切アクセスできないようにするために、実行することを強く推奨します。

  2. バケットに対する legacyBucketWriter IAM ロールをインスタンスに付与します。IAM 権限の設定については、IAM 権限の使用をご覧ください。
  3. データベースをエクスポートします。

    リクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID
    • bucket_name: Cloud Storage バケット名
    • path_to_dump_file: SQL ダンプファイルへのパス
    • database_name_1: Cloud SQL インスタンス内のデータベースの名前
    • database_name_2: Cloud SQL インスタンス内のデータベースの名前
    • offload: サーバーレス エクスポートを有効にします。サーバーレス エクスポートを使用するには true に設定します。

    HTTP メソッドと URL:

    POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/export

    JSON 本文のリクエスト:

    {
     "exportContext":
       {
          "fileType": "BAK",
          "uri": "gs://bucket_name/path_to_dump_file",
          "databases": ["database_name"]
          "offload": true | false
        }
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

  4. 以前に設定した IAM のロールを保持する必要がない場合は、今すぐ削除してください。
このリクエストのパラメータの一覧については、instances:export ページをご覧ください。

REST v1beta4

  1. エクスポート先のバケットを作成します。
    gsutil mb -p PROJECT_NAME -l LOCATION_NAME gs://BUCKET_NAME
    

    このステップは必須ではありませんが、他のデータへ一切アクセスできないようにするために、実行することを強く推奨します。

  2. バケットに対する storage.objectAdmin IAM ロールをインスタンスに付与します。IAM 権限の設定については、IAM 権限の使用をご覧ください。
  3. データベースをエクスポートします。

    リクエストのデータを使用する前に、次のように置き換えます。

    • project-id: プロジェクト ID
    • instance-id: インスタンス ID
    • bucket_name: Cloud Storage バケット名
    • path_to_dump_file: SQL ダンプファイルへのパス
    • database_name_1: Cloud SQL インスタンス内のデータベースの名前
    • database_name_2: Cloud SQL インスタンス内のデータベースの名前
    • offload: サーバーレス エクスポートを有効にします。サーバーレス エクスポートを使用するには true に設定します。

    HTTP メソッドと URL:

    POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/export

    JSON 本文のリクエスト:

    {
     "exportContext":
       {
          "fileType": "BAK",
          "uri": "gs://bucket_name/path_to_dump_file",
          "databases": ["database_name"]
          "offload": true | false
        }
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    次のような JSON レスポンスが返されます。

  4. 以前に設定した IAM ロールを保持する必要がない場合は、この時点で取り消してください。
このリクエストのパラメータの一覧については、instances:export ページをご覧ください。

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

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

トラブルシューティング

表内のリンクをクリックすると、詳細が表示されます。

この問題については... 次のような問題が考えられます... 次のことを試します...
オペレーションのステータスを確認できない。 ユーザー インターフェースには成功または失敗のみが表示されます。 詳細については、これらのデータベース コマンドをご覧ください。
エクスポート オペレーション中に接続が切断した。 クエリで最初の 7 分以内にデータを生成する必要があります。 クエリを手動でテストします。詳細については、こちらをご覧ください。
エクスポート中に不明なエラーが発生した。 帯域幅の問題である可能性があります。 インスタンスと Cloud Storage バケットの両方が同じリージョンに存在することを確認します
エクスポートを自動化する場合。 Cloud SQL には、エクスポートを自動化する方法がありません。 この機能を実行する独自のパイプラインを構築します。詳細については、こちらをご覧ください。

オペレーションのステータスを確認できない

進行中のオペレーションのステータスが表示されません。

次のような問題が考えられます

Google Cloud Console では、完了時に成功または失敗のみが表示され、警告は返されません。

次の方法をお試しください

データベースに接続し、SHOW WARNINGS を実行します。


エクスポート オペレーション中に接続が切断された

エクスポート オペレーション中に接続が切断しました。

次のような問題が考えられます

エクスポートが開始されてから最初の 7 分以内に、エクスポートで実行されているクエリでデータが生成されないため、Cloud Storage への接続がタイムアウトする可能性があります。

次の方法をお試しください

次のコマンドを使用して任意のクライアントから接続し、クエリの出力を標準出力に送信して、クエリを手動でテストします。

COPY (INSERT_YOUR_QUERY_HERE) TO STDOUT WITH ( FORMAT csv, DELIMITER ',', ENCODING 'UTF8', QUOTE '"', ESCAPE '"' )

これは、エクスポートが開始されるとすぐにクライアントからデータの送信が開始されるためです。データが送信されていない接続を維持すると、最終的に接続が切断されてエクスポートが失敗し、操作が不確定な状態になります。また、gcloud からのエラー メッセージは次のように表示されます。

operation is taking longer than expected


エクスポート中に不明なエラーが発生した

データベースを Cloud Storage バケットにエクスポートしようとすると、エラー メッセージ Unknown error が表示されます。

次のような問題が考えられます

帯域幅の問題が原因で転送が失敗する可能性があります。

Cloud SQL インスタンスが Cloud Storage バケットとは異なるリージョンに存在している可能性があります。ある大陸から別の大陸へのデータの読み取りと書き込みではネットワークの使用量が多く、このような断続的な問題を引き起こす可能性があります。インスタンスとバケットのリージョンを確認します。

次の方法をお試しください

Cloud Storage バケットを Cloud SQL インスタンスの近くに移動します。アクティビティが減少したときに操作を実行します。

エクスポートを自動化する

エクスポートを自動化する場合。

次のような問題が考えられます

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

次の方法をお試しください

Google Cloud プロダクト(Cloud Scheduler、Pub/Sub、Cloud Functions)を使用して、独自の自動エクスポート システムを構築できます。


ERROR_RDBMS システムエラーが発生した

エラー メッセージ [ERROR_RDBMS] system error occurred が表示されます。

次のような問題が考えられます

  • ユーザーが必要なすべての Cloud Storage 権限を持っていない可能性があります。
  • データベース テーブルが存在しない可能性があります。

次の方法をお試しください

  1. バケットに対して少なくとも WRITER 権限があり、エクスポート ファイルに対して READER 権限があることを確認してください。Cloud Storage のアクセス制御の構成について詳しくは、アクセス制御リストの作成と管理をご覧ください。
  2. テーブルが存在していることを確認します。存在している場合は、バケットに対して正しい権限があることを確認します。

次のステップ