pt-online-schema-change

Posted on 2021-07-21 15:08  -=-  阅读(117)  评论(0)    收藏  举报

原理

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选项。

安全

有诸多措施来保障安全使用该工具:

  1. 只有指定了–execute才会真正执行
  2. 如果工具检测到服务器选项中有任何复制相关的筛选,如指定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);