pt-osc工具
pt-osc(pt-online-schema-change的缩写)用于对mysql不锁表的ALTER TABLE操作
官方解释简洁易懂1pt-online-schema-change - ALTER tables without locking them.
由于最近踩了坑,我们需要精细的看下osc提供的参数
规范
参数
选项 | 描述 | 说明 |
---|---|---|
操作必选 | ||
--host -h | ||
--password -p | 登录mysql的密码 | |
--port -P | mysql端口 | |
--charset | 连接后的字符集 | |
--database | 连接的数据库 | |
--alter | 多语句使用逗号分隔 | |
--check-alter | 检测alter语句语法 | |
标准输出 | ||
--dry-run | 创建new表 不创建触发器 不拷贝数据 不替换新老表 |
试运行 |
--execute | 必须指定下面的选项,否则只做检查,然后退出 [官方友情提示: 在没有认真阅读文档的情况下,不要指定这些选项] |
实际执行alter操作 |
安全配置 | ||
--lock-wait-timeout | ||
--chunk-time | ||
–check-interval | 修改间隔 | |
--max-lag | 每次拷贝数据后观察主从同步延迟是否大于给定值 | 会暂停 |
--max-load | 会暂停 | |
--progress | 按指定间隔标准错误输出 [默认time:30 -- 30秒打印一次] |
支持3种方式 percentage:percentage time:seconds iterations:number |
–recurse | ||
--critical-load | 每次chunk后检查mysql当前状态 Threads_connected=x,Threads_running=x |
会终止 |
--chunk-size | 控制每次数据拷贝块所查询的行数大小 可以使用K,M,G单位 [默认1000] 受--chunk-time和--chunk-size-limit影响 |
会终止 |
--chunk-size-limit | --chunk-size的倍数 | |
--chunk-time | 以这个时间为单位获取本次数据拷贝的量, 动态调整下一次数据拷贝的量 [默认0.5秒] |
0的情况下,需要通过 --chunk-size --chunk-size-limit 控制数据拷贝量 |
3个chunk相关的参数 | ||
--[no]drop-new-table | [默认自动删除] | |
--[no]drop-old-table | [默认自动删除] 运行中有报错,需要手动删除 |
操作前评估表大小 大表需要手动删除 |
日志相关 | ||
--progress | 打印标准错误输出 | |
--statistics | 打印各事件统计信息 | |
额外配置 | ||
--alter-foreign-keys-method | 有外键(开发规范尽量禁止使用外键) | 该选项下--[no]drop-new-table不工作,因此不清除新表 如果同时使用了--force,在alter-foreign-keys-method = none |
--config | 以逗号分隔存储于配置文件,使用时第一选项必须是此选项 自动化的同学可以考虑这个 |
|
–defaults-file | mysql的相关选项,需要指定配置文件的绝对路径 | |
注意事项 | ||
--[no]check-replication-filters | 确保从库没有配置 binlog_ignore_db replicate_do_db 否则运行终止 [默认检查] |
|
--default-engine | 创建新表时采用mysql的默认引擎 [默认创建新表时同老表引擎保持一致] |
危险,不建议使用 会引起主从表引擎不一致的情况 从库创建新表时会采用mysql的默认引擎 |
--null-to-not-null | [表结构优化类选项] 会将NULL的列更改为NOT NULL,对于没有明确指定默认值的,MySQL会根据字段类型提供默认值 比如数值是0,字符串是’’ |
字符串的默认值还好,对于数值的页面可能会显示不想看到的0 |
操作顺序
试运行 --dry-run
|
|
实际执行 --execute
|
|
参数 | 说明 |
---|---|
{username} | 用户名 |
{paswword} | 密码 |
{port} | 端口 |
{database} | 数据库名称 |
{table} | 表名称 |
{ddl} | ALTER TABLE后面的DDL语句 例如:ADD column; MODIFY column; |
以上每个步骤分别独立运行,不可放到一句中运行
小技巧
工具依赖主键和唯一索引,如果要删除主键/重建主键
|
|
DBA的福音
|
|
DBA可以通过某一次ALTER TABLE需要,借机对表结构进行优化
这里有个前提:
首先,公司的DDL上线规范,是否允许DBA发起这样的优化修改
其次,DBA需要提前向开发同学说明,字段DEFAULT VALUE是由MySQL根据字段类型自己提供的,那么对业务程序的处理和页面显示的影响,需要开发同学进行评估。所以,如果默认值不能满足业务,该选项不适用
总结,一切以业务为导向
原则:字段约束的规范化应该尽可能的在字段创建阶段完成
to be continued…