Mysqldumpを使用してサーバーで毎晩バックアップを実行しています。残念ながら、バックアップ中にテーブルがロックされているため、毎晩30分ほどサイトが停止します。
プロセスリストによると、無関係なテーブルへのクエリがブロックされることがあるようです。 「INSERTINTOA」は数分間ロックされた状態ですが、実行中のクエリはテーブルBにのみアクセスします。
このようなバックアップを行うためのより良い方法はありますか?
2つのオプションがあります。
A. --skip-lock-tables
mysqldumpオプションを使用します。テーブルはロックされませんが、バックアップに一貫性がない可能性があります(スキーマによって異なります。データベーストランザクションが一度に複数のテーブルにアクセスし、1つのテーブルがすでにバックアップされており、他のテーブルがバックアップされていない場合。例:2つのテーブル:顧客顧客が最初にバックアップされ、次に新しい顧客/注文ペアが挿入された場合、バックアップに顧客が含まれていない注文になる可能性があります)。
この問題は、mysqldumpがデフォルトですべてのテーブルをロックする主な理由です。この問題が当てはまらない場合は、mysqlでテーブルロックをスキップするのが最も簡単な解決策です。
B.他のバックアップ方法を使用します。例:読み取りロックでテーブルをフラッシュし、LVMスナップショットを作成し、テーブルのロックを解除し、LVMスナップショットをマウントしてデータをバックアップします。これは、単純なmysqldumpよりもはるかに複雑になります。 Googleの「LVMスナップショットを使用したmysqlバックアップ」では、多くのスクリプトとチュートリアルを利用できます。
MySQLデータがLVMボリューム上にない場合は、マスターに触れることなくスレーブMySQLサーバーを作成してバックアップできるため、スレーブでロックが発生し、マスターは常に解放されます。