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 修改主键(假设原主键是复合主键)
会涉及以下修改动作

  1. 删除复合主键
  2. 添加新的自增主键
  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的大小

ps:
threads_running代表非sleeping状态的线程数量。
threads_running增长的原因:
1 客户端连接暴增
2 系统性能瓶颈,cpu io 内存 swap
3 异常sql

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值