Более высокая скорость выполнения очень большого (20 ГБ) файла .sql в MySQL - PullRequest
2 голосов
/ 11 мая 2010

Моей фирме был предоставлен файл с расширением .sql размером 20 ГБ в ответ на запрос данных из правительства. У меня не так много вариантов получения данных в другом формате, поэтому мне нужны варианты, как импортировать их в разумные сроки. Я использую его на высококлассном сервере (Win 2008 64bit, MySQL 5.1) с помощью инструмента пакетного выполнения Navicat. Он работает в течение 14 часов и не показывает никаких признаков того, что он близок к завершению.

Кто-нибудь знает какие-либо варианты более высокой скорости для такой транзакции? Или это то, что я должен ожидать, учитывая большой размер файла?

Спасибо

Ответы [ 4 ]

9 голосов
/ 11 мая 2010

Полагаю, вы имеете в виду, что это файл, созданный mysqldump в качестве резервной копии базы данных, поэтому он содержит в основном операторы CREATE TABLE и INSERT.

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

Вот несколько вещей, которые вы можете сделать, чтобы ускорить восстановление, если у вас есть файл резервной копии и вы не можете изменить тип файла:

  1. Отключить проверку внешнего ключа: SET FOREIGN_KEY_CHECKS=0 (не забудьте повторно включить впоследствии). Отключите уникальные проверки тоже: SET UNIQUE_CHECKS=0

  2. Убедитесь, что ваш key_buffer_size установлен как можно больше, если вы используете таблицы MyISAM. Значение по умолчанию составляет 8 МБ, а максимальное - 4 ГБ. Я бы попробовал 1ГБ.

    Эти первые советы приходят от поста барона Шварца: http://lists.mysql.com/mysql/206866

  3. Убедитесь, что ваш innodb_buffer_pool_size установлен как можно больше, если вы используете таблицы InnoDB. Значение по умолчанию составляет 8 МБ, а максимальное - 4 ГБ. Я бы попробовал 1ГБ.

  4. Установите innodb_flush_log_at_trx_commit = 2 во время восстановления, если вы используете таблицы InnoDB.

  5. @ Mark B добавляет хорошее предложение ниже к отключить ключи во время восстановления. Вот как вы это делаете:

    ALTER TABLE <table-name> DISABLE KEYS;
    ...run your restore...
    ALTER TABLE <table-name> ENABLE KEYS;
    

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

    Кроме того, если SQL-скрипт, содержащий ваше восстановление, удаляет и воссоздает таблицы, это может обойти отключение ключей. Вам нужно будет найти способ вставить команды для отключения ключей после создания таблицы и до вставки строк. Возможно, вам придется проявить изобретательность с помощью sed для предварительной обработки сценария SQL перед передачей его клиенту mysql.

  6. Используйте версию mysqldump для Percona Server с опцией - innodb-optimize-keys .

1 голос
/ 11 мая 2010

Используйте для этого BULK Import в MySQL.

0 голосов
/ 02 июля 2015

Существует множество инструментов, но я бы порекомендовал сделать это с помощью графического интерфейса Navicat. По моему опыту, он может запустить 48 ГБ * .sql файлов за 6 часов на хосте с 8 ГБ ОЗУ.

Объяснение (вроде) здесь: enter image description here Вторично щелкните по выбранной БД, выберите «Выполнить файл SQL», выберите файл, выберите «продолжить при ошибке», если хотите, и, наконец, запустите его. Я знаю, что это показывает БД MySQL, но работает на наиболее используемых / популярных СУБД.

Я серьезно не советую «открывать» файл с такими пропорциями в построителе SQL-запросов, это блокирует машину, так как ОЗУ будет заполняться снова и снова.

Это также работает на Macintosh OS в качестве хоста приложения Navicat, и, как только вы подключитесь к определенному серверу БД, вы можете запускать его в любом месте, работая до настоящего времени на RHEL, Ubuntu Server, Debian и Windows Server. *

0 голосов
/ 11 мая 2010

Запрос только определений таблиц и данных в формате .csv. Затем выполните массовый импорт.

...