Все данные 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 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Поскольку у вас есть <50 МБ общих данных, у меня есть еще один вариант. Вместо того, чтобы запускать команду SLEEP в фоновом режиме, чтобы удерживать глобальную блокировку чтения в течение 86400 секунд (то есть 24 часа) только для того, чтобы получить идентификатор процесса и уничтожить его снаружи, давайте попробуем установить 5-секундный тайм-аут в mysql, а не в ОС:
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
Это более чистый и простой подход для очень маленьких баз данных.