ダンプファイルを使用して外部データベースからのレプリケーションを設定する

このページでは、外部サーバーから作成したダンプファイルがある場合に、レプリケーションを設定するプロセスについて説明します。

このページで説明する手順はすべて完了する必要があります。完了したら、他の Cloud SQL インスタンスと同じ方法でソース表現インスタンスを管理し、監視できます。

始める前に

始める前に、外部サーバーの構成ソース表現インスタンスの作成、Cloud SQL レプリカの設定を完了している必要があります。

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

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

mysql クライアント

    UPDATE mysql.user
      SET Host='NEW_HOST'
      WHERE Host='OLD_HOST'
      AND User='USERNAME';
      GRANT REPLICATION SLAVE, EXECUTE
      ON *.* TO 'GCP_USERNAME'@'HOST';
    FLUSH PRIVILEGES;

    UPDATE mysql.user
      SET Host='192.0.2.0'
      WHERE Host='%'
      AND User='replicationUser';
      GRANT REPLICATION SLAVE, EXECUTE
      ON *.* TO 'gcp_user'@'gmail.com';
    FLUSH PRIVILEGES;
プロパティ 説明
NEW_HOST Cloud SQL レプリカの送信 IP を指定します。
OLD_HOST 変更する Host に割り当てる現在の値。
USERNAME 外部サーバー上のレプリケーション ユーザー アカウント。
GCP_USERNAME Google Cloud Platform(GCP)ユーザー アカウントのユーザー名。
HOST Google Cloud Platform(GCP)ユーザー アカウントのホスト名。

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

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

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

  • Cloud SQL レプリカと外部サーバーとの間の接続
  • レプリケーション ユーザーの権限
  • バージョンの互換性
  • Cloud SQL レプリカはまだレプリケートされていない
  • 外部サーバーでバイナリログが有効になっている
  • グローバル トランザクション識別子(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",
       }' \
     -X POST \
     https://sqladmin.googleapis.com/sql/v1beta4/projects/myproject/instances/myreplica/verifyExternalSyncSettings
プロパティ 説明
SYNC_MODE レプリケーションの設定後に、verifyExternalSyncSettings は Cloud SQL レプリカと外部サーバーの同期が維持できることを確認します。同期モードには EXTERNAL_SYNC_MODE_UNSPECIFIEDONLINEOFFLINE があります。
SKIP_VERIFICATION データを同期する前に、組み込みの検証ステップをスキップするかどうか。レプリケーションの設定を確認している場合にのみ使用することをおすすめします。
PROJECT_ID Google Cloud のプロジェクトの ID。
REPLICA_INSTANCE Cloud SQL レプリカの ID。

データベースを Cloud Storage バケットにエクスポートする

Cloud SQL レプリカには、Cloud Storage バケット内にある mysqldump ファイルでデータを入力できます。次の条件があります。

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

データベースを Cloud Storage バケットにエクスポートするには、次の手順に従います。

  1. Google Cloud で、Cloud Storage バケットを作成します。
  2. 外部データベース サーバーに接続するクライアントを使用してターミナルを開き、次のコマンドを実行します。

mysqldump

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

Cloud Storage バケットのファイルパスでソース表現インスタンスを更新する

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

source.json ファイルには、ソース表現インスタンスに関する情報が含まれています。

REST

{
  "name": "PRIMARY_INSTANCE_NAME",
  "region": "REGION_NAME",
  "databaseVersion": "DB_NAME_AND_VERSION",
  "onPremisesConfiguration": {
    "hostPort": "IP_ADDRESS_AND_PORT",
    "username": "USERNAME",
    "password": "PASSWORD"
  },
  "dumpFilePath" :"DUMP_FILE_PATH"
}

{
  "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"
}
プロパティ 説明
PRIMARY_INSTANCE_NAME ソース表現インスタンスに関連付けられている Cloud SQL インスタンスの名前。
REGION_NAME ソース表現インスタンスに割り当てられるリージョンの名前。
DB_NAME_AND_VERSION ソース表現インスタンスに関連付けられているデータベースの名前とバージョン番号。
IP_ADDRESS_AND_PORT ソース表現インスタンス用に予約された IP アドレスとポート番号。
USERNAME ソース表現インスタンスのユーザー名。
PASSWORD ソース表現インスタンスのパスワード。
DUMP_FILE_PATH 外部サーバー上のデータベースのコンテンツを含むダンプファイルのパス。

Cloud SQL レプリカを設定したら、ソース表現インスタンスを Cloud Storage バケットのファイルパスで更新する必要があります。

REST

    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 PATCH \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances/SOURCE_REPRESENTATION_INSTANCE

    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 PATCH \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/cloudsql-source-instance
プロパティ 説明
JSON_PATH Cloud Storage バケットに保存されている JSON ファイルのパス。このファイルには、ソース表現インスタンスに関するデータが含まれています。
PROJECT_ID Google Cloud のプロジェクトの ID。
SOURCE_REPRESENTATION_INSTANCE ソース表現インスタンスの名前。

外部サーバーでレプリケーションを開始する

外部サーバーから複製できることを確認したら、レプリケーションを実行する準備は完了です。

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

ターミナルを開いて、gcloud を使用してログインし、curl コマンドを入力して外部サーバーから複製します。

REST

  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 レプリケーションの設定後に、Cloud SQL レプリカと外部サーバーの同期が維持できることを確認します。
SKIP_VERIFICATION データを同期する前に、組み込みの検証ステップをスキップするかどうか。レプリケーションの設定を確認している場合にのみ使用することをおすすめします。
PROJECT_ID Google Cloud のプロジェクトの ID。
REPLICA_INSTANCE Cloud SQL レプリカの ID。

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

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

レプリケーションを続行する

外部サーバーからのレプリケーションを開始したら、レプリケーションをモニタリングし、移行を完了する必要があります。詳細については、レプリケーションのモニタリングをご覧ください。

トラブルシューティング

問題 トラブルシューティング
Lost connection to MySQL server during query when dumping table. ソースが使用不能か、ダンプに含まれているパケットが大きすぎる可能性があります。

外部プライマリが接続できることを確認します。また、ソース インスタンスの net_read_timeout フラグと net_write_timeout フラグの値を変更して、エラーを防ぐこともできます。これらのフラグに使用可能な値の詳細については、データベース フラグを構成するをご覧ください。

マネージド インポート移行の mysqldump フラグの使用方法については、使用可能な初期同期フラグとデフォルトの初期同期フラグをご覧ください。

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

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

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

最初のデータ移行は成功したが、しばらくするとデータ レプリケーションが機能しなくなる。 次の方法をお試しください。

  • Google Cloud Console の [Cloud Monitoring] セクションで、レプリカ インスタンスのレプリケーション指標を確認します。
  • MySQL IO スレッドまたは SQL スレッドのエラーは、mysql.err log ファイルの Cloud Logging で確認できます。
  • このエラーは、レプリカ インスタンスに接続するときにも発生する場合があります。SHOW SLAVE STATUS コマンドを実行して、出力で次のフィールドを確認します。
    • Slave_IO_Running
    • Slave_SQL_Running
    • Last_IO_Error
    • Last_SQL_Error
mysqld check failed: data disk is full. レプリカ インスタンスのデータディスクに空き容量がありません。

レプリカ インスタンスのディスクサイズを増やします。ディスクサイズを手動で増やすか、自動ストレージ増加を有効にします。

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

レプリケーションの設定を確認したときに、ログが生成されています。

これらのログは次の手順で確認できます。

  1. Google Cloud コンソールでログビューアに移動します。

    ログビューアに移動

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

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

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

次のステップ