Более высокая скорость выполнения очень большого (20 ГБ) файла.sql в MySQL
Моя фирма получила ответный файл размером более 20 ГБ в ответ на запрос данных от правительства. У меня не так много вариантов получения данных в другом формате, поэтому мне нужны варианты, как импортировать их в разумные сроки. Я запускаю его на высококлассном сервере (Win 2008 64bit, MySQL 5.1) с помощью инструмента пакетного выполнения Navicat. Он работает в течение 14 часов и не показывает никаких признаков того, что он близок к завершению.
Кто-нибудь знает какие-либо варианты более высокой скорости для такой транзакции? Или это то, что я должен ожидать, учитывая большой размер файла?
Спасибо
4 ответа
Я предполагаю, что вы имеете в виду, что это файл, созданный mysqldump
в качестве резервной копии базы данных, поэтому она содержит в основном CREATE TABLE
а также INSERT
заявления.
(Строго говоря, сценарий SQL может содержать все, что угодно, например определение и выполнение долго выполняющихся хранимых процедур, запросы, которые приводят к взаимоблокировкам и т. Д. Я предполагаю, что это не так.)
Вот несколько вещей, которые вы можете сделать, чтобы ускорить восстановление, учитывая, что у вас есть файл резервной копии и вы не можете изменить его тип:
Отключить проверку внешнего ключа:
SET FOREIGN_KEY_CHECKS=0
(не забудьте включить потом). Отключите уникальные проверки тоже:SET UNIQUE_CHECKS=0
Убедитесь, что ваш
key_buffer_size
устанавливается максимально возможным, если вы используете таблицы MyISAM. Значение по умолчанию составляет 8 МБ, а максимальное - 4 ГБ. Я бы попробовал 1ГБ.Эти первые советы приходят от поста барона Шварца: http://lists.mysql.com/mysql/206866
Убедитесь, что ваш
innodb_buffer_pool_size
устанавливается максимально возможным, если вы используете таблицы InnoDB. Значение по умолчанию составляет 8 МБ, а максимальное - 4 ГБ. Я бы попробовал 1ГБ.Задавать
innodb_flush_log_at_trx_commit = 2
во время восстановления, если вы используете таблицы InnoDB.@Mark B добавляет хорошее предложение ниже, чтобы отключить ключи во время восстановления. Вот как вы это делаете:
ALTER TABLE <table-name> DISABLE KEYS; ...run your restore... ALTER TABLE <table-name> ENABLE KEYS;
Но эта команда влияет только на одну таблицу за раз. Вам придется выполнить отдельную команду для каждой таблицы. Тем не менее, часто бывает, что одна таблица намного больше других таблиц, поэтому вам может потребоваться отключить ключи только для этой одной большой таблицы.
Кроме того, если SQL-скрипт, содержащий ваше восстановление, удаляет и воссоздает таблицы, это может обойти отключение ключей. Вам нужно будет найти способ вставить команды для отключения ключей после создания таблицы и до вставки строк. Возможно, вам придется проявить творческий подход с
sed
предварительно обработать сценарий SQL перед передачей его клиенту mysql.Используйте версию mysqldump для Percona Server с опцией --innodb-optimize-keys.
Существует большое количество инструментов, но я бы порекомендовал сделать это с помощью графического интерфейса Navicat. По моему опыту, он может запустить 48 ГБ *.sql файлов за 6 часов на хосте с 8 ГБ ОЗУ.
Объяснение (вроде) здесь:Вторичный щелчок по выбранной БД, выберите "Выполнить файл SQL", выберите файл, выберите "продолжить при ошибке", если хотите, и, наконец, запустите его. Я знаю, что это показывает БД MySQL, но работает на наиболее используемых / популярных СУБД.
Я серьезно не советую "открывать" файл с такими пропорциями в построителе SQL-запросов, это блокирует машину, так как ОЗУ будет заполнена снова и снова.
Это также работает в ОС Macintosh в качестве хоста приложения Navicat, и, как только вы подключитесь к определенному серверу БД, вы можете запускать его в любом месте, работая до сих пор на RHEL, Ubuntu Server, Debian и Windows Server.
Запросите только определения таблиц и данные в.csv. Затем выполните массовый импорт.