mysqldump에서 행과 후행 쉼표 제거

mysqldump에서 행과 후행 쉼표 제거

mysqldump를 다른 SQL 데이터베이스에 연결하기 전에 mysqldump에 대한 제약 조건을 삭제하려고 합니다.MySQL 덤프결과 테이블은 하나 이상의 제약 조건이 포함된 다음과 같습니다.

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 등에 넣을 수는 없으며 파이프라인의 일부로 사용할 수 있기를 원합니다.

나중에 INFORMATION_SCHEMA를 사용하여 제약 조건을 제거하는 일부 SQL을 실행할 수도 있지만 텍스트 처리 도구만 사용하여 이 작업을 수행하는 더 우아한 방법이 있는지 궁금합니다.

답변1

사용하지 못할 이유가 없습니다진주파이프라인에서. \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괜찮습니다.

관련 정보