2013-02-15 2 views
0

Я хочу импортировать очень большой sql-файл в свой тестовый сервер db, файл составляет около 50 ГБ. Проблема в том, что если я делаю mysql -uuser -p < sqlfile.sql, это займет очень долгое время из-за самого времени загрузки файла.Потоковые файлы в командной строке

Так что я хотел бы разбить файлы на очень мелкие куски размером 100 МБ, используя split -bytes=100M, но проблема заключается в том, что разделение не будет выровнено по SQL-выражению (сломанные инструкции вставки, охватывающие границы файлов).

Теперь мой вопрос: есть ли способ передать несколько файлов в командной строке? что-то вроде

mysql -user -p <1.sql < 2.sql < 3.sql и так далее, если это возможно, я смогу сделать некоторые оболочки сценариев-фу, чтобы использовать xargs и for цикл, чтобы сделать это для всех файлов в каталоге?

EDIT: Моя попытка разделить файлы регулируется этим сообщением, How to import LARGE sql files into mysql table. Кажется, проблема такая же, как у меня. Ну, тестовый сервер - 8 ГБ, Xeon Quadcore, и я попробовал то же самое на другом сервере с 20 ядрами 144 ГБ, и он закончил отлично с 11-часовым временем исполнения (общий с большим количеством напряжений в CPU/RAM)). На тестовом сервере процесс еще не завершен. Поэтому я думаю, что это оперативная память + загрузка файла. Поправьте меня, если я ошибаюсь.

+0

Почему все это имеет значение, если вы делаете это сразу или нет? Это нужно сделать в конце концов, не так ли? –

+0

11 часов для файлов размером 50 ГБ ??? Не могли бы вы разместить свой 'mycnf.conf'. Также нет проблем с импортом больших файлов: 'nohup mysql -A {учетные данные + база данных при необходимости} ravnur

+0

попытаться установить большие значения для переменных _max_allowed_packet_ и _read_buffer_size_ в файле конфигурации – vadchen

ответ

0

Проблема в том, что если я делаю mysql -uuser -p < sqlfile.sql, это займет очень долгое время из-за самого времени загрузки файла.

При перенаправлении такого файла нет «времени загрузки». MySQL может читать файл так быстро, как ему нравится; нет накладных расходов. Разделение файла не приведет к каким-либо ускорениям. Это так же быстро, как и получается.

Теперь, мой вопрос: есть ли способ передать несколько файлов в командной строке?

Это будет медленнее, чем оставить файл в один большой кусок, но если вы действительно хотите вы можете сделать это:

cat 1.sql 2.sql 3.sql | mysql -uuser -p 

Или же вы можете запустить MySQL отдельно для каждого файла:

for file in *.sql; do mysql -uuser -p < "$file"; done 
+0

Yup, 'cat' - это то, о чем я тоже думал. Но не будет работать.Рассмотрим «SELECT table_schema» DB Name », sum (data_length + index_length)/1024/1024« Размер DB в MB » FROM inf' в 1.sql и' ormation_schema.TABLES GROUP BY table_schema; 'в 2.sql. Команда Te не сможет сказать неправильную инструкцию. Но мне интересно, почему! –

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