Усі дані є 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
Оскільки у вас є <50MB загальних даних, у мене є ще один варіант. Замість того, щоб запускати команду 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
Це більш чистий і простий підхід для дуже малих баз даних.