外部サーバーから Cloud SQL への移行(v1.1)

このページでは、外部サーバーから Cloud SQL レプリカにデータを複製する方法について説明します。データを複製するには、マネージド ダンプを使用するか、ダンプファイルからアップロードします。ここでは、IP アドレスまたは DNS アドレスで接続可能な外部サーバーを使用して、この 2 つの方法について説明します。

このページで説明する手順の代わりに、データベース移行サービスを使用することもできます。このサービスでは、ソース データベース サーバーから Cloud SQL に継続的なレプリケーションを行うことも、データベースの移行を 1 回で行うこともできます。

始める前に

用語

  • ソース データベース サーバー。自身で管理している MySQL サーバー。外部プライマリ、外部サーバー、移行元データベース サーバー、外部データベース サーバーともいいます。Amazon Relational Database Service(RDS)を使用している場合は、これにソース データベース サーバーが含まれています。

  • ソース表現インスタンス。Cloud SQL レプリカに対するソース データベース サーバーを表す Cloud SQL インスタンス。これは Cloud Console に表示され、通常の Cloud SQL インスタンスと同じように見えますが、ソース表現インスタンスにはデータは含まれず、構成もメンテナンスも必要ありません。また、課金にも影響しません。これにはソース データベース サーバーの構成が含まれます。

  • Cloud SQL レプリカ。ソース データベース サーバーから複製される Cloud SQL インスタンス。外部プライマリ リードレプリカともいいます。

  • レプリケーション ユーザー アカウント。ソース データベース サーバーと Google Cloud サーバーの間のレプリケーションに必要な権限を持っているソース データベース サーバー上の MySQL ユーザー アカウント。

  • マネージド ダンプ。ソース データベース サーバーから Cloud SQL レプリカにデータを直接コピーするプロセス。この場合、Cloud SQL はレプリケーション ユーザー アカウントを使用してソース データベース サーバーに接続し、ソース データベース サーバー上で直接 mysqldump を実行して、Cloud SQL レプリカにデータをインポートします。

ソース データベース サーバーのチェックリスト

すべて

  • ソース データベース サーバーに MySQL 5.5、5.6、5.7、または 8.0 がインストールされていることを確認します。MySQL Community Edition、Cloud SQL MySQL、Amazon RDS 上の MySQL がサポートされています。

    • ソース データベース サーバーに MySQL 8.0 がインストールされている場合は、Cloud SQL レプリカで Cloud SQL MySQL 8.0 を使用できます。
    • ソース データベース サーバーに MySQL 5.5 がインストールされている場合、GTID はサポートされません。
  • バイナリログが有効になっていることと、次のことを確認します。

  • ソース データベース サーバーで GTID が有効になっているかどうか確認します。これにより、レプリケーションの設定手順が変わります。

  • ソース データベース サーバーにグローバル読み取りロック権限があるかどうか確認します。これにより、レプリケーションの設定手順が変わります。

  • Cloud SQL レプリカでプライベート IP を使用する場合は、ソース データベース サーバーが Cloud SQL レプリカの VPC からアクセスできるように、ソース データベース サーバーを構成する必要があります。このガイドで説明する手順を行う前に、この構成を設定してください。

  • ソース データベースに DEFINER 句(ビュー、イベント、トリガー、ストアド プロシージャ)が含まれている場合、これらのステートメントの実行順序によってはレプリケーションが失敗することがあります。Cloud SQL での DEFINER の使用方法と考えられる回避策の詳細をご確認ください。

Amazon RDS

  • ソース データベース サーバーに Amazon RDS 用の MySQL がインストールされていることを確認します。

  • ほとんどの場合、Amazon RDS を使用するソース データベース サーバーで GTID はサポートされていませんが、MySQL 5.7 の GTID はサポートされています。

  • Amazon RDS を使用するソース データベース サーバーではグローバル読み取りロック権限がサポートされません。

レプリケーションを設定する

レプリケーションは、Cloud Storage ファイルまたはマネージド ダンプから開始します。

また、レプリケーションの設定時に、最初のインポートが完了した後に Cloud SQL レプリカとソース データベース サーバーの同期を維持するかどうか設定できます。常に同期するレプリカはオンラインです。1 回だけ更新されるレプリカはオフラインです。

オンライン + ファイル

このタイプのレプリケーションを設定するには、ソース データベース サーバーで GTID が有効になっているか、ソース データベース サーバーにグローバル読み取りロック権限がある必要があります。

  1. Google Cloud でプロジェクトを設定します
  2. ソース データベース サーバーの Google Cloud SDK をインストールします
  3. ソース データベース サーバーでレプリケーション ユーザーを作成します
  4. ソース データベース サーバーから Google Cloud バケットにデータをエクスポートします
  5. ソース表現インスタンスを設定します
  6. Cloud SQL レプリカを設定します
  7. インスタンスが Cloud SQL に正しく追加されたことを確認します
  8. Cloud SQL レプリカにユーザーを追加します
  9. ソース データベース サーバーのレプリケーション ユーザーの権限を更新します
  10. ソース データベース サーバーで受信接続を許可します
  11. レプリケーションの設定を確認します
  12. レプリケーション ログを確認します(省略可)
  13. データを複製します
  14. レプリケーションのステータスを確認します
  15. ストレージをクリーンアップします。

オンライン + マネージド ダンプ

  1. Google Cloud でプロジェクトを設定します
  2. ソース データベース サーバーの Google Cloud SDK をインストールします
  3. ソース データベース サーバーでレプリケーション ユーザーを作成します
  4. ソース表現インスタンスを設定します
  5. Cloud SQL レプリカを設定します
  6. インスタンスが Cloud SQL に正しく追加されたことを確認します
  7. Cloud SQL レプリカにユーザーを追加します
  8. ソース データベース サーバーのレプリケーション ユーザーの権限を更新します
  9. ソース データベース サーバーで受信接続を許可します
  10. レプリケーションの設定を確認します
  11. レプリケーション ログを確認します(省略可)
  12. データを複製します
  13. レプリケーションのステータスを確認します

オフライン + ファイル

  1. Google Cloud でプロジェクトを設定します
  2. ソース データベース サーバーの Google Cloud SDK をインストールします
  3. ソース データベース サーバーでレプリケーション ユーザーを作成します
  4. ソース データベース サーバーから Google Cloud バケットにデータをエクスポートします
  5. ソース表現インスタンスを設定します
  6. Cloud SQL レプリカを設定します
  7. インスタンスが Cloud SQL に正しく追加されたことを確認します
  8. Cloud SQL レプリカにユーザーを追加します
  9. ソース データベース サーバーのレプリケーション ユーザーの権限を更新します
  10. ソース データベース サーバーで受信接続を許可します
  11. データを複製します
  12. レプリケーションのステータスを確認します
  13. ストレージをクリーンアップします。

オフライン + マネージド ダンプ

  1. Google Cloud でプロジェクトを設定します
  2. ソース データベース サーバーの Google Cloud SDK をインストールします
  3. ソース データベース サーバーでレプリケーション ユーザーを作成します
  4. ソース表現インスタンスを設定します
  5. Cloud SQL レプリカを設定します
  6. インスタンスが Cloud SQL に正しく追加されたことを確認します
  7. Cloud SQL レプリカにユーザーを追加します
  8. ソース データベース サーバーのレプリケーション ユーザーの権限を更新します
  9. ソース データベース サーバーで受信接続を許可します
  10. レプリケーションの設定を確認します
  11. レプリケーション ログを確認します(省略可)
  12. データを複製します

構成手順

選択したレプリケーションに応じて、以下の操作を行います。

Google Cloud プロジェクトの設定

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    [プロジェクトの選択] ページに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud SQL Admin API を有効にします。

    API を有効にする

  5. ユーザー アカウントに Cloud SQL 管理者、ストレージ管理者、Compute 閲覧者のロールがあることを確認します。

    IAM ページに移動

  6. Cloud SQL Admin API を有効にします。

    API を有効にする

Google Cloud SDK のインストール

レプリケーションを構成するには、ソース データベース サーバーの Google Cloud SDK をインストールします。ソース データベース サーバーがまだインストールされていない場合は、インストールすることをおすすめします。

レプリケーション ユーザー アカウントの作成

ソース データベース サーバーに REPLICATION_SLAVE 権限を持つ MySQL ユーザー アカウントが存在している必要があります。このユーザー アカウントは、レプリケーションの管理にのみ使用します。レプリケーション ユーザー アカウントを追加するには、ソース データベース サーバーでターミナルを開き、次の MySQL コマンドを入力します。

MySQL

// Online migration with Cloud Storage file:
CREATE USER '[USERNAME]'@'%' IDENTIFIED BY '[PASSWORD]';
GRANT REPLICATION SLAVE, EXECUTE ON *.* TO '[USERNAME]'@'[HOST]';
FLUSH PRIVILEGES;

// Online migration with managed dump and GTID enabled:
CREATE USER '[USERNAME]'@'%' IDENTIFIED BY '[PASSWORD]';
GRANT REPLICATION SLAVE, EXECUTE, SELECT, SHOW VIEW ON *.* TO '[USERNAME]'@'[HOST]';
FLUSH PRIVILEGES;

// Online migration with managed dump and GTID disabled:
CREATE USER '[USERNAME]'@'%' IDENTIFIED BY '[PASSWORD]';
GRANT REPLICATION SLAVE, EXECUTE, SELECT, SHOW VIEW, REPLICATION CLIENT,
RELOAD ON *.* TO '[USERNAME]'@'[HOST]';
FLUSH PRIVILEGES;

// Offline migration with managed dump:
CREATE USER '[USERNAME]'@'%' IDENTIFIED BY '[PASSWORD]';
GRANT SELECT, SHOW VIEW ON *.* TO '[USERNAME]'@'[HOST]';
FLUSH PRIVILEGES;

CREATE USER 'bluewing'@'%' IDENTIFIED BY '8*&fwwd';
GRANT REPLICATION SLAVE ON *.* TO 'bluewing'@'%';
FLUSH PRIVILEGES;
プロパティ
[USERNAME] ソース データベース サーバーのレプリケーション ユーザー アカウント。
[PASSWORD] レプリケーション ユーザー アカウントのパスワード。
[HOST] 任意のホストからのすべての接続を受け入れるには、これを % に設定します。この後のステップで、Cloud SQL レプリカからの接続のみを受け入れるように変更されます。

Google Cloud バケットへのデータのエクスポート

Cloud SQL レプリカには、Google Cloud バケットからのデータを入力できます。次の条件があります。

  • MySQL にバンドルされている mysqldump ユーティリティを使用する必要があります。
  • mysqldump の実行中は、ソース データベース サーバーで DDL オペレーションを実行しないでください。DLL オペレーションを行うと、エクスポート ファイルに不整合が生じる可能性があります。

データをバケットにアップロードする手順は次のとおりです。

  1. Google Cloud でバケットを作成します
  2. ソース データベース サーバーでターミナルを開き、次のコマンドを実行します。

mysqldump

mysqldump \
    --host=[SOURCE_HOST] \
    --port=[SOURCE_PORT] \
    --user=[USERNAME]\
    --password \
    [DATABASE_LIST]  \
    --hex-blob \
    [SOURCE_DATA]  \
    --no-autocommit \
    --default-character-set=utf8mb4 \
    --single-transaction \
    [GTID_PURGED] \
    [ADD_DROP_TABLE] \
    [ROUTINES] \
    [COMPRESS] \
    [GZIP] \
    | gsutil cp - gs://[BUCKET]/[DUMP_FILENAME]

mysqldump \
    --host=192.0.2.1 \
    --port=3306 \
    --user=replicationUser \
    --password \
    --databases guestbook journal \
    --hex-blob \
    --master-data=1 \
    --no-autocommit \
    --default-character-set=utf8mb4 \
    --single-transaction \
    --compress \
    | gzip \
    | gsutil cp - gs://replica-bucket/source-database.sql.gz
プロパティ
[SOURCE_HOST] ソース データベース サーバーの IPv4 または DNS アドレス。
[SOURCE_PORT] ソース データベース サーバーのポート。ソース データベース サーバーが Cloud SQL でホストされている場合、これは 3306 になります。
[USERNAME] データベース読み取り権限を持つソース データベース サーバー上のレプリケーション ユーザー アカウントまたはユーザー アカウントの名前。
[DATABASE_LIST] ソース データベース サーバー上の、システム データベース(sysmysqlperformance_schemainformation_schema)を除くすべてのデータベースのスペースで区切られたリスト。データベースを一覧表示するには、SHOW DATABASES MySQL コマンドを使用します。
[SOURCE_DATA] ソース データベース サーバーで GTID がサポートされておらず、グローバル読み取りロックにアクセスする権限がある場合は、--master-data=1 を使用します。それ以外の場合は、このプロパティを使用しないでください。
[GTID_PURGED] ソース データベース サーバーで GTID がサポートされている場合は、--set-gtid-purged=on を使用します。それ以外の場合は、このプロパティを使用しないでください。
[ADD_DROP_TABLE] CREATE TABLE ステートメントの前に DROP TABLE ステートメントを追加する場合は、--add-drop-table を含めます。
[ROUTINES] ダンプされたデータベースの出力に保存されているルーティン(プロシージャや関数など)を表示するには、--routines を含めます。
[COMPRESS] Cloud SQL レプリカとソース データベース サーバーの間で送信されるすべての情報を圧縮するには、--compress を使用します。
[GZIP] ダンプファイルをさらに圧縮するには、| gzip を使用します。圧縮に適さないデータ(圧縮されないバイナリデータや JPG 画像など)がデータベースに含まれている場合は、これを使用しないでください。
[BUCKET] ステップ 1 で作成したバケットの名前にはダンプファイルが含まれます。
[DUMP_FILENAME] この名前のファイルがバケット内に作成されます。このファイルには、ソース データベース サーバー上のデータベースのコンテンツが含まれます。

ソース表現インスタンスの設定

ソース表現のインスタンスはソース データベース サーバーを参照します。これには、ソース データベース サーバーのリクエスト データのみが含まれます。この手順では、リクエスト データを作成して cURL コマンドで使用し、Cloud SQL でソース表現インスタンスを作成します。

リクエスト データの作成

リクエスト データには、ソース データベース サーバーに関する基本情報が JSON 形式で含まれています。リクエスト データは、パブリック ネットワークまたはプライベート ネットワーク上の Cloud SQL レプリカ用に構成でき、この情報が含まれている必要があります。

source.json

{
  "name": "[SOURCE_NAME]",
  "region": "[REGION]",
  "databaseVersion": "[MYSQL_VERSION]",
  "onPremisesConfiguration": {
    "hostPort": "[SOURCE_HOST]",
    "username": "[USERNAME]",
    "password": "[PASSWORD]",
    "dumpFilePath": "gs://[BUCKET]/[DUMP_FILE]",
    "caCertificate": "[SOURCE_CERT]",
    "clientCertificate": "[CLIENT_CERT]",
    "clientKey": "[CLIENT_KEY]"
  }
}

マネージド ダンプの例

// example of source.json for source database server that
// - initiates replication from a Cloud SQL managed dump
// - does not use SSL/TSL

{
  "name": "cloudsql-source-instance",
  "region": "us-central1",
  "databaseVersion": "MYSQL_5_7",
  "onPremisesConfiguration": {
    "hostPort": "192.0.2.0:3306",
    "username": "replicationUser",
    "password": "486#@%*@"
  }
}

ダンプファイルの例

// example of source.json for source database server that
// - initiates replication from a file
// - uses SSL/TSL

{
  "name": "cloudsql-source-instance",
  "region": "us-central1",
  "databaseVersion": "MYSQL_5_7",
  "onPremisesConfiguration": {
    "hostPort": "192.0.2.0:3306",
    "username": "replicationUser",
    "password": "486#@%*@",
    "dumpFilePath": "gs://replica-bucket/source-database.sql.gz",
    "caCertificate": "content of your certificate",
    "clientCertificate": "content of your certificate",
    "clientKey": "content of your client key"
  }
}
省略可能なフィールド
dumpFilePath Cloud SQL バケットに存在するダンプファイルを使用してレプリケーションを設定する場合にのみ指定します。
caCertificate ソース データベース サーバーで SSL / TLS が使用されている場合にのみ指定します。
clientCertificate ソース データベース サーバーで SSL / TLS が使用されている場合にのみ指定します。
clientKey ソース データベース サーバーで SSL / TLS が使用されている場合にのみ指定します。
プロパティ
[SOURCE_NAME] 作成するソース表現インスタンスの名前。
[REGION] ソース表現インスタンスを配置するリージョン
[MYSQL_VERSION] ソース データベース サーバーで実行されている MySQL のバージョン。MYSQL_5_5MYSQL_5_6MYSQL_5_7MYSQL_8_0 から選択します。
[SOURCE HOST] ソース データベース サーバーの IPv4 アドレスとポート、またはソース データベース サーバーの DNS アドレス。DNS アドレスを使用する場合は、最大 60 文字を含めることができます。ソース データベース サーバーが Cloud SQL でホストされている場合、ポートは 3306 です。
[USERNAME] ソース データベース サーバーのレプリケーション ユーザー アカウント。
[PASSWORD] レプリケーション ユーザー アカウントのパスワード。
[BUCKET] ダンプファイルが含まれるバケットの名前。
[DUMP_FILE] ソース データベース サーバーのデータが含まれるバケット内のファイル。
[CLIENT_CA_CERT] ソースサーバーの CA 証明書。
[CLIENT_CERT] ソースサーバー上のクライアント証明書。サーバー クライアント認証を使用する場合にのみ必要です。
[CLIENT_KEY] ソース データベース サーバー上のクライアント証明書の秘密鍵ファイル。サーバー クライアント認証を使用する場合にのみ必要です。

ソース表現インスタンスの作成

この手順を行う前に、ソース リクエスト データが含まれる JSON ファイルを作成する必要があります。次に、ターミナルを開き、次のコマンドを使用して Cloud SQL でソース表現インスタンスを作成します。

cURL

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data @[JSON_PATH] \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data @./source.json \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances
プロパティ
[PROJECT_ID] Google Cloud のプロジェクトの ID。
[JSON_PATH] ソース データベース サーバーに対するリクエスト データが含まれる JSON ファイルへのパス。

Cloud SQL レプリカの設定

Cloud SQL レプリカには、最終的にソース データベース サーバーのデータが含まれるようになります。この手順では、リクエスト データを作成し、Cloud SQL で Cloud SQL レプリカを作成する cURL コマンドで使用します。

リクエスト データの作成

リクエスト データには、ソース データベース サーバーと Cloud SQL レプリカに関する基本情報が JSON 形式で含まれています。リクエスト データは、パブリック ネットワークまたはプライベート ネットワーク上の Cloud SQL レプリカ用に構成でき、この情報が含まれている必要があります。

replica.json

{
    "settings": {
        "tier": "[TIER]",
        "dataDiskSizeGb": "[DISK_SIZE]",
        "ipConfiguration": {
            "privateNetwork": "projects/[PROJECT_ID]/global/networks/[NETWORK_NAME]"
         }
    },
    "masterInstanceName": "[SOURCE_NAME]",
    "region": "[SOURCE_REGION]",
    "databaseVersion": "[MYSQL_VERSION]",
    "name": "[REPLICA_NAME]"
}

{
    "settings": {
        "tier": "db-n1-standard-4",
        "dataDiskSizeGb": "100"
    },
    "masterInstanceName": "source-instance",
    "region": "us-central1",
    "databaseVersion": "MYSQL_5_7",
    "name": "replica-instance"
}
省略可能なフィールド
ipConfiguration Cloud SQL レプリカがプライベート ネットワーク上にある場合にのみ、これを指定します。
プロパティ
[TIER] レプリカ インスタンスをホストするマシンタイプ。どのマシンタイプを使用するかわからない場合は、db-n1-standard-2 から始めます。後で必要に応じてサイズとサポートされている他の値を変更できます。
[DISK_SIZE] Cloud SQL レプリカのストレージ サイズ(GB)。
[SOURCE_NAME] ソース表現インスタンスの名前。
[SOURCE_REGION] ソース表現インスタンスに割り当てられているリージョン。
[MYSQL_VERSION] Cloud SQL レプリカで使用する MySQL のバージョン。MYSQL_5_6MYSQL_5_7MYSQL_8_0 から選択します。ソース データベース サーバーで実行されている MySQL と同じバージョンだけでなく、それよりも 1 つの大きいバージョンを使用することもできます。たとえば、ソース データベース サーバーで MySQL 5.5 を使用している場合、Cloud SQL レプリカで MySQL 5.6 を使用できます。
[REPLICA_NAME] 作成する Cloud SQL レプリカの名前。
[PROJECT_ID] Google Cloud のプロジェクトの ID。
[NETWORK_NAME] Cloud SQL レプリカで使用するプライベート ネットワークの名前。

Cloud SQL レプリカの作成

この手順を行う前に、レプリカ リクエスト データが含まれる JSON ファイルを作成する必要があります。次に、ターミナルを開き、次のコマンドを使用して Cloud SQL で Cloud SQL レプリカを作成します。

cURL

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data @[JSON_PATH] \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data @./replica.json \
     -X POST \
プロパティ
[PROJECT_ID] Google Cloud のプロジェクトの ID。
[JSON_PATH] Cloud SQL レプリカのリクエスト データが含まれる JSON ファイルへのパス。

完了すると表示される内容

インスタンスが正しく設定されていることを確認するには、Cloud SQL インスタンス ページに移動します。ソース表現インスタンスと Cloud SQL レプリカが表示されます。次のようになります。

インスタンス ID タイプ パブリック IP
(-) source-representation-instance MySQL 外部プライマリ 10.68.48.3:3306
replica-instance MySQL リードレプリカ 34.66.48.59

レプリケーション ユーザーの権限の更新

ソース データベース サーバー上のレプリケーション ユーザーは、任意のホスト(%)からの接続を受け入れるように構成されています。Cloud SQL レプリカでのみ使用されるように、このユーザー アカウントを更新する必要があります。ソース データベース サーバーでターミナルを開き、次のコマンドを入力します。

MySQL

UPDATE mysql.user
  SET Host='[NEW_HOST]' WHERE Host='[OLD_HOST]' AND User='[USERNAME]';
FLUSH PRIVILEGES;

UPDATE mysql.user
  SET Host='192.0.2.0' WHERE Host='%' AND User='replicationUser';
FLUSH PRIVILEGES;
プロパティ
[USERNAME] ソース データベース サーバーのレプリケーション ユーザー アカウント。
[NEW_HOST] Cloud SQL レプリカの送信 IP を指定します。
[OLD_HOST] 変更する Host に割り当てる現在の値。

ソース データベース サーバーでの受信接続の許可

レプリケーションを成功させるには、Cloud SQL レプリカがソース データベース サーバーに接続しなければなりません。次のすべてに当てはまる場合、ソース データベース サーバーで Cloud SQL レプリカの送信 IP アドレスからの接続を受け入れるようにネットワーク ファイアウォールを構成する必要があります。

  • ソース データベース サーバーがファイアウォールの背後にあるか、その他のネットワーク制限で保護されている。
  • Cloud SQL レプリカでパブリック IP を使用している。

手順については、承認済みアドレスまたはアドレス範囲を追加するをご覧ください。レプリカに接続するには、レプリカのプライマリ IP アドレスを使用します。この IP アドレスは、Cloud Console に表示されます。

レプリケーションの設定の確認

設定が完了したら、Cloud SQL レプリカがソース データベース サーバーから複製できることを確認します。

まず、外部同期設定が正しいことを確認します。以下のコマンドを使用して、次のことを確認します。

  • Cloud SQL レプリカとソース データベース サーバーの間の接続。
  • レプリケーション ユーザーの権限。
  • バージョンの互換性。

オンライン同期を実行している場合は、以下のコマンドで次のことも確認します。

  • Cloud SQL レプリカはまだレプリケートされていない。
  • バイナリログが、ソース データベース サーバーで有効になっている。
  • RDS ソース データベース サーバーから外部同期を行う場合と、Google Cloud バケットを使用している場合に、GTID が有効になっている。

ターミナルを開いて次のコマンドを入力して、外部同期設定が正しいことを確認します。

cURL

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "syncMode": "[SYNC_MODE]",
         "skipVerification": "[SKIP_VERIFICATION]"
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/[PROJECT_ID]/instances/[REPLICA_INSTANCE]/verifyExternalSyncSettings

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "syncMode": "online",
         "skipVerification": false
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/verifyExternalSyncSettings
プロパティ
[SYNC_MODE] 値は online または offline です。online の場合は、レプリケーションの設定後に verifyExternalSyncSettings を使用して、Cloud SQL レプリカとソース データベース サーバーの同期を維持できることを確認します。
[SKIP_VERIFICATION] データを同期する前に、組み込みの検証ステップをスキップするかどうか。レプリケーションの設定を確認している場合にのみ使用することをおすすめします。
[PROJECT_ID] Google Cloud のプロジェクトの ID。
[REPLICA_INSTANCE] Cloud SQL レプリカの ID。

レプリケーション ログの確認

レプリケーションの設定を確認すると、ログが生成されます。これらのログは次の手順で確認できます。

  1. Google Cloud Console のログビューアに移動します。

    ログビューアに移動

  2. [インスタンス] プルダウンから Cloud SQL レプリカを選択します。
  3. replication-setup.log ログファイルを選択します。

    Cloud SQL レプリカでソース データベース サーバーに接続できない場合は、次の点を確認してください。

    • ソース データベース サーバー上のすべてのファイアウォールが、Cloud SQL レプリカの送信 IP アドレスからの接続を受け入れるように構成されている。
    • SSL / TLS 構成が正しく行われている。
    • 正しいレプリケーション ユーザー、ホスト、パスワードを使用している。

ソース データベース サーバーの複製

ソース データベース サーバーから複製できることを確認したら、レプリケーションを実行する準備は完了です。レプリカは 1 時間あたり 25~50 GB をインポートすると想定してください。

最初のインポート プロセス中は、ソース データベース サーバーで DDL オペレーションを実行しないでください。インポートを行うと、インポート中に不整合が生じる可能性があります。インポート プロセスが完了すると、レプリカはソース データベース サーバー上のバイナリログを使用して、ソース データベース サーバーの現在の状態を複製します。

ソース データベース サーバーのグローバル読み取りロックにアクセスする権限がなく、GTID がオフの場合(Amazon RDS では多くの場合この状態になっています)は、「ログ付きの手順」をご覧ください。それ以外の場合は、「手順」をご覧ください。

手順

ターミナルを開き、これらのコマンドを入力して、ソース データベース サーバーから複製します。

ログ付きの手順

  1. ログビューアに移動し、リソースリストから Cloud SQL レプリカを選択します。Cloud SQL レプリカの最新のログのリストが表示されます。ここでは無視します。
  2. ターミナルを開き、これらの手順の下にあるコマンドを入力して、ソース データベース サーバーから複製します。
  3. ログビューアに戻ります。以下のログが表示されたら、ソース データベース サーバー上のデータベースへの書き込みを停止します。ほとんどの場合、数秒間の停止ですみます。

    DUMP_IMPORT(START): Start importing data, please pause any write to the external primary database.
    
  4. ログビューアで以下のログが表示されたら、ソース データベース サーバー上のデータベースへの書き込みを再度有効にします。

    DUMP_IMPORT(SYNC): Consistent state on primary and replica. Writes to the external primary may resume.
    

ソース データベース サーバーからの複製に使用するコマンドは次のとおりです。

cURL

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "syncMode": "[SYNC_MODE]",
         "skipVerification": "[SKIP_VERIFICATION]"
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/[PROJECT_ID]/instances/[REPLICA_INSTANCE]/startExternalSync

gcloud auth login
ACCESS_TOKEN="$(gcloud auth print-access-token)"
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
     --header 'Content-Type: application/json' \
     --data '{
         "syncMode": "online",
         "skipVerification": false
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/startExternalSync
プロパティ
[SYNC_MODE] 値は online または offline です。online の場合、ソース データベース サーバーに対する今後の変更が Cloud SQL レプリカに反映されます。offline の場合、今後の変更は Cloud SQL レプリカに反映されません。
[SKIP_VERIFICATION] データを同期する前に、組み込みの検証ステップをスキップするかどうか。レプリケーションの設定を確認している場合にのみ使用することをおすすめします。
[PROJECT_ID] Google Cloud のプロジェクトの ID。
[REPLICA_INSTANCE] Cloud SQL レプリカの ID。

レプリケーションのステータスを確認する

Cloud SQL レプリカはレプリケーションを完了すると、ソース データベース サーバーに接続し、エクスポートの実行後に行われたすべての更新を適用します。こちらの手順に沿って、レプリケーションのステータスを確認します

スタンドアロン インスタンスにレプリカを昇格する前に、レプリケーションのステータスを確認することが重要です。レプリケーション プロセスが正しく完了しなかった場合、昇格されたレプリカには、ソース表現インスタンスからの変更がすべて含まれるわけではありません。

レプリケーションの遅延が 0 に近づかない場合は、対応が必要です

GTID がオフになっている場合、昇格したレプリカでポイントインタイム リカバリ(PITR)とバイナリログは無効になります。GTID を有効にするには、PITR を有効にします。その場合、インスタンスを再起動する必要があります。

ストレージをクリーンアップする

バケット内のファイルから複製した場合は、このファイルとバケットを削除できます。オブジェクトの削除バケットの削除に関する Cloud Storage のドキュメントをご覧ください。

追加の手順

以下の手順は、レプリケーションの設定に役立ちます。

バイナリログの保持期間の構成

バイナリログが少なくとも 24 時間保持するようにソース データベース サーバーを構成する必要があります。

MySQL コミュニティ

ソース データベース サーバーが MySQL Community Edition を使用している場合は、これらの MySQL コマンドを使用してバイナリログの保持設定を更新できます。

Cloud MySQL

ソース データベース サーバーで Cloud SQL MySQL を使用している場合、バイナリログは 7 日間保持されます。この設定を後から変更することはできません。

Amazon RDS

ソース データベース サーバーが Amazon RDS インスタンスの場合、次のコマンドを使用して、バイナリログ保持の設定を更新できます。

call mysql.rds_set_configuration('binlog retention hours', 24);

Cloud SQL レプリカへのユーザーの追加

MySQL ユーザー アカウントは、ソース データベース サーバーからインポートできませんが、Cloud SQL レプリカに作成できます。ソース データベース サーバーから複製する前に作成してください。

Cloud SQL レプリカの送信 IP アドレスの取得

Cloud SQL レプリカの送信 IP アドレスを使用して、ソース データベース サーバーと Cloud SQL レプリカ間にセキュアな接続を作成できます。この送信 IP アドレスを取得するには、いくつかの方法があります。

gcloud

gcloud sql instances describe [REPLICA_NAME] --format="default(ipAddresses)"

Cloud SQL

  1. [Cloud SQL インスタンス] ページを開きます。
  2. Cloud SQL レプリカのパブリック IP アドレスの横にある [詳細] ツールチップにカーソルを合わせて、送信 IP アドレスを取得します。この送信 IP アドレスは、Cloud Console でレプリカのメインリストに表示される IP アドレスではありません。

ソース表現または Cloud SQL レプリカの更新

ソース表現または Cloud SQL レプリカを設定したら、これらの構成更新できます。たとえば、次のようなシナリオでは構成の更新が必要です。

  • ソース データベース サーバーのホスト、ポート、または IP を変更する。
  • 別の MySQL レプリケーション ユーザーを使用する。
  • MySQL レプリケーション ユーザーのパスワードを変更する。
  • ソース データベース サーバーとのセキュア接続に使用する SSL 証明書を変更する。

トラブルシューティング

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

この問題については... 次のような問題が考えられます... 次のことを試します...
Specified key was too long; max key length is 767 bytes 外部プライマリ インスタンスに innodb_large_prefix 変数が設定されている可能性があります。 レプリカを作成するときに、innodb_large_prefix フラグON に設定します。あるいは、フラグを使用して、既存のレプリカを更新します。
Table definition has changed ダンプ処理中にデータ定義言語(DDL)が変更されました。 ダンププロセス中の DDL の変更を回避します
エラー メッセージ: Access denied; you need (at least one of) the SUPER privilege(s) for this operation ソース データベースのビュー、関数、またはプロシージャが、Cloud SQL でサポートされていない方法で DEFINER を参照している可能性があります。 Cloud SQL での DEFINER の使用状況に関する詳細をご覧ください。
エラー メッセージ: ERROR 1045 (28000) at line {line_number}: Access denied for user 'cloudsqlimport'@'localhost レプリカに存在しない DEFINER がソース データベースにあります。 Cloud SQL での DEFINER の使用状況に関する詳細をご覧ください。
Lost connection to MySQL server during query when dumping table ソースが使用不能か、ダンプに含まれているパケットが大きすぎる可能性があります。 外部プライマリが接続可能な状態にします。または、max_allowed_packet オプションを指定して mysqldump を使用します。
Got packet bigger than 'max_allowed_packet' bytes when dumping table パケットが、設定された許容量を超えました。 max_allowed_packet オプションを指定して mysqldump を使用します。
最初のデータの移行は成功しましたが、データが複製されていません。 レプリケーション フラグが競合している可能性があります。 こちらのフラグ設定をご確認ください。
最初のデータ移行は成功しましたが、しばらくするとデータ レプリケーションが機能しなくなります。 さまざまな原因が考えられます。 次の手順を試してください。
mysqld check failed: data disk is full レプリカ インスタンスのデータディスクに空き容量がありません。 レプリカ インスタンスのディスクサイズを増やします。ディスクサイズを手動で増やすか、自動ストレージ増加を有効にします。

指定された鍵が長すぎる(キーの最大長は 767 バイト)

Specified key was too long; max key length is 767 bytes. というエラーが表示されます。

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

外部プライマリ インスタンスに innodb_large_prefix 変数が設定されている可能性があります。この場合、インデックス キーの接頭辞を 767 バイトより長くすることができます。MySQL 5.6 のデフォルト値は OFF です。

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

レプリカを作成するときに、innodb_large_prefix フラグを ON に設定します。あるいは、フラグを使用して、既存のレプリカを更新します。


表の定義が変更された

Table definition has changed というエラーが表示されます。

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

ダンプ処理中に DDL が変更されました。

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

ダンプ処理中のテーブルの変更や、その他の DDL の変更を行わないでください。


アクセスが拒否された(この操作を行うには、SUPER の権限の少なくとも 1 つが必要)

Access denied; you need (at least one of) the SUPER privilege(s) for this operation というエラーが表示されます。

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

根本原因としては、DEFINER に super user@localhost(root@localhost など)が指定された VIEW/FUNCTION/PROCEDURE を使用している可能性があります。これは Cloud SQL ではサポートされていません。

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

これを回避するには、外部データベースで DEFINER 句を更新します。たとえば、root@localhostroot@% または non superuser に更新します。詳細については、保存オブジェクトのアクセス制御をご覧ください。


ERROR 1045 (28000) at line xxx: Access denied for user 'cloudsqlimport'@'localhost

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

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

レプリカ データベースに、ソース データベース内で DEFINER 句を持つユーザーが存在しません。このユーザーはソース データベースのオブジェクト定義で相互参照されています。

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

ユーザーが移行されていません。レプリケーションを開始する前に、レプリカ データベースにソース データベースのユーザーを作成します。


テーブルをダンプする際にクエリ中に MySQL サーバーとの接続が切断された

Lost connection to MySQL server during query when dumping table というエラーが表示されます。

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

  • レプリカからソースに接続できなくなった可能性があります。

  • ソース データベースに大規模な blob または長い文字列を含むテーブルが存在している可能性があります。この場合、ソース データベースで max_allowed_packet にさらに大きい数値に設定する必要があります。

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

  • 再起動して、外部プライマリが接続できることを確認します。

  • max_allowed_packet オプションを指定して mysqldump を使用し、データをダンプして、そのダンプファイルを使用して移行を行います。


テーブルをダンプする際に max_allowed_packet バイトを超えるパケットを取得した

Got packet bigger than 'max_allowed_packet' bytes when dumping table というエラーが表示されます。

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

パケットが、設定された許容量を超えました。

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

max_allowed_packet オプションを指定して mysqldump を使用し、データをダンプして、そのダンプファイルを使用して移行を行います。


複製中のデータがない

最初のデータの移行は成功しましたが、データが複製されていません。

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

根本原因の 1 つとして、ソース データベースでレプリケーション フラグが定義されている可能性があります。これにより、データベースの一部またはすべての変更が複製されていない可能性があります。

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

binlog-do-dbbinlog-ignore-dbreplicate-do-dbreplicate-ignore-db などのレプリケーション フラグが競合する方法で設定されていないことを確認します。

プライマリ インスタンスで show master status コマンドを実行して、現在の設定を確認します。


最初のデータ移行は成功したが、しばらくするとデータ レプリケーションが機能しなくなる

最初のデータ移行は成功しましたが、しばらくするとデータ レプリケーションが機能しなくなります。

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

この問題には、多数の根本原因が考えられます。

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

  • Cloud Monitoring UI でレプリカ インスタンスのレプリケーション指標を確認します。

  • MySQL IO スレッドまたは SQL スレッドでのエラーは、mysql.err ログファイルの Cloud Logging で確認できます。

  • このエラーは、レプリカ インスタンスに接続するときにも発生する場合があります。SHOW SLAVE STATUS コマンドを実行して、出力で次のフィールドを確認します。

    • Slave_IO_Running
    • Slave_SQL_Running
    • Last_IO_Error
    • Last_SQL_Error

mysqld チェックエラー: データディスクに空きがない

mysqld check failed: data disk is full というエラーが表示されます。

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

DRAIN オペレーション中にこのエラーが表示された場合は、レプリカ インスタンスのデータディスクに空き容量が存在しません。

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

レプリカ インスタンスのディスクサイズを増やします。

次のステップ