오랜 기간 사업을 운영해오던 중 원래의 기본키 설정이 무리하다는 것을 알게 되었는데, 이때 기본키를 변경하고 싶었습니다. 실제 생산에서는 이러한 수요가 여전히 상당히 크다.
아래에서는 pt-online-schema-change가 이러한 유형의 문제를 어떻게 해결하는지 살펴보겠습니다.
먼저 테스트 테이블을 생성합니다
테이블 t2(c1 int 기본 키, c2 int) 생성;
구성 테스트 데이터
delimiter // create procedure p1() begin declare v1 int default 1; set autocommit=0; while v1 <=100000 do insert into test.t2(c1,c2) values(v1,v1+100); set v1=v1+1; if v1%1000 =0 then commit; end if; end while; end // delimiter ; call p1;
다음으로 pt-online-schema-change를 사용하여 t2 테이블의 기본 키를 변경합니다
1. c1 열에 고유 키를 추가합니다
# pt-online-schema-change --execute --alter "modify c1 int Unique key" --print D=test,t=t2
이때, 테이블 구조는 t2 테이블은 다음과 같습니다.
mysql> show create table t2\G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL DEFAULT '0', `c2` int(11) DEFAULT NULL, PRIMARY KEY (`c1`), UNIQUE KEY `c1` (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 row in set (0.03 sec)
2. c1 열의 기본 키를 삭제합니다
# pt-online-schema-change --execute --alter "drop Primary key" - -no-check-alter - -print D=test,t=t2
참고: 기본 키를 삭제하려면 --no-check-alter 옵션
을 추가해야 합니다. 이번에는 t2의 테이블 구조는 다음과 같습니다.
mysql> show create table t2\G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL DEFAULT '0', `c2` int(11) DEFAULT NULL, UNIQUE KEY `c1` (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 row in set (0.05 sec)
3. c2 열에 기본 키를 추가합니다
# pt-online-schema-change --execute --alter "modify c2 int Primary key" --print D=test,t=t2
이때 t2의 테이블 구조는 다음과 같습니다.
mysql> show create table t2\G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL DEFAULT '0', `c2` int(11) NOT NULL, PRIMARY KEY (`c2`), UNIQUE KEY `c1` (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 row in set (0.02 sec)
4. c1열의 키
# pt-online-schema-change --execute - -alter "drop key c1" --print D=test,t=t2
이때, t2의 기본 키 변경이 완료되었습니다
mysql> show create table t2\G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL DEFAULT '0', `c2` int(11) NOT NULL, PRIMARY KEY (`c2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 row in set (0.02 sec)