MySQLにすべての「進行中の」トランザクションを完了するように指示しますが、ZFSまたはLVMスナップショットを撮るまで(1秒未満)、新しいトランザクションの開始を遅らせる(クライアントのシャットダウンなし)ようにするにはどうすればよいですか?
例えば
- MySQLを一時停止し、「進行中」のトランザクションが完了するのを待ちます。
- ディスクに同期
- ZFS/LVM スナップショットの作成
- 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