基础材料:
centos7.5 mysql 5.7.24
online DDL操作说明列表:
| 类型 | 操作 | 是否Inplace | 是否重建表 | 是否允许并发DML | 是否只修改元数据 | 备注 |
| index | 创建或添加二级索引 | 是 | 否 | 是 | 否 |
仅在完成访问表的所有事务完成后才结束 索引的初始状态反映了表的最新内容 |
| 删除索引 | 是 | 否 | 是 | 是 |
|
|
| 重命名索引 | 是 | 否 | 是 | 是 | ||
添加FULLTEXT索引 |
是* | 否* | 否 | 否 |
则添加第一个索引会重建表
|
|
添加SPATIAL索引 |
是* | 否* | 否 | 否 |
则添加第一个索引会重建表
|
|
| 更改索引类型 | 是 | 否 | 是 | 是 | ||
| primary key | 添加主键 | 是 | 是 | 是 | 否 | 对表进行重建,耗费IO |
| 删除主键 | 否 | 是 | 否 | 否 |
仅 对表进行重建,耗费IO 产生临时表时同样需要在原表路径生成表空间临时文件 |
|
| 同时删除主键并添加 | 是 | 是 | 是 | 否 |
对表进行重建,耗费IO |
|
| COLUMN | 添加列 | 是 | 是 | 是* | 否 |
添加自增 列时不允许并发DML,且mysql会自动设置LOCK=SHARED,用来替换默认的LOCK=DEFAULT 对表进行重建,耗费IO |
| 删除列 | 是 | 是 | 是 | 否 | 对表进行重建,耗费IO | |
| 重命名列 | 是 | 否 | 是 | 是 | ||
| 重新排序列 | 是 | 是 | 是 | 否 | 对表进行重建,耗费IO | |
| 设置/删除列默认值 | 是 | 否 | 是 | 是 | 仅修改表元数据。默认列值存储在 表的.frm文件中,而不是InnoDB 数据字典中。 |
|
| 更改列数据类型 | 否 | 是 | 否 | 否 |
仅 对表进行重建,耗费IO |
|
扩展VARCHAR列大小 |
是 | 否 | 是 | 是 |
将 如果改为大于255的值,则只能使用 |
|
| 更改自动增量值 | 是 | 否 | 是 | 否* | 修改存储在内存中的值,而不是数据文件。 | |
添加列NULL/NOT NULL |
是 | 是 | 是 | 否 | 对表进行重建,耗费IO | |
修改ENUM或SET列的定义 |
是 | 否 | 是 | 是 | ||
|
GENERATED COLUMN |
添加STORED列 |
否 | 是 | 否 | 否 | ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) STORED), ALGORITHM=COPY; |
修改STORED列顺序 |
否 | 是 | 否 | 否 | ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED FIRST, ALGORITHM=COPY; | |
删除STORED列 |
是 | 是 | 是 | 否 | ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INPLACE, LOCK=NONE; | |
添加VIRTUAL列 |
是 | 否 | 是 | 是 | ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL), ALGORITHM=INPLACE, LOCK=NONE; | |
修改VIRTUAL列顺序 |
否 | 是 | 否 | 否 | ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL FIRST, ALGORITHM=COPY; | |
删除VIRTUAL列 |
是 | 否 | 是 | 是 | ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INPLACE, LOCK=NONE; | |
| foreign key | 添加外键约束 | 是 | 否 | 是 | 是 | |
| 删除外键约束 | 是 | 否 | 是 | 是 | ||
| table | 修改ROW_FORMAT | 是 | 是 | 是 | 否 | 对表进行重建,耗费IO |
| 修改KEY_BLOCK_SIZE | 是 | 是 | 是 | 否 | 对表进行重建,耗费IO | |
| 设置持久表统计信息 | 是 | 否 | 是 | 是 | 仅修改表元数据。 | |
| 指定字符集 | 是 | 是 | 否 | 否 | 如果新字符编码不同,则重建表。 | |
| 转换字符集 | 否 | 是 | 否 | 否 | 如果新字符编码不同,则重建表。 | |
| OPTIMIZE优化表 | 是* | 是 | 是 | 否 |
OPTIMIZE TABLE tbl_name; 具有 |
|
| 执行空重建表 | 是* | 是 | 是 | 否 |
ALTER TABLE tbl_name ENGINE=InnoDB; 具有 |
|
| 重命名表 | 是 | 否 | 是 | 是 | 重命名与表对应的文件而不进行复制 | |
| tablespace | 启用或禁用单表文件表空间加密 | 否 | 是 | 否 | 否 | ALTER TABLE tbl_name ENCRYPTION='Y', ALGORITHM=COPY; |
| PARTITION | PARTITION BY | 否 | 不涉及 | 否 | 不涉及 | ALGORITHM=COPY, LOCK={DEFAULT|SHARED|EXCLUSIVE} |
| ADD PARTITION | 否 | 不涉及 | 否 | 不涉及 |
只允许 在保持共享锁的同时复制数据 |
|
| DROP PARTITION | 否 | 不涉及 | 否 | 不涉及 | 只允许ALGORITHM=DEFAULT,LOCK=DEFAULT |
|
| DISCARD PARTITION | 否 | 不涉及 | 否 | 不涉及 | 只允许ALGORITHM=DEFAULT,LOCK=DEFAULT |
|
| IMPORT PARTITION | 否 | 不涉及 | 否 | 不涉及 | 只允许ALGORITHM=DEFAULT,LOCK=DEFAULT |
|
| TRUNCATE PARTITION | 是 | 不涉及 | 是 | 不涉及 | 不复制现有数据。只删除行; 不会改变表本身或其任何分区的定义 | |
| COALESCE PARTITION | 否 | 不涉及 | 否 | 不涉及 |
只允许 在保持共享锁的同时复制数据 |
|
| REORGANIZE PARTITION | 否 | 不涉及 | 否 | 不涉及 |
只允许 保持共享元数据锁的同时从受影响的分区复制数据 |
|
| EXCHANGE PARTITION | 是 | 不涉及 | 是 | 不涉及 | ||
| ANALYZE PARTITION | 是 | 不涉及 | 是 | 不涉及 | ||
| CHECK PARTITION | 是 | 不涉及 | 是 | 不涉及 | ||
| OPTIMIZE PARTITION | 否 | 不涉及 | 否 | 不涉及 | ALGORITHM和LOCK参数被忽略。重建整个表 |
|
| REBUILD PARTITION | 否 | 不涉及 | 否 | 不涉及 |
只允许 保持共享元数据锁的同时从受影响的分区复制数据。 |
|
| REPAIR PARTITION | 是 | 不涉及 | 是 | 不涉及 | ||
| REMOVE PARTITION | 否 | 不涉及 | 否 | 不涉及 | ALGORITHM=COPY, LOCK={DEFAULT|SHARED|EXCLUSIVE} |