Tüm Veriler InnoDB
Bu size verinin tam olarak anlık bir görüntüsünü verecektir:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
Gelen değişiklikleri alırken dökümün kontrol noktasından önce tüm verileri yakalamasını sağlayan bir kontrol noktası üretir. Gelen değişiklikler, çöplüğün bir parçası değil. Bu, tüm tablolar için aynı zaman noktasını garanti eder.
--routines
Tüm saklı yordamları ve saklanmış işlevleri döküyor
--triggers
Onlara sahip olan her tablo için tüm tetikleyicileri atar
Tüm Veriler MyISAM veya InnoDB / MyISAM karışımıdır.
Genel bir okuma kilidi uygulamak, mysqldump gerçekleştirmek ve genel kilidi açmak zorunda kalacaksınız
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
Bir şans ver !!!
GÜNCELLEME 2012-06-22 08:12 EDT
Toplam <50 MB veri bulunduğundan, başka bir seçeneğim var. Sadece işlem kimliğini almak ve dışarıda öldürmek için 86400 sn (bu 24 saat) genel okuma kilidini tutmak için arka plana bir SLEEP komutu başlatmak yerine, işletim sistemi yerine mysql'de 5 saniye zaman aşımı ayarlamayı deneyelim:
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
Bu, çok küçük veritabanları için daha temiz ve daha basit bir yaklaşımdır.