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

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

始める前に

用語

  • ソース データベース サーバー。管理する 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.7 がインストールされている場合は、Cloud SQL レプリカで Cloud SQL MySQL 8.0 を使用できます。ソース データベース サーバーの SQL モードNO_AUTO_CREATE_USER を含めることはできません。NO_AUTO_CREATE_USER を使用してトリガー、関数、またはストアド プロシージャが作成されている場合、NO_AUTO_CREATE_USER なしで削除して再作成する必要があります。
    • MySQL 5.5 がソース データベース サーバーにインストールされている場合、GTID はサポートされません。
  • バイナリログが有効になっていること、および以下を確認します。

  • ソース データベース サーバーで GTID が有効になっているかどうかを確認してください。これは、レプリケーションの設定に必要な手順に影響します。

  • ソース データベース サーバーにグローバルな読み取りロック権限があるかどうかを確認してください。これは、レプリケーションの設定に必要な手順に影響します。

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

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. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google 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] この形式 --databases database_name1 <database_name2 ...> で含めるソース データベース サーバー上のデータベース。
[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] この名前のファイルがバケット内に作成されます。 このファイルには、ソース データベース サーバー上のデータベースのコンテンツが含まれています。

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

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

リクエスト データの作成

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

ソース.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://www.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://www.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://www.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 \
     https://www.googleapis.com/sql/v1beta4/projects/MyProject/instances
プロパティ
[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]"
       }' \
     -X POST \
     https://www.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"
       }' \
     -X POST \
     https://www.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/verifyExternalSyncSettings
プロパティ
[SYNC_MODE] 取り得る値は、online または offline です。online を使用すると、レプリケーションの設定後、verifyExternalSyncSettings で、Cloud SQL レプリカとソース データベース サーバーの同期を維持できることを確認します。
[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 master database.
    
  4. ログビューアで以下のログが表示されたら、ソース データベース サーバー上のデータベースへの書き込みを再度有効にします。

    DUMP_IMPORT(SYNC): Consistent state on master and replica. Writes to the external master 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]"
       }' \
     -X POST \
     https://www.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"
       }' \
     -X POST \
     https://www.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/startExternalSync
プロパティ
[SYNC_MODE] 取り得る値は、online または offline です。online の場合、ソース データベース サーバー上の将来の変更が Cloud SQL レプリカに反映されます。offline の場合、将来の変更は Cloud SQL レプリカに反映されません。
[PROJECT_ID] Google Cloud のプロジェクトの ID。
[REPLICA_INSTANCE] Cloud SQL レプリカの ID。

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

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

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

レプリケーションの遅延が 0 に近づかない場合は、対処します

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

バケット内のファイルから複製された場合は、このファイルとバケットを削除できます。オブジェクトの削除バケットの削除については、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 変数が設定されていることがあります。 レプリカを作成する、または既存のレプリカをフラグで更新する場合は、ONinnodb_large_prefix フラグを設定します
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 の使用状況に関する詳細をご覧ください。
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 です。

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

レプリカを作成する、または既存のレプリカをフラグで更新する場合は、ONinnodb_large_prefix フラグを設定します。


表の定義が変更された

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

考えられる原因

ダンププロセス中に DDL が変更されました。

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

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


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

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

考えられる原因

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

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

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


テーブルをダンプする際にクエリ中に 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 check failed: データディスクに空きがない

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

考えられる原因

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

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

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

次のステップ