Удаление строк и запятых из mysqldump

Я пытаюсь удалить ограничения из mysqldump перед его передачей в другую базу данных SQL. Mysqldump генерирует таблицы, которые выглядят примерно так с 1 или более ограничениями:

CREATE TABLE `SOME_TBL` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'blah',
  /* ... */
  PRIMARY KEY (`ID`) USING BTREE,
  CONSTRAINT `SOME_TBL_FC1` FOREIGN KEY (`SOME_FIELD`) REFERENCES `SOME_OTHER_TBL` (`ID`),
  CONSTRAINT `SOME_TBL_FC2` FOREIGN KEY (`ANOTHER_FIELD`) REFERENCES `ANOTHER_TBL` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3845453 DEFAULT CHARSET=utf8 COMMENT='data lives here';

Я могу удалить строки ограничений следующим образом:

mysqldump --source-database \
  | sed -E '/^ *CONSTRAINT/d' \
  | mysql --result-database

Но тогда у меня остаются запятые, например:

CREATE TABLE `SOME_TBL` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'blah',
  /* ... */
  PRIMARY KEY (`ID`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=3845453 DEFAULT CHARSET=utf8 COMMENT='data lives here';

... что не нравится SQL. (Обратите внимание на запятую после "BTREE" выше). Обратите внимание, я не хочу удалять все запятые, только те запятые, которые появляются перед новой строкой и закрывающей парентемой (что-то вроде ,\n))

Какой самый простой способ удалить эти запятые и строки ограничений в середине потока? Обратите внимание, что дампы могут быть размером в несколько тысяч мегабайт, поэтому я не могу просто засунуть весь файл в perl или что-то подобное; я хочу иметь возможность делать это как часть конвейера.

Вероятно, после этого я мог бы запустить SQL, использующий INFORMATION_SCHEMA для удаления ограничений, но мне интересно, есть ли более элегантный способ сделать это, используя только средства обработки текста?

0
15.05.2017, 22:22
1 ответ

Нет причин, по которым вы не можете использовать Perl в конвейере. Если предположить, что \r (не -окончания строки DOS )и программа равна:

#!/usr/bin/perl
unless( defined $previous && length $previous ){
    $previous = `$_`;
    redo LINE;
}

if( m/CONSTRAINT/ ){
    $previous =~ s/\,\s*\n$/ \n/;
    next LINE;
}

print $previous;
$previous = `$_`;

END{
    print $previous;
}

Тогда cat dump.sql | perl -n program.pm | and so onделает свое дело.

0
28.01.2020, 04:45

Теги

Похожие вопросы