alter table <表名> engine=innodb;
更多版本特性请参见 AliSQL 小版本Release Notes 。
在添加auto_increment自增列时,是不允许并发 DML 操作的。
尽管支持Algorithm=INPLACE ,但因为数据实质上需要重新组织,因此操作的开销高昂。
尽管支持Algorithm=INPLACE ,但因为数据实质上需要重新组织,因此操作的开销高昂。 修改各列顺序 尽管支持Algorithm=INPLACE ,但因为数据实质上需要重新组织,因此操作的开销高昂。 修改Row_Format属性 尽管支持Algorithm=INPLACE ,但因为数据实质上需要重新组织,因此操作的开销高昂。 修改Key_Block_Size属性 尽管支持Algorithm=INPLACE ,但因为数据实质上需要重新组织,因此操作的开销高昂。 设置列为空值Null 尽管支持Algorithm=INPLACE ,但因为数据实质上需要重新组织,因此操作的开销高昂。 设置列不为空值NOT Null该操作需要将SQL_MODE 参数设置为STRICT_ALL_TABLES或STRICT_TRANS_TABLES才能成功。如果列值中包含空值(NULL),则该DDL 操作会失败。
尽管支持Algorithm=INPLACE ,但因为数据实质上需要重新组织,因此操作的开销高昂。
修改列的数据类型尽管支持Algorithm=INPLACE ,但因为数据实质上需要重新组织,因此操作的开销高昂。
如果涉及的列需要转换为NOT NULL,则不支持Algorithm=INPLACE。
删除主键并添加新主键仅当在同一个Alter Table语句中(删除主键的DDL语句)添加新主键才支持Algorithm=INPLACE。
因为数据实质上需要重新组织,因此操作的开销高昂。
Convert character set 如果新的字符集编码不同,需要重建表。 Specify character set 如果新的字符集编码不同,需要重建表。 带force选项重建表 如果表上有全文索引,则不支持Algorithm=Inplace选项。重建表
alter table ... engine=innodb
如果表上有全文索引,则不支持Algorithm=Inplace选项。设置表的 persistent statistics
仅修改表的元数据metadata。alter table area_bak algorithm=inplace, modify father text; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
alter table area ALGORITHM=copy, lock=none,CONVERT TO CHARACTER SET utf8mb4; ERROR 1846 (0A000): LOCK=NONE is not supported. Reason: COPY algorithm requires a lock. Try LOCK=SHARED.
默认情况下RDS MySQL会尽量使用algorithm=inplace以及lock=none来进行DDL操作,因此默认可以不指定这两个选项。但如果担心DDL操作对系统负载有影响或阻塞对目标表的DML操作,建议使用algorithm=inplace或lock=none选项来操作,这样如果系统对某一个选项不支持,会立刻返回错误,避免影响业务。
alter table area algorithm=inplace, lock=none, add index idx_fa (father);
对不支持Online DDL的操作(例如RDS MySQL 5.5),可以考虑通过Percona的Schema Online Change工具来操作。
Alter Table语法请参见 ALTER TABLE Syntax 。
在对某些大表的Online DDL过程中,有时会碰到下面的错误:
alter table rd_order_rec add index idx_cr_time_detail (cr_time,detail); ERROR 1799(HY000): Creating index 'idx_cr_time_detail' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.
在进行Online DDL(不阻塞并发DML) 的过程中,每个被修改的表或者创建的索引都会使用一个临时日志来保存 DDL过程中并发DML操作的记录。该临时日志文件的大小可以根据需要从参数innodb_sort_buffer_size指定的大小扩展到参数nnodb_online_alter_log_max_size指定的大小。
如果有临时日志文件大小超过上限,则该DDL语句返回失败并且所有没有提交的并发DML操作会被回滚。因此增加 innodb_online_alter_log_max_size参数的大小可以允许DDL过程中更多的并发DML操作,但是较大的值也会使在DDL操作末尾阶段的锁定表应用日志中的数据的过程持续更长的时间。
针对MySQL 5.6/5.7,可以在控制台修改innodb_online_alter_log_max_size参数值,详细步骤请参见 设置实例参数 。