Compute Engine での MySQL データベースのクローン作成

このチュートリアルでは、Compute Engine で動作する MySQL データベースのクローンを作成する 2 つの方法について説明します。1 つ目の方法では、永続ディスクのスナップショットを使用します。2 つ目の方法では、ネイティブの MySQL エクスポートとインポートを使用し、Cloud Storage を使用してエクスポート ファイルを転送します。Cloud Storage は Google Cloud オブジェクト ストレージ サービスです。セキュリティと可用性が高く、耐久性があり、わかりやすいファイルの保存手段です。

クローニングとは、データベースを別のサーバーにコピーするプロセスのことです。データベースのコピーは、ソース データベースから独立し、ポイントインタイム スナップショットとして保存されます。本番環境サーバーに負荷をかけることや、本番環境データの整合性を損なうことなく、クローンを作成したデータベースをさまざまな目的に使用できます。その目的には、次のようなものがあります。

  • 分析クエリの実行。
  • アプリの負荷テストや統合テスト。
  • データ ウェアハウスに入力するデータの抽出。
  • データに対するテストの実施。

このチュートリアルで説明するクローンの作成方法には、それぞれにメリットとデメリットがあります。目的に適した方法は状況によって異なります。次の表に、重要な検討事項をいくつか示します。

検討事項 方法 1: ディスクのスナップショット 方法 2: Cloud Storage を使用するエクスポートおよびインポート
MySQL インスタンスのディスク容量の追加 追加のディスク容量は不要 エクスポート ファイルの作成時および復元時に追加容量が必要
クローン作成時のソース MySQL インスタンスへの負荷の追加 追加の負荷なし エクスポート ファイルの作成時およびアップロード時に、CPU と I/O への追加の負荷あり
クローン作成にかかる時間 大規模なデータベースの場合は比較的短い 大規模なデータベースの場合は比較的長い
Google Cloudの外部にある MySQL インスタンスからクローンを作成できるか いいえ
複雑さ クローン作成したディスクの接続に複雑なコマンド シーケンスあり クローン作成用のコマンドセットは比較的簡単
既存のバックアップ システムを活用できるか ○(バックアップ システムが Google Cloud ディスクのスナップショットを使用している場合) ○(バックアップ システムが Cloud Storage にファイルをエクスポートできる場合)
クローン作成の単位 ディスク全体のクローン作成のみ 指定したデータベースのクローン作成のみ
データの整合性 スナップショット時点での整合性 エクスポート時点での整合性
クローンの作成元として Cloud SQL を使用できるか いいえ ○(同じバージョンを使用している場合)
クローンの作成先として Cloud SQL を使用できるか いいえ

このチュートリアルは、Linux コマンドラインと MySQL データベースの管理を理解していることを前提としています。

環境の設定

このチュートリアルを最後まで進めるには、お使いのコンピューティング環境に次のものを設定する必要があります。

  • 本番環境データベース サーバーを表す Compute Engine 上の MySQL インスタンス(名前は mysql-prod とします)。
  • 本番環境データベースの保存用に本番環境サーバーにアタッチする追加ディスク(名前は mysql-prod-data とします)。
  • mysql-prod にインポートされた Employees データベースのコピー。クローンを作成する本番環境データベースをシミュレートします。
  • テスト環境データベース サーバーを表す Compute Engine 上の MySQL インスタンス(名前は mysql-test とします)。このサーバー上にデータベースのクローンを作成します。

次の図は、このアーキテクチャを表しています。

このチュートリアルにおける MySQL データベースのクローン作成の構造を示す図。

本番環境 VM インスタンスを作成する

本番環境をシミュレートするには、Debian Linux で MySQL を実行する Compute Engine VM インスタンスを設定します。

このチュートリアルの VM インスタンスは、OS とユーザー アカウント用に 50 GB ディスク、データベース ストレージ用に 100 GB ディスクの 2 つのディスクを使用します。

Compute Engine では、ディスクを分けることによるパフォーマンス上のメリットはありません。ディスクのパフォーマンスは、インスタンスにアタッチされているすべてのディスクの合計ストレージ容量と、VM インスタンスの vCPU の合計数によって決まります。したがって、データベースとログファイルは同じディスク上に存在できます。

  1. Cloud Shell を開きます。

    Cloud Shell を開く

  2. 優先ゾーンを設定します。

    ZONE=us-east1-b
    REGION=us-east1
    gcloud config set compute/zone "${ZONE}"
    
  3. Compute Engine インスタンスを作成します。

    gcloud compute instances create mysql-prod \
        --machine-type=n1-standard-2 \
        --scopes=cloud-platform \
        --boot-disk-size=50GB \
        --boot-disk-device-name=mysql-prod \
        --create-disk="mode=rw,size=100,type=pd-standard,name=mysql-prod-data,device-name=mysql-prod-data"
    

    このコマンドは、インスタンスに Google Cloud API への完全アクセス権を付与します。さらに、100 GB のセカンダリ ディスクを作成して、インスタンスにアタッチします。このチュートリアルでは高いパフォーマンスを必要としないため、ディスク パフォーマンスの警告は無視してください。

追加ディスクを設定する

本番環境インスタンスにアタッチされている 2 番目のディスクは、本番環境データベースを保存するためのものです。このディスクは空のため、パーティション、フォーマット、マウントを行う必要があります。

  1. Google Cloud コンソールで、[VM インスタンス] ページに移動します。

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

  2. mysql-prod インスタンスの横に、準備完了を表す緑色のチェックマーク が表示されていることを確認します。

  3. mysql-prod インスタンスの横にある [SSH] をクリックします。ブラウザが開き、インスタンスに対するターミナル接続が表示されます。

  4. ターミナル ウィンドウで、インスタンスに接続されているディスクの一覧を表示します。

    lsblk
    

    次のような出力が表示されます。

    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   50G  0 disk
    └─sda1   8:1    0   50G  0 part /
    sdb      8:16   0  100G  0 disk
    

    sdb という名前のディスク(100 GB)がデータディスクです。

  5. sdb ディスクをフォーマットし、ext4 ファイル システムのパーティションを 1 つ作成します。

    sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard \
        /dev/sdb
    
  6. データディスクのマウント ポイントとなる MySQL データ ディレクトリを作成します。

    sudo mkdir -p /var/lib/mysql
    
  7. 作成したマウント ポイントにディスクを自動的にマウントするには、/etc/fstab ファイルに次の記述を追加します。

    echo "UUID=`sudo blkid -s UUID -o value /dev/sdb` /var/lib/mysql ext4 discard,defaults,nofail 0 2" \
       | sudo tee -a /etc/fstab
    
  8. ディスクをマウントします。

    sudo mount -av
    
  9. MySQL がデータ ディレクトリとして使用できるように、データディスクからすべてのファイルを削除します。

    sudo rm -rf /var/lib/mysql/*
    

MySQL サーバーをインストールする

MySQL Community Edition をダウンロードしてインストールする必要があります。追加のディスクに MySQL データ ディレクトリが作成されます。

  1. mysql-prod に接続された SSH セッションで、MySQL 構成パッケージをダウンロードしてインストールします。

    wget http://repo.mysql.com/mysql-apt-config_0.8.13-1_all.deb
    sudo dpkg -i mysql-apt-config_0.8.13-1_all.deb
    
  2. プロンプトが表示されたら、[MySQL Server & Cluster option] を選択し、続いて [mysql-5.7] を選択します。

  3. リストで [Ok] オプションを選択し、パッケージの構成を完了します。

  4. リポジトリのキャッシュを更新し、mysql-community パッケージをインストールします。

    sudo apt-get update
    sudo apt-get install -y mysql-community-server mysql-community-client
    
  5. データ ディレクトリがすでに存在するという警告が表示されたら、[Ok] を選択します。

  6. root パスワードの入力を求められたら、パスワードを作成して入力します。パスワードはメモするか、安全な場所に一時的に保存します。

サンプル データベースをダウンロードしてインストールする

  1. mysql-prod インスタンスに接続された SSH セッションで、git をインストールします。

    sudo apt-get install -y git
    
  2. Employees データベース スクリプトが格納された GitHub リポジトリのクローンを作成します。

    git clone https://github.com/datacharmer/test_db.git
    
  3. Employees データベース スクリプト用のディレクトリに移動します。

    cd test_db
    
  4. Employees データベースを作成するスクリプトを実行します。

    mysql -u root -p -q < employees.sql
    

    プロンプトが表示されたら、前の手順で作成した root パスワードを入力します。

  5. サンプル データベースが機能していることを確認するには、employees テーブルの行数をカウントするクエリを実行します。

    mysql -u root -p -e "select count(*) from employees.employees;"
    

    プロンプトが表示されたら、前の手順で作成した root パスワードを入力します。

    次のような出力が表示されます。

    +----------+
    | count(*) |
    +----------+
    |   300024 |
    +----------+
    

テスト VM インスタンスを作成する

このセクションでは、クローン データベースの作成先として、mysql-test という名前の MySQL VM インスタンスを作成します。このインスタンスの構成は、本番環境インスタンスと同じです。ただし、2 番目のデータディスクは作成しません。代わりに、このチュートリアルの後半でデータディスクをアタッチします。

  1. Cloud Shell を開きます。

    Cloud Shell を開く

  2. テスト用の MySQL インスタンスを作成します。

    gcloud compute instances create mysql-test \
      --machine-type=n1-standard-2 \
      --scopes=cloud-platform \
      --boot-disk-size=50GB \
      --boot-disk-device-name=mysql-test
    

    このチュートリアルでは高いパフォーマンスを必要としないため、ディスク パフォーマンスの警告は無視してください。

テスト VM インスタンスに MySQL サーバーをインストールする

mysql-test VM インスタンスにも MySQL Community Edition をダウンロードしてインストールする必要があります。

  1. mysql-test に接続された SSH セッションで、MySQL 構成パッケージをダウンロードしてインストールします。

    wget http://repo.mysql.com/mysql-apt-config_0.8.13-1_all.deb
    sudo dpkg -i mysql-apt-config_0.8.13-1_all.deb
    
  2. プロンプトが表示されたら、[MySQL Server & Cluster option] を選択し、続いて [mysql-5.7] を選択します。

  3. リストで [Ok] オプションを選択し、パッケージの構成を完了します。

  4. リポジトリのキャッシュを更新し、mysql-community パッケージをインストールします。

    sudo apt-get update
    sudo apt-get install -y mysql-community-server mysql-community-client
    
  5. root パスワードの入力を求められたら、パスワードを作成して入力します。パスワードはメモするか、安全な場所に一時的に保存します。

Compute Engine のディスク スナップショットを使用してデータベースのクローンを作成する

Compute Engine で実行される MySQL データベースのクローンを作成する方法の 1 つは、データベースを別のデータディスクに保存し、永続ディスク スナップショットを使用してそのディスクのクローンを作成することです。

永続ディスクのスナップショットを使用すると、ディスク上のデータのポイントインタイム コピーを取得できます。ディスク スナップショットのスケジュールを設定すると、データを自動的にバックアップできます。

このセクションでは、次の操作を行います。

  • 本番環境サーバーのデータディスクのスナップショットを作成します。
  • スナップショットから新しいディスクを作成します。
  • 新しいディスクをテストサーバーにマウントします。
  • サーバーが新しいディスクをデータディスクとして使用するように、テスト インスタンスで MySQL サーバーを再起動します。

次の図は、ディスク スナップショットを使用してデータベースのクローンを作成する方法を示しています。

ディスク スナップショットを使用して MySQL データベースのクローンを作成するための設定を示す図。

ディスク スナップショットを作成する

  1. Cloud Shell を開きます。

    Cloud Shell を開く

  2. VM インスタンスと同じゾーンにデータディスクのスナップショットを作成します。

    gcloud compute disks snapshot mysql-prod-data \
         --snapshot-names=mysql-prod-data-snapshot \
         --zone="${ZONE}"
    

    スナップショットの作成には、数分かかります。

ディスク スナップショットをテスト インスタンスにアタッチする

作成したスナップショットから新しいデータディスクを作成し、mysql-test インスタンスにアタッチする必要があります。

  1. Cloud Shell を開きます。

    Cloud Shell を開く

  2. 本番環境ディスクのスナップショットを使用して、そのコンテンツ用の新しい永続ディスクを作成します。

    gcloud beta compute disks create mysql-test-data \
         --size=100GB \
         --source-snapshot=mysql-prod-data-snapshot \
         --zone="${ZONE}"
    
  3. 新しいディスクを、読み取りと書き込み権限付きで mysql-test インスタンスにアタッチします。

    gcloud compute instances attach-disk mysql-test \
        --disk=mysql-test-data --mode=rw
    

Linux で新しいデータディスクをマウントする

クローンを作成したデータディスクを MySQL のデータ ディレクトリとして使用するには、MySQL インスタンスを停止してディスクをマウントする必要があります。

  1. mysql-test に接続された SSH セッションで、MySQL サービスを停止します。

    sudo service mysql stop
    
  2. ターミナル ウィンドウで、インスタンスにアタッチされているディスクの一覧を表示します。

    lsblk
    

    次のような出力が表示されます。

    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   50G  0 disk
    └─sda1   8:1    0   50G  0 part /
    sdb      8:16   0  100G  0 disk
    

    sdb という名前のディスク(100 GB)がデータディスクです。

  3. MySQL データディスクを MySQL のデータ ディレクトリにマウントします。

    sudo mount -o discard,defaults /dev/sdb /var/lib/mysql
    

    このディスクをマウントすると、MySQL の構成ファイルとテーブル スペースが非表示になり、このディスクの内容に置き換えられます。

    このコマンドで行うディスクのマウントは一時的なもので、システム起動時に再マウントされません。システムの起動時にディスクをマウントする場合は、fstab エントリを作成します。詳細については、前述の追加ディスクを設定するをご覧ください。

テスト インスタンスで MySQL を起動する

  1. mysql-test に接続された SSH セッションで、MySQL サービスを起動します。

    sudo service mysql start
    
  2. クローンを作成したデータベースが機能していることを確認するには、employees テーブルの行数をカウントするクエリを実行します。

    mysql -u root -p -e "select count(*) from employees.employees;"
    

    入力を求めるメッセージが表示されたら、mysql-prod データベース サーバーの root パスワードを入力します。本番環境インスタンスの root パスワードが必要になる理由は、MySQL データ ディレクトリ全体が mysql-prod インスタンスのデータ ディレクトリのクローンであり、データベース、データベース ユーザーとそのパスワードがすべてコピーされるためです。

    +----------+
    | count(*) |
    +----------+
    |   300024 |
    +----------+
    

    行数は mysql-prod インスタンスと同じです。

これで、永続ディスクのスナップショットを使用してデータベースのクローンを作成する方法は以上です。次は、エクスポートとインポートを使用してデータベースのクローンを作成する方法について説明します。この 2 つ目の方法のチュートリアルを最後まで進めるには、クローンを作成したディスクのマウントを解除する必要があります。

クローンを作成したディスクのマウントを解除する

ディスク スナップショットを使用して作成したクローン ディスクのマウントを解除するには、次の手順を行います。

  1. mysql-test インスタンスに接続された SSH セッションで、MySQL サービスを停止します。

    sudo service mysql stop
    
  2. クローン作成したデータディスクの MySQL データ ディレクトリへのマウントを解除します。

    sudo umount /var/lib/mysql
    
  3. MySQL サービスを再起動します。

    sudo service mysql start
    

エクスポートとインポートを使用したクローン作成

Compute Engine で動作する MySQL データベースのクローンを作成する 2 つ目の方法では、MySQL の組み込みのエクスポート(mysqldump を使用)とインポートを使用します。この方法では、Cloud Storage を使用してエクスポート ファイルを転送します。

このセクションでは、このチュートリアルの Compute Engine のディスク スナップショットを使用してデータベースのクローンを作成するセクションで作成したリソースを使用します。そのセクションの手順を完了していない場合は、続行する前に完了する必要があります。

このセクションでは、次の操作を行います。

  • Cloud Storage バケットを作成します。
  • 本番環境インスタンスのデータベースをエクスポートし、Cloud Storage に書き込みます。
  • エクスポート ファイルを Cloud Storage から読み込み、テスト インスタンスにインポートします。

次の図は、Cloud Storage を使用してエクスポートを転送してデータベースのクローンを作成する方法を示しています。

Cloud Storage を使用した MySQL データベースのクローン作成のセットアップを示す図。

Google Cloud 外のシステムにも Cloud Storage へのアクセス権を付与できるため、この方法で外部の MySQL インスタンスからデータベースのクローン作成が可能です。

Cloud Storage バケットを作成する

エクスポート ファイルを mysql-prod インスタンスから mysql-test インスタンスに転送する間、それを保存する Cloud Storage バケットを作成する必要があります。

  1. Cloud Shell を開きます。

    Cloud Shell を開く

  2. VM インスタンスと同じリージョンに Cloud Storage バケットを作成します。

    gcloud storage buckets create "gs://$(gcloud config get-value project)-bucket" --location="${REGION}"
    

データベースをエクスポートする

本番環境では、mysqldump エクスポート ファイルを使用してすでにバックアップが作成されている場合があります。このようなバックアップは、データベースのクローン作成のベースとして使用できます。

このチュートリアルでは、mysqldump を使用して新しいエクスポート ファイルを作成します。これは、既存の完全バックアップまたは増分バックアップのスケジュールには影響しません。

  • mysql-prod インスタンスに接続された SSH セッションで、Employees データベースをエクスポートし、前の手順で作成したバケットの Cloud Storage オブジェクトに流し込みます。

    mysqldump --user=root -p --default-character-set=utf8mb4 --add-drop-database --verbose  --hex_blob \
        --databases employees |\
         gcloud storage cp - "gs://$(gcloud config get-value project)-bucket/employees-dump.sql"
    

    入力を求めるメッセージが表示されたら、mysql-prod データベース サーバーの root パスワードを入力します。

    エクスポートの際、utf8mb4 の文字セットを使用すると、文字エンコードの問題を回避できます。

    --add-drop-database オプションを使用して、DROP DATABASE ステートメントと CREATE DATABASE ステートメントをエクスポートに含めます。

エクスポートしたファイルをインポートする

  1. mysql-test インスタンスに接続された SSH セッションで、エクスポートしたファイルを Cloud Storage バケットから mysql コマンドライン アプリケーションに流し込みます。

    gcloud storage cat "gs://$(gcloud config get-value project)-bucket/employees-dump.sql" |\
        mysql --user=root -p --default-character-set=utf8mb4
    

    入力を求めるメッセージが表示されたら、mysql-test データベース サーバーの root パスワードを入力します。

    インポートの際、utf8mb4 の文字セットを使用すると、文字エンコードの問題を回避できます。

  2. クローンを作成したデータベースが機能していることを確認するには、employees テーブルの行数をカウントするクエリを実行します。

    mysql -u root -p -e "select count(*) from employees.employees;"
    

    入力を求めるメッセージが表示されたら、mysql-test データベース サーバーの root パスワードを入力します。

    +----------+
    | count(*) |
    +----------+
    |   300024 |
    +----------+
    

    行数は mysql-prod インスタンスと同じです。

クローン作成先としての Cloud SQL の使用

クローン作成先のデータベースが Cloud SQL でホストされており、元のデータベースが Compute Engine にある場合、サポートされている唯一のクローンの作成方法は、データベースを Cloud Storage にエクスポートした後、Cloud SQL にインポートする方法です。

Cloud SQL のドキュメントで説明されているように、Cloud SQL では、トリガー、ストアド プロシージャ、ビュー、関数を含まない場合に限り、エクスポートされたファイルをインポートできます。

データベースがこれらの要素のいずれかを必要としている場合は、--skip-triggers--ignore-table [VIEW_NAME] のコマンドライン引数を使用してエクスポートから除外してインポートした後、除外した要素を手動で再作成します。

Cloud SQL for MySQL インスタンスを作成する

  1. Cloud Shell を開きます。

    Cloud Shell を開く

  2. mysql-prod インスタンスと同じデータベース バージョンを実行する Cloud SQL for MySQL インスタンスを作成します。

    gcloud sql instances create mysql-cloudsql \
        --tier=db-n1-standard-2 --region=${REGION} --database-version MYSQL_5_7
    

    Cloud SQL データベースが作成されるまで数分かかります。

  3. root ユーザー パスワードを既知の値にリセットします。

    gcloud sql users set-password root \
        --host=% --instance=mysql-cloudsql  --prompt-for-password
    

    root パスワードの入力を求められたら、パスワードを作成して入力します。パスワードはメモするか、安全な場所に一時的に保存します。

データベースをエクスポートする

Cloud SQL へのインポートに適した形式でデータベースをエクスポートするには、データベース内のすべてのビューを除外する必要があります。

  1. mysql-prod インスタンスに接続された SSH セッションで、mysqldump コマンドのコマンドライン引数を含む環境変数を、Employees データベース内のビューを無視するように設定します。

    DATABASE_NAME=employees
    IGNORE_TABLES_ARGS="`mysql -u root -p -s -s -e \"
        SELECT CONCAT('--ignore-table ${DATABASE_NAME}.',TABLE_NAME)
        FROM information_schema.TABLES
        WHERE TABLE_TYPE LIKE 'VIEW' AND TABLE_SCHEMA = '${DATABASE_NAME}';
        \"`"
    

    入力を求めるメッセージが表示されたら、mysql-prod データベース サーバーの root パスワードを入力します。

  2. 環境変数の内容を表示して、正しく設定されていることを確認します。

    echo "${IGNORE_TABLES_ARGS}"
    
    --ignore-table employees.current_dept_emp
    --ignore-table employees.dept_emp_latest_date
    
  3. Employees データベースをエクスポートします。データベースは、トリガーとビューが除かれ、前に作成したバケットの Cloud Storage オブジェクトに直接流し込まれます。

    mysqldump --user=root -p --default-character-set=utf8mb4 --add-drop-database --verbose \
        --hex-blob --skip-triggers --set-gtid-purged=OFF \
        $IGNORE_TABLES_ARGS \
        --databases employees |\
        gcloud storage cp - "gs://$(gcloud config get-value project)-bucket/employees-cloudsql-import.sql"
    

    入力を求めるメッセージが表示されたら、mysql-prod データベース サーバーの root パスワードを入力します。

オブジェクト権限を更新する

Cloud SQL サービス アカウントが Cloud Storage バケットとエクスポート オブジェクトを読み取れるようにするには、そのどちらにも適切な権限を設定する必要があります。この権限は、 Google Cloud コンソールを使用してオブジェクトをインポートするときに自動的に設定されるか、gcloud コマンドを使用して設定できます。

  1. Cloud Shell を開きます。

    Cloud Shell を開く

  2. Cloud SQL インスタンスのサービス アカウントのアドレスを格納する環境変数を設定します。

    CLOUDSQL_SA="$(gcloud sql instances describe mysql-cloudsql --format='get(serviceAccountEmailAddress)')"
    
  3. バケットの Identity and Access Management(IAM)ポリシーに、サービス アカウントをリーダーおよびライターとして追加します。

    gcloud storage buckets add-iam-policy-binding "gs://$(gcloud config get-value project)-bucket/" \
        --member=user:"${CLOUDSQL_SA}" --role=roles/storage.objectUser
    

エクスポートしたデータベースをインポートする

  1. Cloud Shell を開きます。

    Cloud Shell を開く

  2. エクスポートしたファイルを Cloud SQL インスタンスにインポートします。

    gcloud sql import sql mysql-cloudsql \
        "gs://$(gcloud config get-value project)-bucket/employees-cloudsql-import.sql"
    

    入力を求めるメッセージが表示されたら、「y」と入力します。

  3. クローンを作成したデータベースが機能していることを確認するには、employees テーブルの行数をカウントするクエリを実行します。

    echo "select count(*) from employees.employees;" |\
        gcloud sql connect mysql-cloudsql --user=root
    

    入力を求めるメッセージが表示されたら、mysql-cloudsql データベース サーバーの root パスワードを入力します。

    次のような出力が表示されます。

    Connecting to database with SQL user [root].Enter password:
    count(*)
    300024
    

    行数は mysql-prod インスタンスと同じです。

本番環境システムの追加情報

次のカテゴリでは、本番環境システムに関するその他のベスト プラクティスについて説明します。

ディスク スナップショットの使用

物理的なバックアップ(ディスク スナップショットなど)の場合、MySQL のドキュメントでは、データベースへの書き込みを一時停止した後、スナップショットを作成することを推奨しています。これを行うには、FLUSH TABLES WITH READ LOCK コマンドを使用します。スナップショットが完了すると、UNLOCK TABLES を使用して書き込みを再開できます。

InnoDB テーブルを使用するデータベースの場合は、最初に FLUSH TABLES WITH READ LOCK コマンドを実行せずに、直接スナップショットを取得することをおすすめします。こうすることにより、データベースは悪影響を受けることなく動作し続けますが、スナップショットは一貫性のない状態になる場合があります。ただし、一貫性が失われた場合でも、InnoDB エンジンはクローン起動時に一貫した状態にテーブルを再構築できます。

MyISAM テーブルを使用するデータベースの場合、FLUSH TABLES WITH READ LOCK コマンドを実行するとテーブルへの書き込みがすべてブロックされ、UNLOCK TABLES コマンドを実行するまでデータベースは読み取り専用になります。

最初にテーブルをフラッシュおよびロックせずにスナップショットを作成すると、新しくクローンを作成したデータベースに整合性のないデータが含まれるか、データベースが破損するリスクが生じます。

そのため、MyISAM テーブルを使用してデータベースの一貫したスナップショットを取得するには、プライマリ(マスター)データベースのパフォーマンスに影響が出ないように、リードレプリカで FLUSH TABLES WITH READ LOCK を実行してそのレプリカのスナップショットを作成することをおすすめします。

mysqldump コマンドの使用

ソース データベースと整合性のあるエクスポート ファイルを作成するために、mysqldump コマンドはエクスポート オペレーションの間、すべてのテーブルをロックします。つまり、データベースがエクスポートされている間、データベースへの書き込みはブロックされます。

そのため、プライマリ データベースのリードレプリカに対して mysqldump コマンドを実行し、プライマリ データベースがブロックされないようにすることをおすすめします。