Wszystkie dane to InnoDB
Oto, co da ci dokładną migawkę danych w czasie:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
tworzy punkt kontrolny, który pozwala zrzutowi przechwycić wszystkie dane przed punktem kontrolnym podczas odbierania nadchodzących zmian. Te nadchodzące zmiany nie stają się częścią zrzutu. Zapewnia to taki sam moment dla wszystkich tabel.
--routines
zrzuca wszystkie procedury przechowywane i funkcje przechowywane
--triggers
zrzuca wszystkie wyzwalacze dla każdej tabeli, która je ma
Wszystkie dane to MyISAM lub Mix InnoDB / MyISAM
Będziesz musiał nałożyć globalną blokadę odczytu, wykonać mysqldump i zwolnić globalną blokadę
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
Spróbuj !!!
AKTUALIZACJA 22.06.2012 08:12 EDT
Ponieważ masz mniej niż 50 MB danych, mam inną opcję. Zamiast uruchamiać komendę SLEEP w tle, aby zablokować globalną blokadę odczytu przez 86400 sekund (24 godziny) tylko po to, aby uzyskać identyfikator procesu i zabić na zewnątrz, spróbujmy ustawić 5-sekundowy limit czasu w mysql zamiast w systemie operacyjnym:
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
Jest to czystsze i prostsze podejście do bardzo małych baz danych.