MySQL Online DDL 详解
Online DDL 是 MySQL 5.6 及更高版本中引入的特性,它允许在不阻塞数据库读写操作的情况下执行表结构变更。
一、Online DDL 概述
Online DDL 特性使得以下操作成为可能:
在表结构变更期间,允许并发DML操作(SELECT, INSERT, UPDATE, DELETE)
减少应用停机时间
提高数据库可用性
二、Online DDL 支持的操作
支持 Online DDL 的操作
操作类型 | 是否支持OnlineDDL | 说明 |
---|---|---|
添加索引 | 支持 | 不影响DML操作 |
删除索引 | 支持 | 不影响DML操作 |
重命名列 | 支持 | MySQL 5.6+ |
修改列数据类型 | 部分支持 | 有限制条件 |
添加列 | 支持 | MySQL 5.6+ |
删除列 | 支持 | MySQL 5.6+ |
修改列默认值 | 支持 | 不影响DML操作 |
修改列NULL属性 | 支持 | 需要验证 |
不支持 Online DDL 的操作
修改主键
修改列顺序
修改表字符集
某些存储引擎特定的操作
三、Online DDL 实现方式
MySQL 提供了两种语法来执行 Online DDL:
四、ALGORITHM 选项
ALGORITHM=COPY
:传统方式,创建临时表并复制数据ALGORITHM=INPLACE
:尝试原地修改,不复制数据ALGORITHM=INSTANT
:MySQL 8.0+,立即完成某些操作
五、LOCK 选项
LOCK=NONE
:允许并发读写LOCK=SHARED
:允许读,阻塞写LOCK=EXCLUSIVE
:阻塞读写
六、Online DDL 最佳实践
测试环境验证:先在测试环境验证DDL操作的影响
低峰期执行:即使支持Online DDL,也建议在低峰期执行
监控性能:执行期间监控数据库性能
分批操作:对大表操作考虑分批进行
使用工具:考虑使用pt-online-schema-change等工具
七、Online DDL 限制
空间需求:某些操作仍需要额外的临时空间
性能影响:虽然不阻塞,但仍可能影响性能
外键约束:涉及外键的操作可能有额外限制
触发器:表上有触发器时可能有特殊行为
八、示例
添加索引(Online DDL)
添加列(Online DDL)
修改列类型(需要验证是否支持Online DDL)
九、检查操作是否支持Online DDL
十、MySQL 8.0 改进
MySQL 8.0 引入了 Instant DDL,对某些操作(如添加列)可以立即完成:
Online DDL 是MySQL数据库管理的重要特性,合理使用可以显著提高数据库的可用性和维护效率。
评论