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
괜찮습니다.