原理
pt-online-schema-change模拟了MySQL内部alter table的方式,但是其操作所更新的是复制表,所以原表不会被锁住。
pt-online-schema-change --user=root --password=数据库密码--host=localhost P=3306,D=库名,t=表名--no-check-replication-filters --recursion-method=none --charset=utf8 --no-version-check --execute --alter "ADD COLUMN Test char(5) DEFAULT NULL AFTER 字段名"
步骤1,创建空表,其命名规则是_+原表名+_new
步骤2,根据语句更新新表结构
步骤3,在原表上创建触发器,以便后续原表上的操作同步到新表
步骤4,拷贝原表数据到新表,数据量大时会根据主键进行分段chunk插入
步骤5,拷贝完成后,移走原表,用新表代替(RENAME TABLE)。其通过一个RENAME TABLE同时处理两个表,实现原子操作。
#如果更新的表是被子表外键引用的父表,那么需要相应的更新子表的外键指向。具体见下文”外键的影响”。
#最后清除临时生成的表、触发器。默认情况下会删除原表(此时是已经重命名过的_user_old)。
注:如果原表上已经有触发器,那么将无法使用本工具!
性能
数据的拷贝是基于小块(根据chunk-time参数指定)进行的,而且根据主键或者索引进行选择,所以对整体服务器性能影响较小。
相关选项:
- –chunk-time 默认0.5。根据每秒拷贝的记录数,动态调整每次chunk size,以便压力变化时能够开始适应,使得每次拷贝消耗这里的指定长时间。
而且,如果检测到服务器压力大,则会暂停或者退出,详见–max-load和–critical-load选项。
安全
有诸多措施来保障安全使用该工具:
- 只有指定了–execute才会真正执行
- 如果工具检测到服务器选项中有任何复制相关的筛选,如指定binlog_ignore_db和replicate_do_db
部分参数
--user= 连接mysql的用户名
--password= 连接mysql的密码
--host= 连接mysql的地址
P=3306 连接mysql的端口号
D= 连接mysql的库名
t= 连接mysql的表名
--alter 修改表结构的语句
--execute 执行修改表结构
--charset=utf8 使用utf8编码,避免中文乱码
--no-version-check 不检查版本,在阿里云服务器中一般加入此参数,否则会报错
pt-online-schema-change工具还有很多其他的参数,可以有很多限制,比如限制CPU、线程数量、从库状态等等
例如:
添加表字段 如添加表字段SQL语句为:
ALTER TABLE `tb_test` ADD COLUMN `column1` tinyint(4) DEFAULT NULL;
修改表字段 SQL语句:
ALTER TABLE `tb_test` MODIFY COLUMN `num` int(11) unsigned NOT NULL DEFAULT '0';
修改表字段名 SQL语句:
ALTER TABLE `tb_test` CHANGE COLUMN age adress varchar(30);
添加索引 SQL语句:
ALTER TABLE `tb_test` ADD INDEX idx_address(address);
浙公网安备 33010602011771号