600GB 테이블 인덱스 키 데이터 유형을 INT에서 BIGINT로 변경하는 가장 빠른 방법


13

600GB MySQL 테이블에서 데이터 유형을 INT에서 BIGINT로 변경해야합니다. 이 열에는 고유 한 인덱스가 있습니다. 나는 서명되지 않은 INT를 사용하는 것이 좋지만 BIGINT로 변경하면 거의 같은 고통이 될 것이라고 가정합니다. 테이블 엔진은 InnoDB입니다. 더 쉬운 것 :

  1. 테이블 변경
  2. 복사 구조 INSERT INTO (SELECT *)
  3. 덤프 테이블 및 덤프 파일 테이블 정의 변경
  4. 다른 거있어?

업데이트 : 요청에 따라 MySQL ver 5.5.15, 외래 키 및 테이블 생성 :

 CREATE TABLE `tbl` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `user_id` int(11) NOT NULL,
    `created_at` datetime NOT NULL,
    `tid` bigint(20) NOT NULL,
    `t` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `f` tinyint(1) NOT NULL,
    `i_id` bigint(20) NOT NULL,
    `ir_id` int(11) NOT NULL,
    `r_c` int(11) NOT NULL,
    `r` tinyint(1) NOT NULL,
    `e` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `t` varchar(5) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `user` (`user_id`,`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=1657146169 DEFAULT CHARSET=utf8

고통을 정의하고, 가장 짧은 시간을 걸리십시오 ....? 가장 빠른 결과?

@AlecTeal 최단 시간 소요
Noam

질문에 대답하지 않고 테이블이 커지기 전에이 질문에 대해 자세히 논의했지만이 테이블의 크기를 줄이는 방법을 찾고 싶습니다.

1
어떤 버전의 MySQL입니까? 일부 버전에는 중요 ALTER TABLE ONLINE합니다. 이 열을 참조하는 외래 키가 있습니까? SHOW CREATE TABLE tablename;출력 을 보여 주면 도움이 될 것 입니다.
ypercubeᵀᴹ

2
짧은 필드 이름이 테이블 크기를 줄이는 데 도움이되면 600MB가 됩니다.
모든 거래의 존

답변:


2

테이블에 트리거가 없다고 가정하면 pt-online-schema-change테이블을 잠그지 않고 테이블을 변경할 수 있으므로 사용을 고려해야 합니다.

테이블 크기에 따라 여전히 상당한 시간이 걸립니다.

또한이 방법을 사용하거나 사용 ALTER TABLE하는 경우 테이블을 다시 작성하는 동안 테이블의 두 복사본을 지원하기 위해 600GB의 추가 디스크 공간이 있어야합니다.


예상 시간이 있습니까? (나는 그것이 많은 요소에 달려 있다는 것을 알고 있지만, 추측해야한다면, 범위는 무엇입니까?)
Noam

@Noam 당신은 테이블을 복사 할 필요가 없습니다. Alter 테이블을 사용하는 경우 WORST CASE는 복사하는 것입니다. 성숙한 엔진을 사용하는 경우 이전 (파일의 일부 위치 또는 일부 레코드)에서 int를 사용하고 포스트는 bigint를 사용한다는 것을 알기 위해 당신은 최적화합니다.

@AlecTeal 그것에 대한 공식적인 언급이 있습니까?
Noam

@ Noam 내 대답을 참조하십시오.

1
@Noam ALTER TABLE실행하는 데 24-96 시간이 걸릴 것으로 예상 됩니다. 테스트 환경에서 ALTER TABLE을 실행하면 더 나은 추정치를 얻을 수 있습니다.
Ike Walker

2

percona 툴킷 pt-online-schema-change을 사용하는 것은 사용에 영향을 미치지 않으면 서 프로덕션 환경에서 선택하는 것입니다. 델타와이를 수행 한 후에 이름이 바뀌는 임시 테이블을 얻는 트리거가 추가됩니다.

예:

pt-online-schema-change --alter "CHANGE `id` `id` BIGINT  NOT NULL; " D=DB,t=TABLE

pt는가는 길입니다. @Noam FYI : EC2 인스턴스에서 행 수가 많은 ~ 270GB 테이블에서 INT-> BIGINT 마이그레이션시이 테이블에 대한 쓰기 작업이 많으면 pt-online-schema-change를 사용하여 64 시간이 걸렸습니다.
Jakub Głazik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.