すべてのデータは InnoDB です
これにより、データの正確なポイント イン タイム スナップショットが得られます:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
着信変更を受け取りながら、ダンプがチェックポイントより前のすべてのデータをキャプチャできるようにするチェックポイントを生成します。これらの着信変更はダンプの一部になりません。これにより、すべてのテーブルで同じ時点が保証されます。
--routines
すべてのストアド プロシージャとストアド関数をダンプします
--triggers
それらを持つ各テーブルのすべてのトリガーをダンプします
すべてのデータは MyISAM または InnoDB/MyISAM の混合
グローバル読み取りロックを課し、mysqldump を実行し、グローバル ロックを解放する必要があります
mysql -uuser -ppass -Ae"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" &
sleep 5
mysql -uuser -ppass -ANe"SHOW PROCESSLIST" | grep "SELECT SLEEP(86400)" > /tmp/proclist.txt
SLEEP_ID=`cat /tmp/proclist.txt | awk '{print $1}'`
echo "KILL ${SLEEP_ID};" > /tmp/kill_sleep.sql
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
mysql -uuser -ppass -A < /tmp/kill_sleep.sql
試してみてください!!!
更新 2012-06-22 08:12 EDT
合計データが 50MB 未満であるため、別のオプションがあります。バックグラウンドで SLEEP コマンドを起動してグローバル読み取りロックを 86400 秒 (その 24 時間) 保持し、プロセス ID を取得して外部で強制終了する代わりに、OS ではなく mysql で 5 秒のタイムアウトを設定してみましょう:
SLEEP_TIMEOUT=5
SQLSTMT="FLUSH TABLES WITH READ LOCK; SELECT SLEEP(${SLEEP_TIMEOUT})"
mysql -uuser -ppass -Ae"${SQLSTMT}" &
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
これは、非常に小規模なデータベースに対するよりクリーンでシンプルなアプローチです。
- InnoDB テーブルの場合、
--single-transaction
を使用する必要があります 別の回答で述べたように、オプション。 - MyISAM には
--lock-tables
があります .
公式ドキュメントはこちら
これが私がやった方法です。 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
コマンドは、mysqllock コマンドを実行するバックグラウンド タスクが mysqldump の開始前に実行されるようにするためのものです。 1 秒に短縮できますが、それでも問題ないはずです。 30 秒に増やして、その 30 秒間に別のクライアントから任意のテーブルに値を挿入してみてください。
mysqldump
を使用する代わりに、この手動のバックグラウンド ロックを使用すると、2 つの利点があります。 オプション --single-transaction
と --lock-tables
:
mysqldump
以外のコマンドを実行することもできます 同じロック期間中。 SHOW MASTER STATUS;
でバイナリ ログの位置を取得する必要があるため、マスター ノードでレプリケーションをセットアップする場合などに便利です。 (データベースのロックを解除する前に) 作成したダンプの正確な状態で、レプリケーション スレーブを作成できるようにします。