Рейтинг:0

Восстановление базы данных MySQL происходит очень медленно

флаг ar

Я только что купил новый домашний рабочий стол. У меня есть три базы данных MySQL, которые я хочу переместить. Я сбросил их все с помощью mysqldump, прежде чем снимать диск со старой машины.

Восстановление самой большой из баз данных занимает целую вечность (пока что это занимает 24 часа). Я восстанавливаю через:

mysql -uxxxx -p
Введите пароль: гггг
mysql> создать базу данных foo;
mysql> использовать foo;
mysql> начать транзакцию;
mysql>\. <файл дампа>

Я молюсь, чтобы я не забыл совершить когда это закончится!

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

Могу ли я что-нибудь сделать, чтобы ускорить восстановление? Должен ли я был сделать резервную копию по-другому - я просто использовал ванильный mysqldump командная строка, с --skip-столбец-статистика поскольку в противном случае дамп не сработает, как это было предложено в этот ответ stackoverflow.

Для справки: новая машина работает под управлением Windows 10 и MySQL 8.0.25 Community; на старой машине работали Windows 7 и MySQL 5.6.22.

Глядя на файлы дампа более внимательно (чтобы найти версию сервера), я вижу, что таблицы создаются с их индексами, за которыми следует множество операторов INSERT INTO. Это не кажется особенно умным. Есть ли способ вызвать mysqldump создать скрипт, который:

  1. Создает таблицы без индексов
  2. Вставляет строки; а потом
  3. Создает индексы.

что может показаться лучшим подходом при восстановлении базы данных. (Немного удивительно, что это не значение по умолчанию!) Я предполагаю, что это возможно с MySQL - я использую SQLLite в течение последних 3 лет, и это, безусловно, возможно.

Обновлять

этот вопрос не полностью ответил Как ускорить восстановление MySQL из файла дампа?, так как этот вопрос, в частности, относится к таблицам MyISAM, а у меня InnoDB. (Извинения. Вероятно, мне следовало упомянуть механизм хранения в моем первоначальном вопросе.)

Однако этот ответ мотивировал и информировал мои попытки решить вопросы, которые я документирую в своем собственном ответе ниже.

nurdglaw avatar
флаг ar
Хм. Вполне может подойти. Я должен посмотреть поближе. Что бы это ни стоило, восстановление выполняется уже около 24 часов. Судя по значениям `AUTO_INCREMENT=` в файле дампа, три таблицы имеют соответственно 2,6 млн, 250 тыс. и 8,5 млн строк. В настоящее время восстанавливается третья таблица. Я не проверял должным образом, сколько строк вставляется с каждой командой INSERT INTO, но сейчас выполнение каждой занимает 3-4 минуты. Это, безусловно, похоже на проблему с индексацией. У меня нет внешних ключей, которые находятся в центре внимания упомянутой статьи, но AUTOCOMMIT выглядит вероятным виновником. Спасибо!
nurdglaw avatar
флаг ar
У меня возникает соблазн дождаться этого восстановления и изучить возможность изменения дампов двух других (намного меньших) баз данных, чтобы создавать индексы только после завершения всех операций INSERT. Затем я попытаюсь повторить восстановление большой базы данных с этими изменениями.
nurdglaw avatar
флаг ar
@MichaelHampton PPS: Если вы превратите свой комментарий в ответ, я обязательно проголосую за него (если у меня будет достаточно представителей). Еще раз спасибо.
Michael Hampton avatar
флаг cz
Если это решило вашу проблему, просто нажмите кнопку выше.
nurdglaw avatar
флаг ar
@Laura Elvira Hernández Лара - Спасибо за предложение редактирования. Пожалуйста, простите меня за то, что я отклонил ваше предложение и заменил «Заранее спасибо» на то, что (я думаю) я изначально намеревался вставить туда. Небеса знают, почему я подумал, что «заранее спасибо» было подходящим заполнителем.
флаг ua
Если вы не используете 8.0, ваши опасения по поводу `START` и `COMMIT` не имеют значения. Операторы DDL неявно `COMMIT`. Таким образом, при сбое некоторые таблицы останутся загруженными, а некоторые нет.
Рейтинг:0
флаг ar

В конце концов я перестал ждать завершения импорта после > 24 часов.

Я изменил сценарии, сгенерированные mysqldump чтобы создавать таблицы без вторичных индексов и создавать индексы только тогда, когда все ВСТАВЛЯТЬ заявления были выполнены.С этим изменением импорт был завершен, когда я проверил через три часа после запуска.

Затем я дополнительно изменил сценарий, чтобы вставить строки в транзакцию, добавив УСТАНОВИТЬ АВТОКОММИТ = 0; НАЧАТЬ СДЕЛКУ; в начале и СОВЕРШИТЬ; в конце. С этим изменением восстановление завершилось за 90 минут.

При редактировании сгенерированных дампов я заметил, что они включают

/*!40000 ALTER TABLE `xxx` DISABLE KEYS */;

и

/*!40000 ALTER TABLE `xxx` ENABLE KEYS */;

вокруг ВСТАВЛЯТЬ заявления. я посмотрел документация по этим командам и обнаружил, что они применяются только к таблицам MyISAM. документация по mysqldump утилита утверждает, что эти строки (включая разделители комментариев и магическое число 40000) генерируются, если вы укажете --disable-ключи в командной строке. В документации к утилите также говорится, что она добавит поведение «вставить все в одну транзакцию», которое я считаю желательным, если вы укажете --no-autocommit в командной строке.


Таким образом, я, вероятно, должен был сделать резервные копии с помощью

 mysqldump --no-autocommit...

По крайней мере в моем случае(mysqldump версия 8.0.25 и таблица InnoDb) --disable-ключи опция не имеет значения; ALTER TABLE ... ENABLE|DISABLE KEYS операторы (закомментированные и с магическим числом) генерируются всегда. я делать необходимо изменить сгенерированный дамп, чтобы создать таблицы без вторичных ключей, и добавить их сразу все ВСТАВИТЬ В заявления выполнены.

nurdglaw avatar
флаг ar
Почему голосование против / удаление, пожалуйста?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.