LVM / ZFSスナップショットを撮る前にMySQLを一時停止する方法は?

LVM / ZFSスナップショットを撮る前にMySQLを一時停止する方法は?

MySQLにすべての「進行中の」トランザクションを完了するように指示しますが、ZFSまたはLVMスナップショットを撮るまで(1秒未満)、新しいトランザクションの開始を遅らせる(クライアントのシャットダウンなし)ようにするにはどうすればよいですか?

例えば

  1. MySQLを一時停止し、「進行中」のトランザクションが完了するのを待ちます。
  2. ディスクに同期
  3. ZFS/LVM スナップショットの作成
  4. MySQLの復元このタスクの目的は、バックアップ用に一貫したスナップショットを取得することです。ステップ2は1秒もかかりません。

手順1でクライアントエラーが発生してはいけません。手順4に達するまでしばらく一時停止してください。

1と4を実行できるMySQLコマンドはありますか?これらは何ですか?

答え1

賢明なアプローチは、トランザクションが完了するのを待つことです。

mysql> FLUSH LOCAL TABLES; Query OK, 0 rows affected (11.31 sec)

その後、読み取りロックを取得します。

mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (22.55 sec)

これで、セッションが終了するまですべてのクエリがブロックされます(つまり、ロックが解除されるのを待ちます)。参考にしてください。すべての取引が完了するまで待つ必要があります。ワークロードによっては時間がかかる場合があります(数百万行の更新...)。

必要なスクリプト言語でコーディングできます。

しかし、真剣に - なぜ使用しないのですか?スーパーバックアップ?これはmysqlの一貫したスナップショットを処理し、それをファイルシステムにダンプしてzfs / lvmスナップショットを作成できます。

答え2

以下は、グローバルロックを維持しながらZFSスナップショットを作成してMyISAMおよびInnoDBデータファイルの一貫性を維持する方法のソリューションです。

mysql << EOF
    FLUSH TABLES WITH READ LOCK;
    system zfs snapshot data/db@snapname
    UNLOCK TABLES;
EOF

関連情報