Самый безопасный способ выполнения mysqldump в живой системе с активными чтениями и записью?

Я не уверен, что это правда, но я помню, что прочитал, если вы запустили следующую команду в linux

mysqldump -u username -p database_name > backup_db.sql

при чтении и записи в базу данных, тогда дамп может содержать ошибки.

Существуют ли в команде mysqldump конкретные параметры, чтобы убедиться, что это безопасно выполняется в живой системе? Я уверен, что чтение /запись отключается для наших пользователей в течение нескольких секунд (база данных <50MB)

62 голоса | спросил user784637 20 J0000006Europe/Moscow 2012, 04:50:25

5 ответов


65

Все данные - InnoDB

Это то, что даст вам точный моментальный снимок момента времени:

mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql

--single-transaction создает контрольную точку, которая позволяет дампу захватывать все данные до контрольной точки при получении входящих изменений. Эти входящие изменения не становятся частью дампа. Это обеспечивает то же самое время для всех таблиц.

--routines сбрасывают все хранимые процедуры и сохраненные функции

--triggers сбрасывает все триггеры для каждой таблицы, в которой есть

Все данные - MyISAM или Mix of 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

Поскольку у вас есть <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

Это более чистый и простой подход для очень маленьких баз данных.

ответил RolandoMySQLDBA 20 J0000006Europe/Moscow 2012, 06:02:49
1

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

ответил Talik Eichinger 1 AMpWed, 01 Apr 2015 06:34:42 +030034Wednesday 2015, 06:34:42
1
  • Для таблиц InnoDB вы должны использовать опцию --single-transaction, как указано в другом ответе.
  • Для MyISAM существует --lock-tables.

См. официальную документацию

ответил pesco 20 ThuEurope/Moscow2012-12-20T19:19:18+04:00Europe/Moscow12bEurope/MoscowThu, 20 Dec 2012 19:19:18 +0400 2012, 19:19:18
1

Вот как я это сделал. Он должен работать во всех случаях, поскольку он использует FLUSH TABLES WITH READ LOCK.

#!/bin/bash

DB=example
DUMP_FILE=export.sql

# Lock the database and sleep in background task
mysql -uroot -proot $DB -e "FLUSH TABLES WITH READ LOCK; DO SLEEP(3600);" &
sleep 3

# Export the database while it is locked
mysqldump -uroot -proot --opt $DB > $DUMP_FILE

# When finished, kill the previous background task to unlock
kill $! 2>/dev/null
wait $! 2>/dev/null

echo "Finished export, and unlocked !"

Командная оболочка sleep предназначена только для того, чтобы перед запуском mysqldump выполнялась фоновая задача, выполняющая команду блокировки mysql. Вы можете уменьшить его до 1 секунды, и все равно все должно быть хорошо. Увеличьте его до 30 секунд и попробуйте вставить значения в любую таблицу из другого клиента за эти 30 секунд, вы увидите, что он заблокирован.

Есть два преимущества в использовании этой блокировки фона вручную, вместо использования mysqldump options --single-transaction и --lock-tables код>:

  1. Это блокирует все, если у вас смешанные таблицы MyISAM /InnoDB.
  2. Вы можете выполнять другие команды в дополнение к mysqldump в течение того же периода блокировки. Это полезно, например, при настройке репликации на главном узле, потому что вам нужно получить позицию двоичного журнала с помощью SHOW MASTER STATUS; в точном состоянии созданного дампа (перед разблокировкой базы данных ), чтобы иметь возможность создавать ведомое устройство репликации.
ответил Nicomak 4 MarpmFri, 04 Mar 2016 18:14:56 +03002016-03-04T18:14:56+03:0006 2016, 18:14:56
1

Предложение официальной документации mysql состоит в том, что у вас должна быть база данных Master «M1» и подчиненная база данных «S1», которая описана в «Сценарий 2: Резервное копирование с ведомым только для чтения», Резервное копирование мастера или подчиненного путем создания Только для чтения

Вы должны установить только рабочую базу данных и выполнить th

ответил Victor Hugo Arango A. 15 ThuEurope/Moscow2016-12-15T16:37:11+03:00Europe/Moscow12bEurope/MoscowThu, 15 Dec 2016 16:37:11 +0300 2016, 16:37:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132