>  기사  >  데이터 베이스  >  pt-online-schema-change는 MySQL 테이블의 기본 키를 변경합니다.

pt-online-schema-change는 MySQL 테이블의 기본 키를 변경합니다.

高洛峰
高洛峰원래의
2016-10-29 10:53:231892검색

오랜 기간 사업을 운영해오던 중 원래의 기본키 설정이 무리하다는 것을 알게 되었는데, 이때 기본키를 변경하고 싶었습니다. 실제 생산에서는 이러한 수요가 여전히 상당히 크다.

아래에서는 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 &#39;0&#39;,
  `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 &#39;0&#39;,
  `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 &#39;0&#39;,
  `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 &#39;0&#39;,
  `c2` int(11) NOT NULL,
  PRIMARY KEY (`c2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
row in set (0.02 sec)


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.