Извлечение определений CREATE TABLE из дампа MySQL?

У меня есть файл дампа MySQL размером более 1 терабайта. Мне нужно извлечь из него операторы CREATE TABLE, чтобы я мог предоставить определения таблиц.

Я купил Hex Editor Neo, но я разочарован. Я создал регулярное выражение CREATE\s+TABLE(.|\s)*?(?=ENGINE=InnoDB) извлечь предложение CREATE TABLE, и это, кажется, хорошо работает при тестировании в NotePad++.

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

Есть ли быстрый способ, которым я могу сделать это на моем Ubuntu box, используя grep или что-то еще?

ОБНОВИТЬ

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

grep -oP "CREATE\s+TABLE(.|\s)+?(?=ENGINE=InnoDB)" test.txt > plates_schema.txt

ОБНОВЛЕНИЕ Кажется, не совпадают на новых строках сразу после CREATE\s+TABLE часть.

4 ответа

Решение

Вы можете использовать Perl для этой задачи... это должно быть очень быстро.

в Perl .. (диапазон) оператор с состоянием - он запоминает состояние между оценками. Что это означает: если ваше определение таблицы начинается с CREATE TABLE и заканчивается чем-то вроде ENGINE=InnoDB DEFAULT CHARSET=utf8; тогда ниже сделаю что хочешь.

perl -ne 'print if /CREATE TABLE/../ENGINE=InnoDB/' INPUT_FILE.sql > OUTPUT_FILE.sql

РЕДАКТИРОВАТЬ:

Так как вы работаете с действительно большим файлом и, вероятно, хотели бы узнать о прогрессе, pv могу дать вам это также:

pv INPUT_FILE.sql | perl -ne 'print if /CREATE TABLE/../ENGINE=InnoDB/' > OUTPUT_FILE.sql

Это покажет вам индикатор выполнения, скорость и ETA.

Вы можете использовать следующее:

grep -ioP "^CREATE\s+TABLE[\s\S]*?(?=ENGINE=InnoDB)" file.txt > output.txt

Если вы можете запустить mysqldump снова, просто добавьте --no-data,

Понял! grep не поддерживает сопоставление по нескольким строкам. Я нашел этот вопрос helpul, и я вместо этого использовал pcregrep.

pcregrep -M "CREATE\s+TABLE(.|\n|\s)+?(?=ENGINE=InnoDB)" test.txt > plates.schema.txt
Другие вопросы по тегам