データのエクスポート

このページでは、Cloud SQL インスタンスから、または Cloud SQL で管理されていないデータベース サーバーからデータをエクスポートする方法について説明します。

Cloud Storage にデータをエクスポートするには、インスタンスのサービス アカウントにプロジェクトで設定された storage.objectAdmin IAM ロールが必要です。詳細については、Cloud Storage の Cloud Identity and Access Management をご覧ください。

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

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

CSV ファイルをエクスポートできます。また、別の SQL データベースにエクスポートする場合は、SQL ダンプファイルをエクスポートすることもできます。

標準エクスポートとサーバーレス エクスポート

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

エクスポート中のレスポンスが遅くなるのを防ぐには、サーバーレス エクスポートを使用します。サーバーレス エクスポートを使用すると、エクスポート オペレーションをオフロードするために、個別の一時的なインスタンスが Cloud SQL によって作成されます。エクスポート オペレーションをオフロードすると、プライマリ インスタンスのデータベースでクエリの送信を継続するので、通常のパフォーマンス速度でオペレーションを実行できます。データのエクスポートが完了すると、一時的なインスタンスは自動的に削除されます。

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

サーバーレス エクスポートは、プライマリ インスタンスまたはリードレプリカで使用できます。

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

Cloud SQL から SQL ダンプファイルにデータをエクスポートする

Cloud Console、gcloud コマンドライン ツール、または API から Cloud SQL を使用してエクスポートを実行する場合、pg_dump ユーティリティを使用します。このとき、生成されるエクスポート ファイルを Cloud SQL に確実に再インポートできるようにするオプションを指定します。

Cloud SQL で管理されていないデータベースにエクスポートする場合は、psql クライアントを使用して pg_dump を手動で実行できます。

ただし、Cloud SQL にデータをインポートする場合は、SQL ダンプファイルが Cloud SQL 用に正しくフォーマットされるように、外部データベース サーバーからのデータのエクスポートの手順に従ってください。

始める前に

この手順では、ファイルを Cloud Storage にエクスポートする必要があります。Cloud Storage にデータをエクスポートするには、インスタンスのサービス アカウントにプロジェクトで設定された storage.objectAdmin IAM ロールが必要です。IAM ロールについては、Cloud Storage の Cloud Identity and Access Management をご覧ください。

インスタンスのサービス アカウント名は、Google Cloud Console のインスタンスの [概要] ページで確認できます。Cloud Storage バケットのロールは、バケットを検査する gsutil ツールを使用して確認できます。

gsutil iam get gs://[BUCKET_NAME]

バケットでの IAM 使用について詳しくは、こちらをご覧ください。

Cloud Storage の SQL ダンプファイルにデータをエクスポートする

Cloud SQL インスタンス上のデータベースから Cloud Storage バケットの SQL ダンプファイルにデータをエクスポートするには:

Console

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

    [Cloud SQL インスタンス] ページに移動

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

gcloud

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

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

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

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

  3. エクスポート元のインスタンスを記述します。
      gcloud sql instances describe [INSTANCE_NAME]
      
  4. serviceAccountEmailAddress フィールドをコピーします。
  5. gsutil iam を使用して、バケットのサービス アカウントに storage.objectAdmin IAM ロールを付与します。IAM 権限の設定については、IAM 権限の使用をご覧ください。
  6. データベースをエクスポートします。
      gcloud sql export sql [INSTANCE_NAME] gs://[BUCKET_NAME]/sqldumpfile.gz \
                                  --database=[DATABASE_NAME] --offload
      

    export sql コマンドでは、トリガーとストアド プロシージャは含まれませんが、ビューは含まれます。トリガーまたはストアド プロシージャをエクスポートするには、pg_dump ツールを使用します。

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

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

REST

  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://www.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/export

    JSON 本文のリクエスト:

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

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

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

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

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

他のツールや環境で使用可能な CSV 形式でデータをエクスポートできます。エクスポートはデータベース レベルで行われます。CSV をエクスポートするときに、エクスポートするスキーマを指定できます。データベース レベルのスキーマはすべてエクスポート可能です。

始める前に

この手順では、ファイルを Cloud Storage にエクスポートする必要があります。Cloud Storage にデータをエクスポートするには、インスタンスのサービス アカウントにプロジェクトで設定された storage.objectAdmin IAM ロールが必要です。IAM ロールについては、Cloud Storage の Cloud Identity and Access Management をご覧ください。

インスタンスのサービス アカウント名は、Google Cloud Console のインスタンスの [概要] ページで確認できます。Cloud Storage バケットのロールは、バケットを検査する gsutil ツールを使用して確認できます。

gsutil iam get gs://[BUCKET_NAME]

バケットでの IAM 使用について詳しくは、こちらをご覧ください。

Cloud Storage の CSV ファイルにデータをエクスポートする

Cloud SQL インスタンス上のデータベースから Cloud Storage バケットの SQL ダンプファイルにデータをエクスポートするには:

Console

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

    [Cloud SQL インスタンス] ページに移動

  2. インスタンスをクリックして [概要] ページを開きます。
  3. [エクスポート] をクリックします。
  4. [Cloud Storage エクスポートのロケーション] で、エクスポート先の Cloud Storage バケットまたはフォルダを選択します。
  5. [名前] フィールドにエクスポート ファイルの名前を入力し、[選択] をクリックします。

    ファイル拡張子 .gz を使用して、エクスポート ファイルを圧縮します。

  6. [形式] を [CSV] に設定します。
  7. [Cloud Storage エクスポートのロケーション] で、エクスポートするバケット、フォルダ、ファイルを追加するか、[参照] をクリックしてバケット、フォルダ、ファイルを検索または作成します。

    [参照] をクリックした場合:

    1. [ロケーション] で、エクスポート先の Cloud Storage バケットまたはフォルダを選択します。
    2. [名前] テキスト ボックスに、CSV ファイルの名前を追加します。以前にファイルを作成したことがある場合は、[ロケーション] のリストから選択します。

      .gz のファイル拡張子(完全な拡張子は .csv.gz)を使用して、エクスポート ファイルを圧縮できます。

    3. [選択] をクリックします。
  8. [形式] で [CSV] をクリックします。
  9. [エクスポートするデータベース] で、プルダウン メニューからデータベースの名前を選択します。
  10. [SQL クエリ] に、SQL クエリを入力して、データのエクスポート元のテーブルを指定します。

    たとえば、guestbook データベースの entries テーブルの内容全体をエクスポートするには、次のように入力します。

    SELECT * FROM guestbook.entries;
    指定したデータベース内のテーブルをクエリで指定する必要があります。データベース全体を CSV 形式でエクスポートすることはできません。

  11. [エクスポート] をクリックしてエクスポートを開始します。
  12. [データベースをエクスポートしますか?] というダイアログ ボックスが開き、大規模なデータベースの場合、エクスポート プロセスに 1 時間以上かかることがあるという内容のメッセージが表示されます。エクスポート時、インスタンスで実行できる操作は情報の閲覧のみです。一度開始したエクスポートは停止できません。エクスポートを開始してもよい場合は、[エクスポート] をクリックします。それ以外の場合は、[キャンセル] をクリックします。

gcloud

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

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

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

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

  3. エクスポート元のインスタンスを記述します。
    gcloud sql instances describe [INSTANCE_NAME]
    
  4. gsutil iam を使用して、バケットのサービス アカウントに storage.objectAdmin IAM ロールを付与します。IAM 権限の設定については、IAM 権限の使用をご覧ください。
  5. データベースをエクスポートします。
    gcloud sql export csv [INSTANCE_NAME] gs://[BUCKET_NAME]/[FILE_NAME] \
                                --database=[DATABASE_NAME]
                                --offload
                                --query=[SELECT_QUERY]
    

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

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

REST

  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_csv_file: CSV ファイルへのパス
    • database_name: Cloud SQL インスタンス内のデータベースの名前
    • offload: サーバーレス エクスポートを有効にします。サーバーレス エクスポートを使用するには true に設定します。
    • select_query: エクスポート用の SQL クエリ

    HTTP メソッドと URL:

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

    JSON 本文のリクエスト:

    {
     "exportContext":
       {
          "fileType": "CSV",
          "uri": "gs://bucket_name/path_to_csv_file",
          "databases": ["database_name"],
          "offload": true | false
          "csvExportOptions":
           {
               "selectQuery":"select_query"
           }
       }
    }
    

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

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

    databases プロパティでデータベースを 1 つだけ指定する必要があります。select クエリでデータベースを指定する場合は、同じデータベースを使用する必要があります。

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

CSV エクスポートでは、標準の CSV 出力が作成されます。標準以外の CSV 形式が必要な場合は、psql クライアントで次のステートメントを使用します。

  \copy [table_name] TO '[csv_file_name].csv' WITH
      (FORMAT csv, ESCAPE '[escape_character]', QUOTE '[quote_character]',
      DELIMITER '[delimiter_character]', ENCODING 'UTF8', NULL '[null_marker_string]');
このリクエストのパラメータの一覧については、instances:export ページをご覧ください。

pg_dump を使用してオンプレミスの PostgreSQL サーバーからデータをエクスポートする

Cloud SQL で管理されていないデータベースをエクスポートする場合は、後で Cloud SQL にインポートするため、次のフラグを指定して pg_dump ユーティリティを使用します。

  • --no-owner

    SQL ダンプファイルに所有権の変更コマンドを含めることはできません。

  • --format=plain

    Cloud SQL でサポートされているのはプレーン SQL 形式のみです。

  • --no-acl

    このフラグは、SUPERUSER ロールのメンバーシップを付与または取り消すステートメントがダンプに含まれている場合に必要です。

また、次のものをすべて削除する必要があります。

  • 拡張関連のステートメント(Cloud SQL がその拡張機能をサポートしていない場合)。サポートされている拡張機能のリストについては、PostgreSQL の拡張機能をご覧ください。
  • plpgsql を参照する CREATE EXTENSION または DROP EXTENSION ステートメント。この拡張機能は、Cloud SQL Postgres インスタンスにプリインストールされています。
  • COMMENT ON EXTENSION ステートメント。

コマンドラインから、pg_dump を実行します。

pg_dump -U [USERNAME] --format=plain --no-owner --no-acl [DATABASE_NAME] \
    | sed -E 's/(DROP|CREATE|COMMENT ON) EXTENSION/-- \1 EXTENSION/g' > [SQL_FILE].sql

sed 後処理により、SQL ダンプファイル内のすべての拡張ステートメントがコメントアウトされます。

データベースの設定で指定されているデフォルトのエンコードがデータに適していることを確認します。必要に応じて、--encoding フラグを使用してデフォルトをオーバーライドできます。

並行してエクスポートするには、-j NUM_CORES フラグを使用します。NUM_CORES は、ソース インスタンスのコア数です。並行してインポートするには、pg_restore で同じフラグを使用します。

pg_dump については、pg_dump のリファレンスをご覧ください。

次のステップ