mysqldump без прерывания живого производства INSERT - PullRequest
10 голосов
/ 28 марта 2012

Я собираюсь перенести нашу производственную базу данных на другой сервер.Он имеет размер около 38 ГБ и использует таблицы MYISAM.Поскольку у меня нет физического доступа к новой файловой системе сервера, мы можем использовать только mysqldump.

Я просмотрел этот сайт и выяснил, не приведет ли онлайн-резервное копирование mysqldump к нашему производственному веб-сайту.Из этого поста: Запуск MySQLDump без таблиц блокировок , он говорит, что mysqldump, очевидно, заблокирует БД и предотвратит вставку.Но после нескольких испытаний мне любопытно узнать, что это показывает иначе.

Если я использую

mysqldump -u root -ppassword --flush-logs testDB > /tmp/backup.sql

mysqldump в конечном итоге по умолчанию выполнит ' - таблицы блокировки ', и это будет READ LOCAL блокировки ( см. документ MySQL 5.1) , где одновременная вставка все еще доступна.Я сделал цикл for для вставки в одну из таблиц каждую секунду, в то время как mysqldump занимает одну минуту для завершения.Каждую секунду в этот период будет вставляться запись.Это означает, что mysqldump не будет прерывать производственный сервер, и INSERT все еще может продолжаться .

Есть ли у кого-то другой опыт?Я хочу убедиться в этом перед тем, как перейти на свой рабочий сервер, поэтому буду рад узнать, сделал ли я что-то неправильно, что сделало мой тест некорректным.

[Моя версия mysql-server - 5.1.52,и mysqldump 10.13]

Ответы [ 4 ]

2 голосов
/ 11 июня 2012

Теперь у вас может быть база данных с несвязанными таблицами или хранилище данных - где все не нормализовано (вообще) и где нет никаких связей между таблицами. В этом случае любой дамп будет работать.

Я предполагаю, что производственная база данных, содержащая данные 38G, содержит графику в некоторой форме (BLOB), а затем - повсеместно - у вас есть ссылки из других таблиц. Правильно?

Таким образом, вы, насколько я понимаю, рискуете потерять серьезные связи между таблицами (обычно парами первичных / внешних ключей), таким образом, вы можете захватить одну таблицу в момент обновления / вставки в нее, в то время как его зависимая (которая использует эту таблицу в качестве основного источника) еще не была обновлена. Таким образом, вы потеряете так называемую целостность вашей базы данных.

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

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

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

Если, однако, база данных содержит фотографии с Facebook или аналогичного сайта = вы можете быть в состоянии пережить последствия от 0 до 129 388 потерянных ссылок: -).

Теперь - так много для анализа. Решение:

ВЫ БЫЛИ ИМЕТЬ создание программного обеспечения, которое будет делать дамп для вас с полной целостностью, набор таблиц за набором таблиц, кортеж за кортежем. Вам необходимо идентифицировать этот кластер данных, который можно скопировать с текущей онлайн-базы 24/7/365 на новую базу, затем сделать это, а затем отметить, что она была скопирована.

IFFF теперь вносит изменения в записи, которые вы уже скопировали, вам нужно будет сделать их последующую копию. Это может быть сложным делом.

IFFF, вы используете более продвинутую версию MYSQL - вы можете фактически создать другой сайт и / или реплику, или распределенную базу данных - и затем сойти с рук таким образом.

Если у вас есть окно, скажем, 10 минут, которое вы можете создать, если вам это нужно, вы также можете просто скопировать физические файлы, расположенные на диске. Я говорю о файлах .stm .std и т. Д., Затем вы можете закрыть сервер на несколько минут, а затем скопировать.

Теперь к кардинальному вопросу:

Вам необходимо время от времени проводить техническое обслуживание ваших машин. Разве у вашей системы нет места для таких операций? Если нет - то что вы будете делать, когда сломается жесткий диск. Обратите внимание на «когда», а не «если».

2 голосов
/ 01 мая 2012

1) Использование --opt аналогично указанию --add-drop-table, --add-locks, --create-options, --disable-keys, --extended-insert, --lock-tables, --quick и--set-charset.Все опции, которые обозначает --opt, также включены по умолчанию, потому что --opt включен по умолчанию.

2) mysqldump может извлекать и выгружать содержимое таблицы построчно или извлекать весь контент из таблицы и буферизовать его в памяти перед тем, как выгрузить его.Буферизация в памяти может быть проблемой, если вы создаете дамп больших таблиц.Чтобы выводить таблицы построчно, используйте параметр --quick (или --opt, который включает --quick).Опция --opt (и, следовательно, --quick) включена по умолчанию, поэтому для включения буферизации памяти используйте --skip-quick.

3) --single-transaction Этот параметр выдает оператор BEGIN SQL перед выгрузкой данных с сервера (таблицы транзакций InnoDB).

Если ваша схема являетсякомбинация InnoDB и MyISAM, вам поможет следующий пример:

    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=512M db > db.sql
1 голос
/ 30 марта 2012

Я никогда не делал этого раньше, но вы можете попробовать --skip-add-locks при сбросе.

Хотя это может занять больше времени, вы можете добавить несколько патчей, каждое из которых займет совсем немного времени. Добавление --skip--add-drop-table позволит вам загрузить эти несколько меньших дампов в одну таблицу, не создавая ее заново. Использование --extended-insert уменьшит размер файла sql для загрузки.

Возможно, попробуйте что-то вроде mysqldump -u -p${password} --skip-add-drop-table --extended-insert --where='id between 0 and 20000' test_db test_table > test.sql. Чтобы сделать это таким образом, вам нужно выгрузить структуры таблиц и загрузить их в первую очередь или удалить таблицу --skip-add-drop-table для первого дампа

0 голосов
/ 29 марта 2012

mysqldump не добавляет --lock-таблицы по умолчанию. Попробуйте использовать --lock-таблицы Дайте мне знать, если это помогло

Кстати - вы также должны использовать надстройки, которые сделают ваш импорт быстрее!

...