Какой самый быстрый способ выгрузить и загрузить базу данных MySQL InnoDB, используя mysqldump? - PullRequest
13 голосов
/ 25 сентября 2008

Я хотел бы создать копию базы данных с примерно 40 таблицами InnoDB и примерно 1,5 ГБ данных с помощью mysqldump и MySQL 5.1.

Каковы наилучшие параметры (например, --single-транзакция), которые приведут к самой быстрой передаче и загрузке данных?

Кроме того, при загрузке данных во вторую БД быстрее:

1) перенаправить результаты непосредственно на второй экземпляр сервера MySQL и использовать параметр --compress

или

2) загрузить его из текстового файла (то есть: mysql

Ответы [ 5 ]

21 голосов
/ 08 декабря 2010

БЫСТРЫЙ дамп базы данных в режиме ожидания:

Использование опции "-T" с mysqldump приводит к большому количеству файлов .sql и .txt в указанном каталоге. Это на ~ 50% быстрее при выгрузке больших таблиц, чем в один файл .sql с операторами INSERT (занимает на 1/3 меньше времени настенных часов).

Кроме того, существует огромное преимущество при восстановлении, если вы можете загружать несколько таблиц параллельно и насыщать несколько ядер. На 8-ядерном корпусе это может быть как 8-кратная разница во времени настенных часов для восстановления дампа, в дополнение к улучшениям эффективности, обеспечиваемым "-T". Поскольку "-T" заставляет каждую таблицу храниться в отдельном файле, их параллельная загрузка проще, чем разделение массивного файла .sql.

Если довести приведенные выше стратегии до логического предела, можно создать скрипт для широкого параллельного выгрузки базы данных. Что ж, это именно то, чем являются инструменты Maakit mk-parallel-dump (см. http://www.maatkit.org/doc/mk-parallel-dump.html) и mk-parallel-restore; Perl-скрипты, которые выполняют несколько вызовов базовой программы mysqldump. Однако, когда я попытался использовать их, У меня были проблемы с выполнением восстановления без ошибок дубликатов ключей, которые не возникали с ванильными дампами, поэтому имейте в виду, что ваш пробег может отличаться.

Сброс данных из базы данных LIVE (без прерывания обслуживания):

Параметр --single -action очень полезен для создания дампа действующей базы данных без необходимости его остановки или создания дампа подчиненной базы данных без необходимости прекращения работы ведомой.

К сожалению, -T несовместим с --single -action, поэтому вы получаете только один.

Обычно получение дампа происходит гораздо быстрее, чем его восстановление. Еще есть место для инструмента, который берет входящий монолитный файл дампа и разбивает его на несколько частей для параллельной загрузки. Насколько мне известно, такого инструмента еще не существует.


Передача дампа по сети обычно является выигрышем

Чтобы прослушать входящий дамп на одном хосте, выполните:

nc -l 7878 > mysql-dump.sql

Затем на вашем хосте БД запустите

mysqldump $OPTS | nc myhost.mydomain.com 7878

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

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


Наконец, я хочу прояснить один момент общей путаницы.

Несмотря на то, как часто вы видите эти флаги в примерах и руководствах mysqldump, они излишни, потому что они включены по умолчанию:

  • --opt
  • --add-drop-table
  • --add-locks
  • --create-options
  • --disable-keys
  • --extended-insert
  • --lock-tables
  • --quick
  • --set-charset.

С http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html:

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

Из этих поведений "--quick" является одним из наиболее важных (пропускает кэширование всего набора результатов в mysqld перед передачей первой строки), и может быть с "mysql" (который НЕ включает --quick on по умолчанию) значительно ускорить запросы, которые возвращают большой набор результатов (например, вывод всех строк большой таблицы).

7 голосов
/ 25 сентября 2008

Передайте его напрямую другому экземпляру, чтобы избежать перегрузки диска. Не беспокойтесь о --compress, если вы не работаете в медленной сети, так как в быстрой локальной сети или в петле нагрузка на сеть не имеет значения.

2 голосов
/ 25 сентября 2008

Я думаю, что это будет намного быстрее и сэкономит ваше дисковое пространство, если вы попытаетесь репликация базы данных вместо использования mysqldump. лично я использую sqlyog enterprise для моей действительно тяжелой работы, но есть также ряд других инструментов , которые могут предоставлять те же услуги. если, конечно, вы не хотели бы использовать только mysqldump.

1 голос
/ 09 января 2010

Для innodb, --order-by-primary --extended-insert обычно является лучшей комбинацией. Если у вас после каждого последнего бита производительности и целевого блока есть много ядер ЦП, вы можете разделить полученный дамп-файл и выполнить параллельные вставки во многих потоках, вплоть до innodb_thread_concurrency / 2.

Кроме того, настройте innodb_buffer_pool_size для цели до максимального значения, которое вы можете себе позволить, и увеличьте innodb_log_file_size до 128 или 256 МБ (осторожно, вам нужно удалить старые файлы журналов перед перезапуском демона mysql, иначе он не перезапустится)

0 голосов
/ 09 января 2010

Используйте инструмент mk -rallel-dump из Maatkit.

По крайней мере, это будет быстрее. Я бы больше доверял mysqldump.

Как часто ты это делаешь? Это действительно проблема производительности приложения? Возможно, вам следует разработать такой способ, при котором не требуется выводить данные целиком (репликация?)

С другой стороны, 1.5G - это небольшая база данных, так что, вероятно, это не будет большой проблемой.

...