pt-online-schema-change进行MySQL表的主键变更
程序员文章站
2022-04-14 19:24:46
...
业务运行一段时间,发现原来的主键设置并不合理,这个时候,想变更主键。这种需求在实际生产中还是蛮多的。
下面,看看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下面,开始使用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 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列上的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 row in set (0.02 sec)
上一篇: php写日志超过多少分文件合适
推荐阅读
-
MySQL表结构变更你不可不知的Metadata Lock详解
-
用Mysql进行emp、dept、salgrade表的相关查询操作
-
mysql快速获得库中无主键的表实例代码
-
Python MySQL进行数据库表变更和查询
-
MySQL表结构变更,不可不知的Metadata Lock
-
mysql开发中如何进行行列转换?使用序列化表的方法实现行转列
-
mysql必会知识之两个表以两个表中都存在的关系字段进行联结、两个表不以关系字段进行联结
-
MySQL对数据表已有表进行分区表的实现
-
【MYSQL笔记2】复制表,在已有表的基础上设置主键,insert和replace
-
MySQL表结构变更你不可不知的Metadata Lock详解