Поимел тут дамп базы данных — текстовик на 40 гигов.
Для понимания проблемы: дамп состоит из двух основных блоков
[блок команд создания таблиц]
[блок команд вставки строк]
Первый блок небольшой, на 150 строк. Второй – все остальные гиги, которые выглядят как
- INSERT INTO tablename VALUES (val1, val2… valN);
- INSERT INTO tablename VALUES (val1, val2… valN);
- ...
- INSERT INTO tablename VALUES (val1, val2… valN);
Импортируется обычно все командой
- cat dump.sql | mysql basename
то есть файл просто читается в пайп и mysql выполняет команды из него.
И в чем подстава.
Во-первых у дампа в начале не хватало пары команд — это выяснилось сразу при попытке импорта и легко выгуглилось. Во-вторых — в блоке импорта строк, ВО ВСЕХ строках отсутствовало начало: «INSERT INTO tablename VALUES»
Я не нашел такой чудо-редактор, который смог бы на редактирование хотя бы открыть этот мегадамп, поэтому к сути.
Сделал два вспомогательных файла:
1.sql – с недостающими командами,
2.sql – с первыми 150 строками, которые про создание таблиц, и первым недостающим «INSERT INTO tablename VALUES» — для начала блока импорта — который я добавил вручную.
Свел задачу к:
— как бы в один поток прочитать сначала эти два файла,
— а потом третий – только в нем пропустить первые строки, а во оставшихся — заменять концы строк с «);» на «); INSERT INTO tablename VALUES», чтобы каждая новая строка начиналась с корректной команды,
— и все это точно также запихать в пайп и отдать mysql.
Оказывается есть такая магия!
- {cat 1.sql 2.sql; sed -n -e 's/);/); INSERT INTO tablename VALUES /g;151,$ p' dump.sql;} | mysql basename
- конструкция команд внутри {} дает общий вывод, который можно направить в пайп и в mysql.
- cat 1.sql 2.sql - просто читает два файла подряд
- чтение основного файла отдаем седу, с двумя его командами
- sed -n -e 's/);/); INSERT INTO tablename VALUES /g;152,$ p' dump.sql;
- здесь ^-- меняем ";)" на "); INSERT..." --^ ^-- --^ - выводим файл со 151 строки