pt-online-schema-change
限制条件
1 外键限制,配合使用–alter-foreign-keys-method参数
2 必须存在主键
3 表上不能存在after(增删改)三个触发器
alter-foreign-keys-method说明
两种方式(t1,t2有外键依赖于t1)
rebuild_constraints(优先 )
它先通过alter table t2 drop fk1, add _fk1重建外键,指向新表
再rename t1 t1_old,_t1_new t1 交换表名,不影响客户端
删除旧表t1_old
如果t2表太大,以致alter操作耗时过长,pt-osc有可能会强制选择另外一种方式drop_swap
drop_swap
禁用t2表外键约束检查,设置FOREIGN_KEY_CHECKS = 0
然后drop t1原表 rename _t1_new t1
这种方式速度快,也不阻塞请求,但是有风险。drop表的瞬间到rename过程,t1表是不存在,遇到请求会报错
pt-osc和online ddl对比
1 ddl在必须copy table时成本很高,不宜采用?
2 pt-osc存在触发器时,就用不了
3 修改index,foreign-key,column-name优先使用ddl,并指定ALGORITHM=INPLACE
示例
1 添加新列
pt-online-schema-change --user=user --password=xxx --host=ip --port=33066 --alter “add column col1 VARCHAR(64) NULL COMMENT ‘订单号’” D=sy,t=t1 --execute --charset=utf8 --nocheck-replication-filters --max-load=“Threads_running=20”
2 修改列类型
pt-online-schema-change --user=user --password=xxx --host=ip --port=3306 --alter “convert to character set utf8mb4 collate utf8mb4_bin” D=db1,t=t1 --execute --nocheck-replication-filters --charset=utf8 --max-load=“Threads_running=20”
3 添加删除索引
pt-online-schema-change --user=user --password=xxx --host=ip --port=3306 --alter “DROP KEY cid,add key idx_game_id(game_id)” D=db1,t=t1 --execute --charset=utf8 --nocheck-replication-filters --max-load=“Threads_running=20”
4 修改主键(假设原主键是复合主键)
会涉及以下修改动作
4.1删除复合主键
4.2添加新的自增主键
4.3原复合主键字段,修改成唯一索引
ps: 修改主键影响最大的就是delete触发器,新表t2上的主键字段在旧表t1上不存在,无法根据主键条件出发删除新表t2数据,如果表上相关列上没有索引或者没有主键,那么删除的代价非常高,所以在删除主键的同时一定添加复合索引
–alter “drop primary key, add column id auto_crement primary key,add unique key uk_pk_k(pk,k)”
5 重建表
pt-online-schema-change --user=user --password=xxx --host=ip --port=3306 --alter “engine=innodb” D=db1,t=t1 --execute --nocheck-replication-filters --charset=utf8 --max-load=“Threads_running=20” --max-lag=2s --chunk-time=1s
参数说明
execute :该参数用于执行alter操作,如果不加的话,只会做一些安全检查后退出。一定要确保知道如何使用该工具并有合适的备份后,再添加该参数。使用该参数时,除了对对象表所需的权限外,还需要SUPER, REPLICATION SLAVE两种权限。
nocheck-replication-filters:
max-lag:中断数据拷贝直到所有的复制延迟都少于这个值,默认为1S。每一个chunk拷贝完成后,OSC都会去show salve status通过Seconds_Behind_Master来确定所有的复制情况,任何相关的slave的复制延迟高于该值时,OSC就会停止数据拷贝–check-interval参数所指定的时间,然后重新发起检查,直到延迟降低到该值以下。
charset:
max-load:默认threads_running = 25, 每个chunk(chunk是啥)拷贝完,会检查show global status,检查指标是否超过了指定tr线程数的阀值,如果超过,数据拷贝暂停。
critical-load:默认threads_running = 50,每个chunk(chunk是啥)拷贝完,会检查show global status,检查指标是否超过了指定tr线程数的阀值,如果超过 终止pt进程
chunk-time:默认是0.5秒,工具会根据当前系统运行繁忙程度计算出在该指定时间内可以处理的数据行数(即chunks),(相比较chunk-size灵活)
chunk-size:指定chunk的大小
charset: 指定连接的字符集,远程操作记得加上,否则可能出现乱码 ,-- charset =utf8 或 D=db1,t=t1,A=utf8
ps:
threads_running代表非sleeping状态的线程数量。
threads_running增长的原因:
1 客户端连接暴增
2 系统性能瓶颈,cpu io 内存 swap
3 异常sql
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/807718/viewspace-2287211/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/807718/viewspace-2287211/