简介
pt-online-schema-change在不锁表的情况下,修改表结构.该工具执行的基本流程如下:
1.判断各种参数;
2.根据原表t,创建一个名称为_t_new的新表;
3.执行ALTER TABLE语句修改新表_t_new;
4.创建3个触发器,名称格式为pt_osc_库名_表名_操作类型,
5.开始复制数据;
6.复制完成后,交互原表和新表,执行RENAME命令;
7.删除老表,_t_old;
8.删除触发器;
9.修改完成;
主要参数
--user 连接MySQL的用户
--password 连接MySQL用户的密码
--host MySQL服务器地址
--port MySQL端口
--later 改表的命令
--database 需要修改的表所在的数据库
--table 需要修改的表
--print 输出执行过程,与quiet对应
所以,改表的命令一般为:
pt-online-schema-change --user=root --password=root --host=127.0.0.1 --port=3306 --alter "add index idx_name(column)" --database=my_database,--table=my_table --print --execute
特殊参数
修改含有外键的表,使用--alter-foreign-keys-method=s,改参数有四种取值:
1.auto,在rebuild_constraints和drop_swap两种处理方式中选择一个;
2.rebuild_constraints, 使用 ALTER TABLE语句先删除外键约束,然后再添加.如果子表很大的话,会导致长时间的阻塞;
3.drop_swap, 执行FOREIGN_KEY_CHECKS=0,禁止外键约束,删除原表,再重命名新表。这种方式很快,也不会产生阻塞,但是有风险:
在删除原表和重命名新表的短时间内,表是不存在的,程序会返回错误;
如果重命名表出现错误,也不能回滚了.因为原表已经被删除;
4.none, 类似drop_swap的处理方式,但是它不删除原表,并且外键关系会随着重命名转到老表上。
控制复制延时,使用--check-slave-lag参数,指定一个从库的DSN连接地址,如果从库超过--max-lag参数设置的值,就会暂停操作。
服务器负载过高,使用--max-load和--critical-load参数控制,不同的是,--max-load会暂停copy数据,而--critical-load则会中断改表进程。
暂停与恢复
centos系统,在业务高峰期或者系统负载高时,可采取进程挂起的方式暂停改表进程。待恢复后,继续改表。
暂停:ps -ef | grep 'pt-online-schema-change' | grep -v grep | awk '{print $2}' | xargs kill -stop
恢复:ps -ef | grep 'pt-online-schema-change' | grep -v grep | awk '{print $2}' | xargs kill -cont