MySQL - バックアップ中にテーブルロックを回避する

MySQL - バックアップ中にテーブルロックを回避する

私は、mysqldump を使用して、サーバー上で夜間バックアップを実行しています。残念ながら、バックアップ中にテーブルがロックされるため、毎晩 30 分ほどサイトが停止してしまいます。

プロセスリストによると、関連のないテーブルに対するクエリがブロックされることもあるようです。たとえば、「INSERT INTO A」は、実行中のクエリがテーブル B のみに関係している間、数分間ロックされた状態になります。

このようなバックアップを行うより良い方法はありますか?

答え1

次の 2 つのオプションがあります。

A. --skip-lock-tablesmysqldump オプションを使用します。テーブルはロックされませんが、バックアップの一貫性がなくなる可能性があります (スキーマによって異なります。データベース トランザクションが一度に複数のテーブルにアクセスし、1 つのテーブルがすでにバックアップされていて、他のテーブルがバックアップされていない場合。たとえば、2 つのテーブル (顧客と注文) があるとします。最初に顧客がバックアップされ、次に新しい顧客/注文のペアが挿入されると、バックアップに顧客のない注文が残る可能性があります)。

この問題は、mysqldump がデフォルトですべてのテーブルをロックする主な理由です。この問題が当てはまらない場合は、mysql でテーブル ロックをスキップするのが最も簡単な解決策です。

B. 他のバックアップ方法を使用します。たとえば、読み取りロックを使用してテーブルをフラッシュし、LVM スナップショットを作成し、テーブルのロックを解除し、LVM スナップショットをマウントして、データをバックアップします。これはすぐに、単純な mysqldump よりもはるかに複雑になります。Google で「LVM スナップショットを使用した mysql バックアップ」を検索すると、多くのスクリプトとチュートリアルが見つかります。

MySQL データが LVM ボリューム上にない場合は、スレーブ MySQL サーバーを作成して、マスターに触れることなくバックアップすることができます。これにより、スレーブでロックが発生し、マスターは常にフリーになります。

関連情報