code

mysqldump에 의해 생성 된 엄청난 줄 길이를 처리하는 방법

codestyles 2020. 12. 11. 08:15
반응형

mysqldump에 의해 생성 된 엄청난 줄 길이를 처리하는 방법


2 백만 개 이상의 행이있는 데이터베이스를 백업하기 위해 cron 작업에서 mysqldump를 사용하고 있습니다.

명령 줄에서 데이터 로그를 복원하는 데 사용할 수있는 텍스트 파일을 생성합니다.

적어도 ALTER 및 UPDATE로 수행하는 것에 대해 더 많이 배우고 확신 할 때까지 값과 테이블 또는 열 이름을 변경 하는 빠른 방법으로 복원 전에 덤프를 편집하는 것이 유용 할 것이라고 생각했습니다 .

큰 텍스트 파일을 편집하는 것은 신경 쓰이지 않지만 데이터베이스 250MB 덤프에 약 300 줄만 있다는 사실에 놀랐습니다 . 각 줄은 800,000 자 정도였습니다.

라인 길이를 더 잘 제어하여 덤프를 생성하는 다른 방법이 있습니까?

아니면 sed 또는 Perl과 같은 도구를 사용하여 덤프를 후 처리해야합니까?


기본적으로 는 테이블 당mysqldump 하나의 INSERT명령 만 생성 하므로 덤프 된 각 테이블에 대해 한 줄 (매우 긴)의 데이터가 삽입됩니다. 이는 본질적으로 "일괄"삽입이 모든 테이블의 모든 레코드에 대해 별도의 쿼리를 생성하는 것보다 훨씬 빠르기 때문 입니다.INSERT

따라서 mysqldump임의로 긴 선을 만든 것은 아니며 다른 컷오프 길이를 부과 할 수 있습니다. 줄은 이유가 길다.

INSERTs를 여러 줄로 나누는 것이 정말 중요한 경우 다음 과 같이 나타낼 수 있습니다.

mysqldump --extended-insert=FALSE --complete-insert=TRUE ...

그러나이 형식에서는 테이블을 복원하는 데 더 오래 걸립니다.


나는 오늘이 문제에 대한 해결책을 찾기 위해 MySQL 소스 코드를 탐색하고 있었다. 최대 줄 길이는 MySQL 서버의 버퍼 크기와 일치해야하는 변수 opt_net_buffer_length에 의해 적용됩니다. 코믹하게 큽니다.

그러나 어쨌든 그것은 옵션이므로 다음과 같이하십시오.

mysqldump --net_buffer_length=5000 ...

최소값은 4096입니다.


나는 MySQL 포럼에서 답변을 보았습니다. 이는 소스를 수정하지 않고는 mysqldump를 단독으로 사용하는 것이 불가능한 각 INSERT 그룹 후에 '\ n'을 추가하는 것을 결정적으로 보여줍니다.

확장 형식은 쉼표 또는 괄호를 기반으로 100 % 제대로 구문 분석 할 수 없으므로 필드를 계산해야합니다. 가장 좋은 해결책은 mysqldump를 출력시 줄 바꿈으로 수정하는 것입니다.

매우 사소한 변경 : 3506 행에서 행 끝 쉼표가 출력되는 위치를 볼 수 있습니다.
fputc(',',md_result_file); /* Always row break */

3506 행 바로 뒤에 다음 행을 삽입하면됩니다.
fputc('\n',md_result_file); /* Lon Binder says wrap that line! */

다시 컴파일하고 완료하십시오.

@see http://forums.mysql.com/read.php?28,420002,426110#msg-426110

고마워 Lon B!

(포럼이 사라질 경우를 대비하여 MySQL 포럼의 내용을 포함했습니다.)


이 플래그도 작동합니다.

mysqldump --skip-extended-insert 

같은 단지 같은 --extended-insert=FALSE.


정규식을 사용하여 줄을 분할하는 것만으로는 충분하지 않으므로 따옴표와 이스케이프 문자를 올바르게 이해하는 파서가 필요합니다.

파서를 찾을 수 없기 때문에 방금 파서를 썼습니다 : http://blog.lavoie.sl/2014/06/split-mysqldump-extended-inserts.html


python으로 덤프 파일을 사후 처리합니다 . 당신은 perl이나 sed보다 더 행복 할 수 있습니다.

Linux에서 실행중인 경우 이미 설치되어 있습니다. Windows에서 실행중인 경우 설치 프로그램이 간단합니다.

그러나 그 전에 SQL UPDATE 및 SQL ALTER 사용 방법을 배우십시오. 올바른 방식으로 일하는 것이 가장 행복 할 것입니다.

참고 URL : https://stackoverflow.com/questions/1293529/how-to-deal-with-enormous-line-lengths-created-by-mysqldump

반응형