Извлечение определений 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