2011-02-04 2 views
5

У меня есть приложение Java, которое использует mysql в качестве конца, каждую ночь мы берем резервную копию mysql, используя mysqldump, и приложение перестает работать на этот период времени (приложение 20 минут).mysql - как работает mysqldump?

Команда, используемая для резервного копирования.

$MYSQLDUMP -h $HOST --user=$USER --password=$PASS $database > \ 
$BACKDIR/$SERVER-mysqlbackup-$database-$DATE.sql 
gzip -f -9 $BACKDIR/$SERVER-mysqlbackup-$database-$DATE.sql 

Это нормально или я делаю что-то не так, что заставляет БД останавливаться в течение этого времени?

Спасибо, K

ответ

1

mysqldump должен получить блокировку чтения таблиц и удерживать его на время резервного копирования в целях обеспечения последовательного резервного копирования. Однако блокировка чтения может останавливать последующие чтения, если между ними происходит запись (то есть read -> write -> read): первая блокировка чтения блокирует блокировку записи, которая блокирует вторую блокировку чтения.

Это частично зависит от типа вашей таблицы. Если вы используете MyISAM, блокировки применяются ко всей таблице, и поэтому вся таблица будет заблокирована. Я считаю, что блокировки в InnoDB работают по-разному и что это не заблокирует всю таблицу.

0

Вы можете указать --skip-lock-tables, но это может привести к изменению данных при резервном копировании. Это может означать, что ваши данные несовместимы и вызывают всевозможные ошибки. Лучше всего сделать свою резервную копию в то время, когда наименее люди будут ее использовать.

1
If tables are stored in the InnoDB storage engine, mysqldump provides a 
    way of making an online backup of these (see command below). 

    shell> mysqldump --all-databases --single-transaction > all_databases.sql 

Это может помочь ... в частности возможность --single-транзакции, а не --all-базы данных один ... (из туздЫшпр страницы руководства)

2

См https://serverfault.com/questions/224711/backing-up-a-mysql-database-while-it-is-still-in-use/224716#224716

Я подозреваю, что вы используете MyISAM, и таблица блокируется. Я предлагаю вам перейти на InnoDB и использовать флаг одной транзакции. Это позволит продолжить обновление, а также сохранить согласованное состояние.