Semua Data adalah InnoDB
Inilah yang akan memberi Anda snapshot point-in-time data yang tepat:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
menghasilkan pos pemeriksaan yang memungkinkan dump untuk menangkap semua data sebelum pos pemeriksaan saat menerima perubahan yang masuk. Perubahan yang masuk itu tidak menjadi bagian dari dump. Itu memastikan point-in-time yang sama untuk semua tabel.
--routines
membuang semua prosedur tersimpan dan fungsi tersimpan
--triggers
dump semua pemicu untuk setiap tabel yang memilikinya
Semua Data adalah MyISAM atau Campuran InnoDB / MyISAM
Anda harus memaksakan kunci baca global, melakukan mysqldump, dan melepaskan kunci global
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
Cobalah !!!
UPDATE 2012-06-22 08:12 EDT
Karena Anda memiliki <50MB total data, saya memiliki opsi lain. Alih-alih meluncurkan perintah SLEEP ke latar belakang untuk menahan kunci baca global selama 86400 detik (24 jam) hanya untuk mendapatkan ID proses dan membunuh di luar, mari kita coba menetapkan batas waktu 5 detik di mysql daripada di OS:
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
Ini adalah pendekatan yang lebih bersih dan sederhana untuk database yang sangat kecil.