1

Я запускаю веб-приложение в среде общего хостинга, которая использует базу данных MYSQL размером около 3 ГБ.

Для целей тестирования я настроил среду XAMPP на моем локальном компьютере с macOS. Чтобы скопировать онлайн-БД на мою локальную машину, я использовал mysqldump на сервере, а затем напрямую импортировал файл дампа в mysql:

// Server
$ mysqldump -alv -h127.0.0.3 --default-character-set=utf8 -u dbUser -p'dbPass' --extended-insert dbName > dbDump.sql

// Local machine
$ mysql -h 127.0.0.3 -u dbUser -p'dbPass' dbName < dbDump.sql

Единственной оптимизацией здесь является использование extended-insert . Однако импорт занимает около 10 часов !

В немом файле уже есть команды для отключения проверки уникальных и внешних ключей для ускорения импорта:

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

Я не экспортирую SQL и не уверен, что /*!40014 команд выполняются или нет, поэтому добавлено SET FOREIGN_KEY_CHECKS=0; вручную в файл, чтобы убедиться, что проверки отключены. Однако это не имеет никакого значения.

Почему импорт данных занимает так много времени? Есть ли лучший / более быстрый способ сделать это?

Сервер не самый быстрый (общий хостинг ...), но для экспорта / вывода данных требуется всего около 2 минут. То, что экспорт (без проверки синтаксиса, без синтаксического анализа, просто запись ...) быстрее импорта (синтаксический анализ, проверка синтаксиса и т.д.) Неудивителен, но в 300 раз быстрее (10 часов против 2 минут)? Это огромная разница ...

Нет ли другого решения, которое было бы быстрее? Например, вместо этого скопируйте двоичный файл БД? Все будет лучше, чем использование текстового файла в качестве средства передачи.

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

1 ответ1

2

Медленный импорт является признаком плохой конфигурации на конечном сервере.

Увеличьте innodb_buffer_pool_size до 70% доступной оперативной памяти. Установите innodb_log_file_size в 512M (используя эту процедуру (настройте URL для версии сервера MySQL)).

Во время импорта SET GLOBAL innodb_flush_log_at_trx_commit=0 и установите значение 1 после завершения импорта.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .