2010-01-08 5 views
2

MySQL Admin Migration 툴킷을 사용하여 데이터베이스에서 데이터를 덤프했습니다. 테이블 중 하나에 500 만 개의 행이 있습니다. 생성 된 데이터 파일을로드하려고하면 메모리 문제가 발생합니다.500 만 개가 넘는 행의 MySQL 삽입 - x 개의 행마다 커밋 옵션이 필요합니까?

X 행 이후에 강제로 커밋하는 방법이 있습니까? 마이그레이션 도구 키트에서 생성 한 스크립트는 다음과 같습니다.

INSERT INTO mytable (`col1`, `col1`) 
VALUES (823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 
(823, 187.25), 

답변

3

예. 이 큰 INSERT INTO 문은 본질적으로 스크립트입니다. 편집자에게 가져 가라. 몇 백 라인마다 COMMIT이라는 행을 삽입 한 다음 새 INSERT ... VALUES 문을 시작하십시오.

더 많은 혜택을 얻으려면 원본 SQL 문을 프로그래밍 방식으로 여러 트랜잭션 (위에서 설명한대로)으로 다시 작성하는 간단한 스크립트를 작성할 수 있습니다. 당신은 손으로 이것을 반복적으로하고 싶지 않습니다.

활성화 할 수있는 외부 설정이 없으므로이 스크립트를 완전히 제출하고 스크립트를 변경하지 않고 일정한 간격으로 자동 커밋을 수행 할 수 있습니다.

로그 파일 공간을 늘리면 제한이 발생할 수 있지만 그다지 중요하지 않습니다. 문제를 직시 : DB는 단순히 수천 줄의 문장을 처리 할 수 ​​있도록 제작되지 않았습니다.

내가 할 수있는 것은 다중 커밋을하지만이 항목을 임시 테이블이나 "임시"플래그로 푸시하는 것입니다. 이러한 변경 사항을 영구히 적용하려면 하나 또는 소수의 작업을 실행하십시오. 그래도 문제가 해결되지 않으면 임시 레코드를 다시 시도하거나 삭제할 수 있습니다.

+1

정말로 여러 번 커밋하고 싶습니까? 나중에 무언가가 실패하면 일관성없는 데이터로 끝날 것입니다. –

+0

그것은 원하는 것이 아닙니다. 다른 방법으로는 내 지식이 없습니다. 커밋 공간을 기가 바이트로 늘리면 오라클에서 작동하지만 MySQL에서는 간단히 작동하지 않을 수도 있습니다. 그것은 결국 장난감 데이터베이스입니다. –

+0

맞습니다.하지만 롤백 기능이 중요하다면, 어쨌든 삽입을 다시 포맷하거나 적어도 일시적으로 INNODB 버퍼 크기를 늘려야합니다. MySQL에서 버퍼 크기를 알 수있는 유일한 제한은 시스템 메모리이지만, 틀릴 수도있다. –

3

DBA에게 기본 5M에서 innodb_log_file_size를 256MB로 늘리라고 요청하십시오. 쓰기 집약적 인 작업 부하에 대해서도 좋은 성능 향상을 제공합니다. 이 설정을 변경할 때 데몬을 다시 시작하기 전에 이전 로그 파일을 제거해야하므로주의하십시오. 그것은 "모든 X 행 자동 커밋"에 대한 필요성을 제거해야합니다.

+0

+1, 이것이 실제로 작동하는 경우. –

+0

데이터 자체가 4GB INNODB 로그 제한 (Carl 언급)을 위반하지 않는다고 가정 할 때, 이것이 내가 제안한 대답입니다. –

관련 문제