一、使用限制
哪些ddl是不可以做的,做了容易出错:
- 禁止创建唯一索引,会丢失数据,更加不允许添加 --alter-check=no,--check-unique-key-change=no
- 如果原表没有主键,或者也没有唯一索引,这些表是不允许用pt做DDL的
- 禁止对外键的表进行pt ddl
- 禁止对表进行重命名
- 禁止对列进行重命名,如果一定要做,也必须先print出来检测清楚列名是否正确
- 新增字段,NOT NULL必须要指定默认值
- 不允许删除主键 由于pt触发器原理,rowcopy会产业一堆的binlog,所以做之前要检测binlog空间是否够用,也要检测数据空间多一倍表空间是否够用 禁止在业务高峰期进行pt-online-schema-change操作 原表不能有触发器 MySQL最好设置为innodb_autoinc_lock_mode=2,否则在高并发的写入情况下,很容易产生所等待以及死锁 master的表结构必须跟slave的表结构一致,不允许异构,否则pt-online-schema-change的原理就是会rename,然后slave不一致的表结构会被master覆盖,谨记 8.操作时,操作的表必须有主键或则唯一索引。必要要在业务低峰期
注意事项: 1.如果异常终止pt-online-schema-change程序,新表上的触发器不会自动删除,如果要删除新表,那么必须要先删除触发器,然后再删除新表,否则向老表插入数据会因为找不到新表而报错,导致老表写入数据失败
2.在添加有中文备注的列时记得要指定字符集 --charset=utf8 ;如果没有指定字符集--charset=utf8 会导致表所有的表结构注释乱码 在改完变后查看表结构注释乱码,这个可直接使用客户端软件修改回去,修改注释不影响什么
3.如果在误在从库上执行了pt-online-schema-change操作,未执行完成不要取消,等到执行完成了,在修改成原来的状态。 4.如果在误在从库上执行了pt-online-schema-change操作,未执行完成取消的话,删除有 pt-online-schema-change在从库上创建的临时表和触发器即可
二、具体使用实例
必须在master库上执行下面的命令
2.1给表删除索引:
time pt-online-schema-change --user=root --password='lzlzl89723' --port=3306 --host=localhost --charset=utf8 --check-interval=5 --chunk-size=1000 --chunk-size-limit=4 --chunk-time=1 --nocheck-replication-filters --critical-load=threads_connected:500,threads_running:200 --max-load=threads_connected:300,threads_running:150 --max-lag=4 --alter "DROP key index_experienceId" D=appdb,t=hf_ad_experience_detail --print --execute
2.2给表hf_ad_experience_detail添加索引:
time pt-online-schema-change --user=root --password='lzlzl89723' --port=3306 --host=localhost --charset=utf8 --check-interval=5 --chunk-size=1000 --chunk-size-limit=4 --chunk-time=1 --nocheck-replication-filters --critical-load=threads_connected:500,threads_running:200 --max-load=threads_connected:300,threads_running:150 --max-lag=4 --alter "ADD INDEX index_experienceId (experienceId)" D=appdb,t=hf_ad_experience_detail --print --execute
2.3给表hf_user 添加索引报错:
[root@localhost ~]# time pt-online-schema-change --user=root --password='lzlzldleler' --port=3306 --host=localhost --charset=utf8 --check-interval=5 --chunk-size=1000 --chunk-size-limit=4 --chunk-time=1 --nocheck-replication-filters --critical-load threads_connected:500,threads_running:200 --max-load threads_connected:300,threads_running:150 --alter "ADD INDEX index_phone(phone)" D=appDB,t=hf_user --print --execute
Cannot connect to MySQL: DBI connect('appDB;host=localhost;port=3306;charset=utf8;mysql_read_default_group=client','root',...) failed: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) at /usr/local/percona-toolkit/bin/pt-online-schema-change line 2345.
real 0m0.246s
user 0m0.201s
sys 0m0.032s
报错,当主机名为localhost时,pt-online-schema-change链接数据库 默认是找socket /var/lib/mysql/mysql.sock 文件来登录数据库, 然而本机的mysql的socket文件是/tmp/mysql.sock,导致pt-online-schema-change通过localhost主机名链接数据库失败。 于是授权127.0.0.1 作为登录mysql的账户:
grant all on *.* to root@'127.0.0.1' identified by 'lzlzldleler';flush privileges;
成功解决上诉报错。
2.3表hf_user_action 创建联合索引:
** 表hf_user_action 字段 userId, dataType, opeUser 创建联合索引:** 当前此表记录数为: 4408200 创建此联合索引用时:2分18s搞定
time pt-online-schema-change --user=root --password='lzlzldleler‘ --port=3306 --host=127.0.0.1 --charset=utf8 --check-interval=5 --chunk-size=1000 --chunk-size-limit=4 --chunk-time=1 --nocheck-replication-filters --critical-load threads_connected:500,threads_running:200 --max-load threads_connected:300,threads_running:150 --alter "ADD INDEX index_userId_dataType_opeUser(userId,dataType,opeUser)" D=appDB,t=hf_user_action --print --execute
2.4添加字段
time pt-online-schema-change --user=root --password='lzlzldleler' --port=3306 --host=localhost --charset=utf8 --check-interval=5 --chunk-size=1000 --chunk-size-limit=4 --chunk-time=1 --nocheck-replication-filters --critical-load=threads_connected:500,threads_running:200 --max-load=threads_connected:300,threads_running:150 --max-lag=4 --alter='add column vip int' D=appDB,t=lz_ad_experience_detail --print --execute
2.5删除字段
time pt-online-schema-change --user=root --password='lzlzldleler' --port=3306 --host=localhost --charset=utf8 --check-interval=5 --chunk-size=1000 --chunk-size-limit=4 --chunk-time=1 --nocheck-replication-filters --critical-load=threads_connected:500,threads_running:200 --max-load=threads_connected:300,threads_running:150 --max-lag=4 --alter='drop column vip int' D=appDB,t=lz_ad_experience_detail --print --execute
2.6修改字段
time pt-online-schema-change --user=root --password='lzlzldleler' --port=3306 --host=localhost --charset=utf8 --check-interval=5 --chunk-size=1000 --chunk-size-limit=4 --chunk-time=1 --nocheck-replication-filters --critical-load=threads_connected:500,threads_running:200 --max-load=threads_connected:300,threads_running:150 --max-lag=4 --alter='modify column sid bigint(25)' D=appDB,t=lz_ad_experience_detail --print --execute
2.7添加字段
time pt-online-schema-change --user=pt_tools --password='NITOcsFLV' --port=3306 --host=目标库IP地址 --charset=utf8 --check-interval=5 --chunk-size=1000 --chunk-size-limit=4 --chunk-time=1 --nocheck-replication-filters --critical-load=threads_connected:500,threads_running:200 --max-load=threads_connected:300,threads_running:150 --max-lag=4 --alter="ADD gray_phone tinyint(4) NOT NULL DEFAULT 0 COMMENT '号码是否都为灰色1:是;0:否'" D=db_crm,t=t_customer_ext --print --execute
2.8修改字段长度
time pt-online-schema-change --user=pt_tools --password='NITsFLV' --port=3306 --host=目标库IP地址 --charset=utf8 --check-interval=5 --chunk-size=1000 --chunk-size-limit=4 --chunk-time=1 --nocheck-replication-filters --critical-load=threads_connected:500,threads_running:200 --max-load=threads_connected:300,threads_running:150 --max-lag=4 --alter "modify from_order_id varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '原订单号'" D=db_mall_bill_test01,t=b_bill_allocate --print --execute --no-check-alter
2.9 pt-osc不支持在线change column
当然线上也是禁止对表字段进行change的
生产命令:
pt-online-schema-change \
--user=pt_tools --password='pt_tools321abc' --port=3306 --host=172.16.0.246 --charset=utf8 \
--alter "change column user_class test_class char(20) NOT NULL DEFAULT '' COMMENT '班级'" \
--check-alter \
--check-interval=5 \
--nocheck-replication-filters \
--chunk-size=2000 \
--chunk-size-limit=4 \
--chunk-time=1 \
--critical-load=threads_connected:4000,threads_running:300 \
--max-load=threads_connected:2500,threads_running:200 \
--max-lag=3 \
--recursion-method=none \
D=test001,t=s_income_unconfirmed_profit_amortization_bill_211101 \
--print --execute
执行报错如下:
[root@archery ~]# pt-online-schema-change --user=pt_tools --password='pt_tools321abc' --port=3306 --host=172.16.0.246 --charset=utf8 --alter "change column user_class test_class char(20) NOT NULL DEFAULT '' COMMENT '班级'" --check-alter --check-interval=5 --nocheck-replication-filters --chunk-size=2000 --chunk-size-limit=4 --chunk-time=1 --critical-load=threads_connected:4000,threads_running:300 --max-load=threads_connected:2500,threads_running:200 --max-lag=3 --recursion-method=none D=test001,t=s_income_unconfirmed_profit_amortization_bill_211101 --print --execute
No slaves found. See --recursion-method if host tidb05 has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, 10, 1
copy_rows, 10, 0.25
create_triggers, 10, 1
drop_triggers, 10, 1
swap_tables, 10, 1
update_foreign_keys, 10, 1
Altering `test001`.`s_income_unconfirmed_profit_amortization_bill_211101`...
--alter appears to rename these columns:
user_class to test_class
The tool should handle this correctly, but you should test it first because if it fails the renamed columns' data will be lost! Specify --no-check-alter to disable this check and perform the --alter.
`test001`.`s_income_unconfirmed_profit_amortization_bill_211101` was not altered.
--check-alter failed.
8.html