Все данные 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
Это более чистый и простой подход для очень маленьких баз данных.
ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
это ожидаемое сообщение об ошибке?--single-transaction
опцию, как указано в другом ответе.--lock-tables
.Смотрите официальную документацию здесь
источник
Если вы хотите сделать это для MyISAM или смешанных таблиц без каких-либо простоев при блокировке таблиц, вы можете настроить подчиненную базу данных и сделать оттуда снимки. К сожалению, настройка ведомой базы данных приводит к некоторым простоям при экспорте действующей базы данных, но после ее запуска вы сможете заблокировать ее таблицы и выполнить экспорт, используя методы, описанные другими. Когда это происходит, он будет отставать от мастера, но не будет останавливать мастер от обновления своих таблиц, и будет нагонять, как только резервное копирование будет завершено.
источник
Вот как я это сделал. Он должен работать во всех случаях, поскольку он использует
FLUSH TABLES WITH READ LOCK
.Команда shell
sleep
предназначена только для того, чтобы убедиться, что фоновая задача, выполняющая команду блокировки mysql, выполняется до запуска mysqldump. Вы можете уменьшить его до 1 секунды, и все равно должно быть в порядке. Увеличьте его до 30 секунд и попробуйте вставить значения в любую таблицу из другого клиента в течение этих 30 секунд, которые вы увидите, что он заблокирован.Есть 2 преимущества в использовании этой ручной блокировки фона вместо использования
mysqldump
опций--single-transaction
и--lock-tables
:mysqldump
тому же периоду блокировки. Это полезно, например, при настройке репликации на главном узле, потому что вам нужно получить позицию двоичного журнала сSHOW MASTER STATUS;
точным состоянием созданного вами дампа (до разблокировки базы данных), чтобы иметь возможность создать ведомое устройство репликации.источник
Предложение официальной документации тузд является то , что вы должны иметь мастер базы данных «M1» и ведомого «S1» базы данных , которая описана в разделе «Сценарий 2: Резервное копирование с только для чтения Раба» Резервное копирование ведущего или ведомого устройства, делая его Только чтение
Вы должны установить подчиненную базу данных только для чтения и выполнить
источник
Если у вас очень большая таблица MYISAM, и вам нужно вывести таблицу без блокировки и избежать высокой нагрузки на сервер, вы можете использовать следующий скрипт.
источник