2011-08-25 3 views
3

10million 행의 MySQL MyISAM 테이블을 InnoDB로 변환하려고합니다.
ALTER TABLE을 시도했지만 서버가 멈추어 MySQL을 수동으로 종료했습니다. 그렇게하는 것이 바람직한 방법은 무엇입니까?큰 MyISAM을 InnoDB로 변환

옵션 내가 생각한 것 :
1. 매번 InnoDB라는 새 테이블을 만들고 데이터의 일부를 삽입 할 때.
2. 테이블을 텍스트 파일로 덤프 한 다음 수행 LOAD FILE
3. 다시 시도하고 서버가 응답 할 때까지 응답을 계속합니다 (2 시간 동안 노력했지만 서버는 프로덕션 서버이므로 계속 유지하는 것이 좋습니다.
4. 테이블 복사, 인덱스 제거, 변환 및 인덱스 추가

+0

# 1이 좋지만 테이블을 쓰기에서 잠글 필요가 있습니다. – Dor

답변

0

PK로 먼저 데이터를 정렬하려 했습니까? 예 :

ALTER TABLE tablename ORDER BY PK_column; 

은 변환 속도를 높여야합니다.

+0

도움이되는 이유를 설명 할 수 있습니까? ORDER BY는 INNODB에서 내 테이블 – Noam

+1

에 대한 상당히 어려운 쿼리를 느낍니다. PK가 클러스터 된 인덱스 (데이터 및 인덱스는 B- 트리에 저장 됨)이므로 미리 정렬하면 훨씬 쉽게 만들 수 있습니다 구조. –

2

테이블 엔진을 변경하면 테이블을 다시 작성해야하므로 테이블을 오래 사용할 수 없습니다. 인덱스를 제거한 다음 인덱스를 변환하고 추가하면 초기 변환 속도가 빨라지지만 인덱스를 추가하면 테이블에 읽기 잠금이 만들어 지므로 결국 효과는 동일하게됩니다. 새 테이블을 만들고 데이터를 전송하는 것이 좋습니다. 일반적으로이 작업은 두 부분으로 이루어집니다 - 첫 번째 복사본 레코드, 그런 다음 레코드를 복사하는 동안 수행 된 모든 변경 내용을 재생합니다. 읽기에서 나가는 동안 테이블에서 삽입/업데이트를 비활성화 할 수 있다면 문제가되지 않습니다. 그렇지 않은 경우 몇 가지 가능한 솔루션이 있습니다. 그 중 하나는 페이스 북의 online schema change 도구를 사용하는 것입니다. 또 다른 옵션은 새 레코드로만 전환하는 대신 레코드를 마이그레이션하는 동안 두 테이블에 모두 쓰도록 응용 프로그램을 설정하는 것입니다. 이것은 응용 프로그램 코드에 따라 다르며 고유 한 키/중복을 처리하는 중요한 부분은 이전 테이블에서 레코드를 업데이트 할 수있는 반면 새 레코드에서는 레코드를 삽입해야하는 것과 같습니다. (여기에서는 트랜잭션 격리 수준이 중요한 역할을 할 수 있으므로 가능한 한 낮추십시오). "클래식"방법은, 내가 아는 한 2 부분으로 이루어진 복제를 사용하는 것입니다. 복제를 시작하고 마스터 위치를 기록한 다음 두 번째 서버에서 데이터베이스의 덤프를 가져온 다음 슬레이브로 시작합니다. 변화를 따라 잡는다.

관련 문제