すべてのデータは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
合計データが50 MB未満であるため、別のオプションがあります。バックグラウンドで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
これは、非常に小規模なデータベース向けの、よりクリーンでシンプルなアプローチです。