2017-02-15 2 views
1

Я пытаюсь восстановить большие файлы SQL (> 2,5 Гб) в базу данных MySQL в Windows.Отдельная фиксация при импорте очень больших файлов SQL (MySQL)

Я не могу отредактировать эти файлы, чтобы добавить текст в формате SET autocommit=0; в начало файла (что необходимо для улучшения времени импорта).

Я также не могу использовать source, так как это выводит на экран (что очень медленно), и выполнение продолжается, даже если в файле есть какие-либо ошибки. Например .:

mysql> CREATE DATABASE IF NOT EXISTS dbname; 
mysql> USE dbname; 
mysql> SET autocommit=0; 
mysql> source file.sql; 
mysql> COMMIT; 

Можно ли запускать произвольные команды до и после импорта файла SQL, которые применяются только к текущей сессии? Я попробовал оба из следующих действий, и не работают на ОС Windows (в обоих случаях вторая операция игнорируется):

mysql -u username -p -e "SET autocommit=0;" dbname < file.sql 

или,

mysql -u username -p < initial_commands.sql < file.sql 

Если это возможно, я не хочу, чтобы изменить глобальный параметр autocommit каждый раз, когда я это делаю, а затем должен помнить, чтобы изменить его обратно (также я не уверен, что это будет работать без окончательного COMMIT;).

Возможно, есть способ использовать BEGIN ... COMMIT; вместо отключения автообмена?

Я был бы доволен любыми предложениями людей, которые должны это делать!

ответ

1

(эхо установить автокоммит = 0; & & тип file.sql & & эхо & & эхо фиксации;.) | MySQL -u имя пользователя -p PASSWD

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

+0

Отлично, спасибо. Мне не приходило в голову, что вы можете использовать трубы и эквивалент 'cat' на окнах! – isedwards

1

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

set autocommit=0 означает, что все вставки (и другие записи), следовательно, вперед (до commit) должны быть зарегистрированы для потенциального ROLLBACK. Во-первых, регулярный механизм регистрации может содержать множество записей. Но в какой-то момент возникает более сложный механизм. Это связано с гораздо большим объемом ввода-вывода на диске, который является самой медленной частью базы данных.

Альтернативой является вырезание значительной части процесса «совершить» - fsync для очистки совершенной транзакции. innodb_flush_log_at_trx_commit Управление такими. По умолчанию, вероятно, =1 для «безопасного». Многие люди работают с =2, который менее безопасен, но ограничивает fsyncs до одного раза в секунду. «Небезопасная» часть состоит в том, что если у вас есть сбой питания, любые транзакции, выполняемые в последнюю секунду, могут быть подтверждены клиенту, фактически сохраняясь на диске.

Так что установка, вероятно, должно быть сделано до подключения, рассмотрим простой, 3 строки, .bat скрипт (файл):

mysql -e 'SET GLOBAL innodb_flush_log_at_trx_commit = 2' 
mysql dbname < file.sql 
mysql -e 'SET GLOBAL innodb_flush_log_at_trx_commit = 1' 
+1

Is innodb_flush_log_at_trx_commit = 0 хуже, чем 2? –

+1

@VladislavVaintroub - возможно. Производительность diff невелика, поэтому просто используйте 2. –

+0

В моих простых тестах путь 'autocommit = 0', кажется, все еще быстрее, но я рассмотрю это еще ... – isedwards

Смежные вопросы