mysql5.6以后的版本,小表直接操作表结构变更即可,如果是大表,那么就避免直接操作,就要使用pt-online-schema-change
工作原理:
原理跟oracle的在线冲定义类似,创建一个和你要执行alter操作的表一样的空表结构,执行表结构修改,然后从原表中copy原始数据到表结构修改后的表,当数据copy完成以后就会将原表移走,
用新表代替原表,默认动作是将原表drop掉。在copy数据的过程中,任何在原表的更新操作都会更新到新表,因为这个工具在会在原表上创建触发器,
触发器会将在原表上更新的内容更新到新表。如果表中已经定义了触发器这个工具就不能工作了。
注意点:
1、操作的表必须有主键或唯一索引否则报错。
2、如果表有外键,除非使用 --alter-foreign-keys-method 指定特定的值,否则工具不予执行。
3、当业务量较大时,修改操作会等待没有数据修改后,执行最后的rename操作。因此,在修改表结构时,应该尽量选择在业务相对空闲时,至少修改表上的数据操作较低时,执行较为妥当。
4、由于可能存在一定的风险,在操作之前,建议对数据表进行备份,可以使得操作更安全、可靠。
5、当是主从环境,不在乎从的延迟,则需要加--recursion-method=none参数。当需要尽可能的对服务产生小的影响,则需要加上--max-load参数。
-- 添加列
[root@centos7 pscripts]# pt-online-schema-change -uroot -p123456 --alter='add column dt datetime' --execute D=test1,t=t1
-- 修改列类型
[root@centos7 pscripts]# pt-online-schema-change -uroot -p123456 --alter='modify column dt date' --execute D=test1,t=t1
-- 修改列名 谨慎操作
[root@centos7 pscripts]# pt-online-schema-change -uroot -p123456 --alter='change column dt dt1 date' --execute D=test1,t=t1 --no-check-alter
-- 删除列
[root@centos7 pscripts]# pt-online-schema-change -uroot -p123456 --alter='drop column dt1 ' --execute D=test1,t=t1
-- 添加索引 show index from t1 \G;
[root@centos7 pscripts]# pt-online-schema-change -uroot -p123456 --alter='add key i_name(name) ' --execute D=test1,t=t1
-- 删除索引
[root@centos7 pscripts]# pt-online-schema-change -uroot -p123456 --alter='drop index i_name ' --execute D=test1,t=t1