ускорить Mysqldump

Thank you for reading this post, don't forget to subscribe!

Воз­мож­но, вы про­бо­ва­ли дам­пить более-менее боль­шую таб­ли­цу. Если да — вы зна­е­те, что это очень мед­лен­ный про­цесс. К тому же, это бло­ки­ру­ет таб­ли­цы, что вли­я­ет на рабо­та­ю­щие БД.

Если же дамп после это­го загру­жать в новую базу дан­ных, вый­дет еще медленнее.

Оптимизация настроек Mysqldump

По умол­ча­нию, Mysqldump будет исполь­зо­вать бло­ки­ров­ку таб­лиц во вре­мя сохра­не­ния дам­па. Поэто­му для сни­же­ния вли­я­ния на рабо­та­ю­щее при­ло­же­ние, сто­ит исполь­зо­вать такой ключ:

# Отклю­че­ние бло­ки­ров­ки таб­ли­цы будет рабо­тать толь­ко для InnoDB

Кро­ме это­го обя­за­тель­но про­верь­те настрой­ку innodb_flush_log_at_trx_commit. Она не повли­я­ет на ско­рость рабо­ты дам­па, зато повли­я­ет на загруз­ку дан­ных из дампа:

# Изме­не­ние этой настрой­ки может зна­чи­тель­но уско­рить загруз­ку дан­ных с дампа

Mysqlimport и "SELECT INTO OUTFILE"

В каче­стве аль­тер­на­тив­но­го реше­ния, мож­но исполь­зо­вать экс­порт дан­ных в файл:

# Выгру­жа­ем дан­ные в CSV файл из таб­лиц test

И сде­лать дамп толь­ко струк­ту­ры таблицы:

Теперь мож­но пере­не­сти эту таб­ли­цу на дру­гую БД. Сна­ча­ла созда­дим ее структуру:

Теперь загру­зим дан­ные из CSV фай­ла в эту таблицу:

# Загру­зит дан­ные в таб­ли­цу с назва­ни­ем users

Использование Xtrabackup

Xtrabackup сто­ит исполь­зо­вать для бека­пов рабо­та­ю­щих Mysql сер­ве­ров. Но этот инстру­мент так­же может при­го­дить­ся что­бы дви­гать (очень боль­шие) таб­ли­цы меж­ду сер­ве­ра­ми. Устрой­ство InnoDB поз­во­ля­ет пере­не­сти физи­че­ские фай­лы таб­лиц ibd (под­го­тов­лен­ные с помо­щью Xtrabackup) на дру­гой сер­вер и вклю­чить их пря­мо на рабо­та­ю­щем сервере.

Что нуж­но сделать:

1. Настроить сервер назначения

На сер­ве­ре, на кото­рый вы соби­ра­е­тесь пере­но­сить таб­ли­цу, необ­хо­ди­мо доба­вить такую настрой­ку в my.cnf:

2. Сделать бекап нужных таблиц

Xtrabackup поз­во­ля­ет пере­дать усло­вие — для каких имен­но таб­лиц нуж­но сде­лать бекап.

# Забе­ка­пит толь­ко таб­ли­цу users из БД database

При­ме­ним лог опе­ра­ций для фина­ли­зи­ро­ва­ния файлов:

3. Делаем дамп структуры таблицы

Нуж­но для того, что­бы создать пустую таб­ли­цу на новом сервере:

4. Создаем таблицу на новом сервере

Копи­ру­ем дамп струк­ту­ры на новый сер­вер и выпол­ня­ем там, что­бы создать пустую таблицу.

5. Копируем и заменяем файл данных таблицы

После того, как таб­ли­ца созда­на, необ­хо­ди­мо оста­но­вить рабо­ту движ­ка на новом сервере:

6. Заменяем файлы данных

Нуж­но ско­пи­ро­вать два фай­ла — users.ibd и users.exp из пап­ки с бека­пом в пап­ку дан­ных mysql:

# Не забы­ва­ем поме­нять пра­ва на файл

7. Запускаем движок

Оста­лось запу­стить дви­жок с новы­ми фай­ла­ми данных.

После это­го таб­ли­ца с дан­ны­ми будет доступ­на на новом сервере:

Возможные проблемы

Про­бле­ма воз­ник­нет если вы исполь­зу­е­те репли­ка­цию на сер­ве­ре, на кото­рый пере­но­сит­ся таб­ли­ца. Слейв поло­ма­ет­ся и его при­дет­ся вос­ста­но­вить зано­во с мастера.