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…