프로덕션에서 INT에서 BIGINT로 ALTER 기본 키 열 (MySQL 5.6.19a)


20

프로덕션 데이터베이스의 일부 INNODB 테이블이 INT AUTO_INCREMENT 한계 인 2147483647에 도달하려고하며이를 BIGINT로 변경해야합니다. 그렇지 않으면 쓰기가 실패하기 시작합니다.

테이블은 Amazon RDS에서 실행되는 프로덕션 MySQL 5.6.19a 데이터베이스에 있습니다.

항상 발생하는 생산 읽기 및 삽입을 방해하지 않으면 서 어떻게 이런 식으로 ALTER를 수행 할 수 있습니까?

ALTER TABLE MYTABLECHANGE id idBIGINT NOT NULL AUTO_INCREMENT;

다음은 테이블에 대한 DDL입니다.

CREATE TABLE `MYTABLE` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `siteId` int(11) NOT NULL,
  `filter` varchar(10) NOT NULL DEFAULT 'ALL',
  `date` varchar(10) NOT NULL,
  `cards` varchar(250) NOT NULL,
  `apples` varchar(45) NOT NULL,
  `carrots` varchar(45) NOT NULL,
  `corn` varchar(45) NOT NULL,
  `peas` varchar(45) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique` (`siteId`,`filter`,`date`,`cards`),
  KEY `date_k` (`date`),
  KEY `cards_k` (`cards`),
  KEY `apples_k` (`apples`),
  KEY `siteId_k` (`siteId`)
) ENGINE=InnoDB AUTO_INCREMENT=1748961482 DEFAULT CHARSET=utf8

답변:


22

공간이 충분하면 실제 테이블의 사본을 작성하고 해당 작업을 수행 할 수 있습니다.

CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl;

그런 다음 원하는대로 열을 변경할 수 있습니다.

ALTER TABLE tbl_name MODIFY COLUMN col_name BIGINT AUTO_INCREMENT;

프로세스가 완료되면 테이블 이름을 바꿀 수 있습니다.

RENAME TABLE tbl_name TO new_tbl_name, tbl_name2 TO new_tbl_name2;

그런 다음 원래 테이블을 삭제하면 지정된 결과가 나타납니다.


복사하는 동안 테이블에 대한 쓰기 (모든 배치 모드)를 해제 할 수 있었기 때문에이 방법을 사용했습니다. 약 36 시간 걸렸다.
Mark Hansen

이 세 가지를 하나의 트랜잭션으로 유지하려고합니다. (잠금 / 잠금 해제)
투입 Sławomir Lenart

4

percona 툴킷은 최소한 시간이 부족하지 않은 경우 갈 수있는 방법입니다. 24 시간 이상 조금 테스트했을 때 우리의 테이블 (500Gb, 마스터-슬레이브 설정)에 대한 변환이 이루어졌으며, 프로덕션에서는 거의 1 개월이 걸렸습니다 (더 나은 하드웨어로). 따라서 우리는 이미 오프라인 백업 작업, 슬레이브 제거 등의 계획 B와 C를 계획하기 시작했습니다. 지연은 주로 슬레이브를 향한 복제 대기로 인한 것입니다 (최대 50 초의 시간 지연 허용). 또한 동시 스레드 수를 제한하십시오. 하루 2 백만 건 이상의 삽입물과 수백만 건의 판독 값이 있습니다.

또한 일단 커버리지가 시작되면 중지 할 수 없습니다 (또는 적어도 다시 시작할 방법을 찾지 못했습니다) :-(


1

잘....

KEY TOP_QUERIES_LAST_30DAYS_fk (siteId) PRIMARY KEY와 중복되므로, DROP 할 수도 있습니다.

INT UNSIGNED는 40 억에이를 것입니다.

변경하는 것이 좋습니다 filterENUM.

17 억 7 천만 행이 있습니까? 아니면 많은 ID를 "굽습니다"? 그렇다면 해결할 수 있습니까? 예를 들어 REPLACE, 특정 맛의 INSERT유언은 ID를 던집니다. INSERT...ON DUPLICATE KEY대체 할 수 있습니다 REPLACE. 2 단계 프로세스는 INSERT IGNOREID의 타는 것을 피할 수 있습니다 .

질문으로 돌아 가기 ...

pt-online-schema-change가 트릭을 수행하는지 확인하십시오 : http://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html


퍼 코나를 Amazon RDS와 함께 사용할 수 있습니까? 예, 우리는 많은 ID를 "불태 웠습니다."테이블에는 실제로 약 3 억 3 천만 개의 행이 있습니다.
Mark Hansen

나는 pt & RDS에 대해 모른다. 화상을 제거 할 수 있다면 공간이 부족하기 전에 다른 ~ 330M의 ID가 있습니다.
Rick James
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.