Cloud SQL へのデータのインポート

このページでは、Cloud SQL インスタンスにデータをインポートする方法について説明します。SQL ダンプファイルまたは CSV ファイルからデータをインポートできます。

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

インポート オペレーションが完了したら、結果を確認します。

始める前に

必要なロールと権限を構成済みであることを確認してください。 これらの手順では、Cloud Storage からファイルをインポートする必要があります。Cloud Storage からデータをインポートするには、Cloud SQL インスタンスのサービス アカウントまたはユーザーが以下を持っている必要があります。

  • Cloud SQL 管理者のロールまたは cloudsql.instances.import 権限を含むカスタムロール。
  • storage.objects.get 権限を持つ roles/storage.LegacyObjectReader IAM ロール。
  • サービス アカウントまたはユーザーがエクスポート オペレーションも実行する場合は、cloudsql.instances.export 権限と roles/storage.legacyBucketWriter IAM ロールを付与します。

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

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

gsutil iam get gs://[BUCKET_NAME]

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

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

  • SQL ダンプファイルを作成します。以下の手順のうち、状況に該当する手順を使用します。この手順では、ダンプファイルに Cloud SQL との互換性を持たせるためのフラグを設定します。

  • インポート オペレーションでは、テーブル、エントリ、インデックスの削除と再作成など、sqldump ファイルで SQL コマンドを実行しようとします。データベースの作成方法については、データベースを作成するをご覧ください。
  • システム ユーザー(root@localhost など)をトリガー、ビュー、ストアド プロシージャの DEFINER として使用しないでください。Cloud SQL ではこのユーザーにアクセスできません。
  • SQL ダンプファイルに DEFINER 句(ビュー、トリガー、ストアド プロシージャなど)が含まれている場合、これらのステートメントの実行順序によってはインポートが失敗することがあります。Cloud SQL での DEFINER の使用方法と考えられる回避策の詳細をご確認ください。
  • Cloud SQL にインポートできる SQL ダンプファイルの作成については、SQL ダンプファイルの作成をご覧ください。
  • SQL ダンプファイルから Cloud SQL インスタンスにデータをインポートするには:

    Console

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

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

    2. インスタンスを選択して [概要] ページを開きます。
    3. ボタンバーで [インポート] をクリックします。
    4. [データのインポート元となるファイルを選択してください] で、インポートに使用するバケットと SQL ダンプファイルのパスを入力します。または、次のようにしてファイルを参照します。
      1. [参照] をクリックします。
      2. [ロケーション] で、リスト内のバケット名をダブルクリックします。
      3. リストからファイルを選択します。
      4. [選択] をクリックします。

      圧縮ファイル(.gz)または非圧縮ファイル(.sql)ファイルをインポートできます。

    5. [形式] で [SQL] を選択します。
    6. データをインポートするデータベースを選択します。

      これにより Cloud SQL では、インポートに先立って USE DATABASE ステートメントが実行されます。

    7. [インポート] をクリックしてインポートを開始します。

    gcloud

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

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

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

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

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

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

      コマンドから「ERROR_RDBMS」のようなエラーが返された場合は、権限を確認してください。このエラーの原因は多くの場合、権限の問題にあります。

    7. 以前に設定した IAM の権限を保持する必要がない場合は、gsutil iam を使用して削除してください。

    REST v1beta4

      SQL ダンプファイルを作成します。以下の手順のうち、状況に該当する手順を使用します。この手順では、ダンプファイルに Cloud SQL との互換性を持たせるためのフラグを設定します。

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

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

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

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

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

      後述のリクエスト データは、次のように置き換えてから使用します。

      • project-id: プロジェクト ID
      • instance-id: インスタンス ID
      • bucket_name: Cloud Storage バケット名
      • path_to_sql_file: SQL ファイルへのパス
      • database_name: Cloud SQL インスタンス内のデータベースの名前

      HTTP メソッドと URL:

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

      JSON 本文のリクエスト:

      {
       "importContext":
         {
            "fileType": "SQL",
            "uri": "gs://bucket_name/path_to_sql_file",
            "database": "database_name"
          }
      }
      
      

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

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

      このリクエストのパラメータの完全な一覧については、instances:import ページをご覧ください。
    5. 以前に設定した IAM の権限を保持する必要がない場合は、今すぐ削除してください。
    このタスクのために基盤となる REST API リクエストがどのように作成されるかについては、instances: import ページの API Explorer をご覧ください。

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

    • インポート先のデータベースとテーブルが、Cloud SQL インスタンス上に存在している必要があります。データベースの作成方法については、データベースを作成するをご覧ください。テーブルを作成するには、mysql クライアントの CREATE TABLE SQL ステートメントを使用します。
    • CSV ファイルは、以下の CSV ファイル形式の要件に従う必要があります。

      ファイルがこれらの要件を満たしていない場合は、mysql クライアントで LOAD DATA LOCAL INFILE ステートメントを使用して、ローカル ファイルをデータベースに読み込みます。そのためには、mysql クライアントに対して --local-infile オプションを使用する必要があります。

    • オンプレミスの MySQL サーバーからエクスポートしたデータをインポートする場合:
      1. ストレージ バケットの作成の手順で Cloud Storage にバケットを作成します。
      2. オブジェクトのアップロードの手順で、SQL ダンプファイルを Cloud Storage バケットにアップロードします。

    CSV ファイル形式の要件

    CSV ファイルは、データの行ごとに 1 行を使用し、カンマ区切りのフィールドを持つ必要があります。 Cloud SQL で受け入れられる CSV ファイルの形式は、次の MySQL ステートメントを使用する場合と同じです。
          LOAD DATA INFILE ... CHARACTER SET 'utf8mb4'
          FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\"'.
    
    この形式で CSV を作成するには、既存のデータベースからデータをエクスポートするときに、Cloud SQL がインポートで使用したオプションまたは区切り記号を使用する必要があります。例については、CSV ファイルを作成するをご覧ください。

    CSV ファイルを使用して Cloud SQL インスタンスにデータをインポートする手順は次のとおりです。

    Console

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

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

    2. インスタンスを選択して [概要] ページを開きます。
    3. ボタンバーで [インポート] をクリックします。
    4. [データのインポート元となるファイルを選択してください] で、インポートに使用するバケットと CSV ファイルのパスを入力します。または、次のようにしてファイルを参照します。
      1. [参照] をクリックします。
      2. [ロケーション] で、リスト内のバケット名をダブルクリックします。
      3. リストからファイルを選択します。
      4. [選択] をクリックします。

      圧縮ファイル(.gz)または非圧縮ファイル(.csv)ファイルをインポートできます。

    5. [形式] で [CSV] を選択します。
    6. CSV ファイルをインポートする Cloud SQL インスタンスの [データベース] と [テーブル] を指定します。
    7. オプションで、インポートを行うユーザーを指定できます。
    8. [インポート] をクリックしてインポートを開始します。

    gcloud

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

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

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

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

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

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

    8. 以前に設定した IAM の権限を保持する必要がない場合は、gsutil iam を使用して削除してください。

    REST v1beta4

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

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

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

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

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

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

      • project-id: プロジェクト ID
      • instance-id: インスタンス ID
      • bucket_name: Cloud Storage バケット名
      • path_to_csv_file: CSV ファイルへのパス
      • database_name: Cloud SQL インスタンス内のデータベースの名前
      • table_name: データベース テーブルの名前

      HTTP メソッドと URL:

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

      JSON 本文のリクエスト:

      {
       "importContext":
         {
            "fileType": "CSV",
            "uri": "gs://bucket_name/path_to_csv_file",
            "database": "database_name",
            "csvImportOptions":
             {
               "table": "table_name"
             }
         }
      }
      
      

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

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

      このリクエストのパラメータの完全な一覧については、instances:import ページをご覧ください。
    5. 以前に設定した IAM 権限を保持する必要がない場合は、権限を削除します。

    ERROR_RDBMS のようなエラーが発生した場合、テーブルが存在することを確認してください。存在している場合は、バケットに対して正しい権限があることを確認します。Cloud Storage のアクセス制御の構成について詳しくは、アクセス制御リストの作成と管理をご覧ください。

    このタスクのために基盤となる REST API リクエストがどのように作成されるかについては、instances: import ページの API Explorer をご覧ください。

    トラブルシューティング

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

    この問題については... 次のような問題が考えられます... 次のことを試します...
    インポートに時間がかかりすぎる。 アクティブな接続が多すぎると、インポート オペレーションが妨げられる可能性があります。 未使用の接続を閉じるか、インポート オペレーションを開始する前に Cloud SQL インスタンスを再起動してください。
    インポートに失敗した。 エクスポートされたファイルに、まだ存在しないデータベース ユーザーが含まれている可能性があります。 インポートを再試行する前に、失敗したデータベースをクリーンアップします。インポートを行う前に、データベース ユーザーを作成します。
    インポート中のエラー: テーブルが存在しません。 現時点では、必要なテーブルが存在しません。 インポート開始時に FOREIGN_KEY_CHECKS を無効にします
    エラー メッセージ: ERROR 1045 (28000) at line {line_number}: Access denied for user 'cloudsqlimport'@'localhost' ダンプファイルに、データベースに存在しない DEFINER があります。 Cloud SQL での DEFINER の使用方法と考えられる回避策の詳細をご覧ください。
    エラー メッセージ: Unknown table 'COLUMN_STATISTICS' in information_schema これは、MySQL 8.0 の mysqldump バイナリを使用して MySQL 5.7 データベースからデータをダンプし、それを MySQL 8.0 データベースにインポートする場合に発生します。 MySQL 5.7 データベースからデータをダンプし、MySQL 8.0 データベースにインポートする場合は、必ず MySQL 5.7 の mysqldump バイナリを使用してください。MySQL 8.0 の mysqldump バイナリを使用する場合は、--column-statistics=0 フラグを追加する必要があります。

    インポートに時間がかかりすぎる

    インポートに時間がかかりすぎるため、他のオペレーションをブロックしています。

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

    アクティブな接続が多すぎると、インポート オペレーションが妨げられる可能性があります。CPU とメモリが接続のために消費されると、使用可能なリソースが制限されます。

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

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

    • すべての接続を終了します。
    • リソースを消費している可能性のあるタスクをすべて終了します。


    インポートに失敗した

    エクスポートされた SQL ダンプファイルで参照されているユーザーが存在しない場合、インポートは失敗します。

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

    SQL ダンプをインポートする前に、オブジェクトを所有しているか、またはダンプされたデータベース内のオブジェクトに対する権限が付与されているデータベース ユーザーが存在する必要があります。 そうでない場合、復元で、元の所有権や権限でのオブジェクトの再作成に失敗します。

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

    インポートを再試行する前に、失敗したデータベースをクリーンアップします。SQL ダンプをインポートする前に、データベース ユーザーを作成します。


    インポート中のエラー: テーブルが存在しません

    インポート オペレーションが失敗し、テーブルが存在しないというエラーが表示されます。

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

    テーブルには他のテーブルとの外部キーの依存関係がある場合があり、オペレーションの順序によっては、インポート オペレーション中に 1 つ以上のテーブルがまだ存在しない可能性があります。

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

    次の行をダンプファイルの先頭に追加します。

      SET FOREIGN_KEY_CHECKS=0;
    

    また、次の行をダンプファイルの末尾に追加します。

      SET FOREIGN_KEY_CHECKS=1;
    

    これらの設定により、インポート オペレーション中のデータの整合性チェックが無効になり、データの読み込み後に再び有効になります。ダンプファイルの作成時にデータがすでに検証されているため、この設定はデータベース上のデータの整合性には影響しません。


    エラー メッセージ: ERROR 1045 (28000) at line {line_number}: Access denied for user 'cloudsqlimport'@'localhost'

    ERROR 1045 (28000) at line {line_number}: Access denied for user 'cloudsqlimport'@'localhost' というエラーが表示されます。

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

    根本的な原因は、ダンプファイルに DEFINER 句のあるユーザーがあり、そのユーザーがデータベースに存在しないことと、そのユーザーがデータベースのオブジェクト定義で相互参照されていることです。

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

    ダンプファイルで DEFINER 句を使用してデータベースをインポートする方法については、こちらのドキュメントをご覧ください。データベースに 1 人以上のユーザーを作成する必要があります。


    エラー メッセージ: Unknown table 'COLUMN_STATISTICS' in information_schema

    エラー メッセージ Unknown table 'COLUMN_STATISTICS' in information_schema が表示されます。

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

    これは、MySQL 8.0 の mysqldump バイナリを使用して MySQL 5.7 データベースからデータをダンプし、それを MySQL 8.0 データベースにインポートする場合に発生します。

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

    MySQL 5.7 データベースからデータをダンプし、MySQL 8.0 データベースにインポートする場合は、必ず MySQL 5.7 の mysqldump バイナリを使用してください。MySQL 8.0 の mysqldump バイナリを使用する場合は、--column-statistics=0 フラグを追加する必要があります。

    次のステップ