Removendo linhas e vírgulas à direita do mysqldump

0

Estou tentando remover restrições de um mysqldump antes de direcioná-lo para outro banco de dados SQL. O Mysqldump gera tabelas parecidas com 1 ou mais restrições:

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';

Eu posso excluir as linhas de restrição assim:

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

Mas então eu fico com vírgulas à direita, por exemplo:

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';

... qual SQL não gosta. (observe a vírgula depois de "BTREE" acima). Note que eu não quero remover as vírgulas à direita all , apenas as vírgulas à direita que aparecem antes de uma nova linha e paren close (algo como ,\n) )

Qual é a maneira mais fácil de excluir essas vírgulas à direita e as linhas de restrição no meio do fluxo? Observe que os dumps podem ter vários milhares de megabytes, portanto, não posso simplesmente fazer o slurp do arquivo inteiro em perl ou algo assim; Eu quero ser capaz de fazer isso como parte de um pipeline.

Eu provavelmente poderia executar algum SQL depois que usa INFORMATION_SCHEMA para excluir as restrições, mas eu estou querendo saber se há uma maneira mais elegante de fazer isso usando apenas ferramentas de processamento de texto?

    
por Robert Fraser 15.05.2017 / 19:28

1 resposta

0

Nenhuma razão pela qual você não pode usar o Perl em um pipeline. Se assumirmos que os finais de linha \ r (não-DOS) e programa são:

#!/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;
}

Então cat dump.sql | perl -n program.pm | and so on faz o truque.

    
por 15.05.2017 / 21:58