Так что я сделал mysqldump
довольно огромного db, и я пытаюсь восстановить его сейчас, используя:
mysql db_test < db_test.sql
но похоже, что это не закончится к концу этого года. Прошло около часа, а все еще «восстанавливается». Создание резервной копии заняло около 10 минут, поэтому, боюсь, что-то не так.
До сих пор:
mysqld
потребляет мой процессор (иногда до 80%).Я могу видеть базу данных, созданную и заполненную множеством таблиц (но не все). Кроме того, когда я выполняю use db_test;
, Я получаю следующее сообщение:
Чтение информации таблицы для завершения имен таблиц и столбцов. Вы можете отключить эту функцию, чтобы ускорить запуск, с помощью -A.
df -h
возвращает то же свободное пространство, что и раньше. Так что я думаю, он ничего не делает на диске.Что-то странное в том, что при проверке top
, Я узнал что kworker
иногда потреблял до 100% процессора, чего не должно было происходить
Есть идеи или что-нибудь, что я могу сделать, чтобы увидеть, что происходит?
Похоже, что нижележащие диски заняты. Проблема при восстановлении большой базы данных заключается в том, что для каждой (группы) INSERT требуется операция сброса / синхронизации, которая очень медленная на механических дисках (диск со скоростью 7200 об / мин составляет порядка ~ 100 IOPS).
Чтобы ускорить восстановление, вам пришлось временно указать MySQL / MariaDB на не проблема сбрасывает / синхронизирует. Для этого прервите восстановление и отредактируйте свой /etc/my.ini
со следующими двумя строками:
innodb_flush_method=nosync
innodb_flush_log_at_trx_commit=2
Затем перезапустите MariaDB и повторите восстановление. Теперь все должно идти намного быстрее.
После восстановления УДАЛИТЬ ВЫШЕ СТРОКИ вашей базы данных будет иметь короткую и плохую жизнь: сброс / синхронизация существует по очень важным причинам. Хотя их можно отключить для восстановления, производственная база данных должна никогда бегать без них.
Если ваше базовое хранилище представляет собой простые старые диски, для базы данных MySQL на 25 ГБ на диске вполне нормально проводить многочасовое восстановление, особенно для некоторых плохо структурированных баз данных (много кортежей, индексов и т. Д.).
Для начала сожмите дамп, что сэкономит массу операций ввода-вывода и снизит нагрузку на кеш-память:
mysqldump foo |gzip >foo.sql.gz
zcat foo.sql.gz |mysql foo
В вашем случае, поскольку вы уже выполнили mysqldump:
gzip db_test.sql
zcat db_test.sql.gz |mysql db_test
Помимо производительности вашей системы (хранилище, ОЗУ и т. Д.), Настройки MySQL могут иметь огромное влияние. Но это целый опыт, ничего, кроме проблемы с ServerFault ...