큰 테이블을 MyISAM에서 Innodb로 변환


10

MyISAM 형식으로 약 300M 행의 테이블이 있습니다 .Innodb로 변환하고 싶습니다.

저의 원래 목표는 테이블 스키마를 더 간단한 색인을 갖도록 변경하여 사용량을 줄이는 것이 었습니다. 모든 테이블을 덤프하고 삭제 한 후 더 적은 인덱스로 다시 작성하여 다시 가져오고 있습니다. 그러나 myisam 대신 innodb이어야한다는 것을 지정하는 것을 잊었습니다.

표준 ALTER TABLE ... ENGINE = INNODB를 수행 할 수 있습니까? 그런 거대한 테이블에 대해 알아야 할 특별한 것이 있습니까?

데이터 가져 오기 작업은 약 12 ​​시간이 소요됩니다. 다시하기가 쉽지 않습니다. 따라서 왜 그냥 변환하고 싶습니다.


300M 개의 행으로 MyISAM은 아마도 그 크기의 테이블에 더 빠르고 더 적합 할 것입니다!
Mark Henderson

답변:


14

다음 발췌문은 " High Performance MySQL, Second Edition " 책에서 발췌 한 것입니다 .

이것은 훌륭한 책이며 누구에게나 추천합니다.

짧은 대답은 다음과 같습니다.

테이블 크기와 조건에 관계없이 어떤 방법을 선택하든 오래 기다려야 할 것 같습니다.


테이블 변환

하나의 스토리지 엔진에서 다른 스토리지 엔진으로 테이블을 변환하는 방법에는 여러 가지가 있으며, 각 방법마다 장단점이 있습니다.

테이블 변경

mysql> ALTER TABLE mytable ENGINE = Falcon;

이 구문은 모든 스토리지 엔진에 적용되지만 많은 시간이 걸릴 수 있습니다. MySQL은 기존 테이블을 한 행씩 복사하여 새 테이블로 만듭니다. 이 시간 동안 모든 서버의 디스크 I / O 용량을 사용하게되며 변환이 실행되는 동안 원래 테이블이 읽기 잠금 상태가됩니다.

덤프 및 가져 오기

변환 프로세스를보다 강력하게 제어하려면 먼저 mysqldump 유틸리티를 사용하여 테이블을 텍스트 파일로 덤프하도록 선택할 수 있습니다. 테이블을 덤프 한 후에는 덤프 파일을 편집하여 포함 된 CREATE TABLE 문을 조정하면됩니다. 테이블 이름과 유형을 변경하십시오. 유형이 다르더라도 동일한 데이터베이스에 동일한 이름을 가진 두 개의 테이블을 가질 수 없으므로 mysqldump는 기본적으로 CREATE TABLE 전에 DROP TABLE 명령을 작성합니다. 주의하지 않으면 데이터가 손실 될 수 있습니다.

작성 및 선택

세 번째 변환 기술은 첫 번째 메커니즘의 속도와 두 번째 메커니즘의 안전성 사이의 절충입니다. 전체 테이블을 덤프하거나 한 번에 모두 변환하는 대신 새 테이블을 작성하고 다음과 같이 MySQL의 INSERT ... SELECT 구문을 사용하여 채 웁니다.

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;

데이터가 많지 않으면 잘 작동하지만, 그렇지 않으면 실행 취소 로그가 크게 커지지 않도록 각 청크 사이에 트랜잭션을 커밋하여 테이블을 점진적으로 채우는 것이 더 효율적입니다. id가 기본 키라고 가정하면 모든 데이터를 새 테이블에 복사 할 때까지이 쿼리를 반복적으로 실행하십시오 (매번 더 큰 x 및 y 값 사용).

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;

그렇게 한 후에는 원본 테이블이 남습니다.이 작업을 완료하면 삭제할 수 있고 새 테이블이 채워집니다. 불일치 한 데이터 사본을 얻지 않도록 필요한 경우 원래 테이블을 잠그십시오!


2

ALTER TABLE 문은 기본적으로 동일한 작업을 수행합니다. 서버는 모든 행을 복사 한 다음 RENAME을 수행하는 임시 테이블을 작성합니다. 온 디스크 형식은 InnoDB와 MyISAM간에 매우 다르므로 이에 대한 바로 가기를 찾을 수는 없습니다.

또 다른주의 사항 (알고 있지만 다른 사람들이이 내용을 읽는 데 도움이 될 수 있음) : InnoDB의 온 디스크 형식은 기본 키를 기반으로 레코드를 클러스터하기 때문에 기본 키에 크게 의존합니다. 따라서 큰 InnoDB 테이블로 작업 할 때는 기본 키를 선택하기 전에 두 번 생각하십시오. 키를 변경하면 당면한 문제와 마찬가지로 전체 테이블이 재 구축되기 때문입니다.

어쨌든, 적당한 크기의 테이블에서 몇 가지 테스트를 먼저 수행하고 시간을 정하는 것이 좋습니다.


2
MySQL의 테이블 변경 작업 (및 인덱스 추가 포함)은 테이블을 다시 작성합니다.
David Pashley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.