程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 如何利用pt-online-schema-change進行MySQL表的主鍵變更,ptonlinechangeschema

如何利用pt-online-schema-change進行MySQL表的主鍵變更,ptonlinechangeschema

編輯:MySQL綜合教程

如何利用pt-online-schema-change進行MySQL表的主鍵變更,ptonlinechangeschema


業務運行一段時間,發現原來的主鍵設置並不合理,這個時候,想變更主鍵。這種需求在實際生產中還是蠻多的。

下面,看看pt-online-schema-change解決這類問題的處理方式。

 

首先,創建一張測試表

create table t2(c1 int primary key, 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列加上unique key

# 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
1 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
1 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
1 row in set (0.02 sec)

 

4. 刪除c1列上的unique key

# 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
1 row in set (0.02 sec)

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved