ここで私はそれをしました。 FLUSH TABLES WITH READ LOCK
を使用しているため、すべての場合に有効です。
#!/bin/bash
DB=example
DUMP_FILE=export.sql
# Lock the database and sleep in background task
mysql -uroot -proot $DB -e "FLUSH TABLES WITH READ LOCK; DO SLEEP(3600);" &
sleep 3
# Export the database while it is locked
mysqldump -uroot -proot --opt $DB > $DUMP_FILE
# When finished, kill the previous background task to unlock
kill $! 2>/dev/null
wait $! 2>/dev/null
echo "Finished export, and unlocked !"
シェルsleep
コマンドだけのmysqldumpが始まる前に、MySQLのロックコマンドを実行しているバックグラウンドタスクが実行されていることを確認することです。あなたは1秒にそれを減らすことができ、それはまだうまくいくはずです。それを30秒間に増やし、30秒間別のクライアントからのテーブルに値を挿入しようとすると、ロックされていることがわかります。
2つの利点は、代わりにmysqldump
オプション--single-transaction
と--lock-tables
を使用するのでは、このマニュアル背景のロックを使用してあります。
- あなたはMyISAMテーブル/ InnoDBテーブルを混在している場合、これは、すべてをロックします。
- 同じロック期間中に
mysqldump
に加えて他のコマンドを実行することができます。たとえば、マスターノードでレプリケーションを設定する場合には、SHOW MASTER STATUS;
で作成したダンプの正確な状態(データベースのロックを解除する前)でバイナリログの位置を取得する必要があるため、レプリケーションスレーブを作成できるので便利です。
'--lock-tables'は、ダンプする前にすべてのテーブルをダンプする必要があります。あなたはそれがそうではないと思いますか? – cdhowie
私はmysqldumpで--lock-tablesを使うとmysql 5.1でテストをしましたが、$ DB_NAMEデータベースのテーブルにデータを挿入することはできます。 – KeepZero