在线支持详细信息、语法示例和使用说明为 DDL 操作提供在本节中的以下主题。
以下表格提供了在线 DDL 支持索引操作的概述。星号表示附加信息、异常或依赖关系。详细信息,请参阅 语法和使用说明。
表 17.16 在线 DDL 支持索引操作
| Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
|---|---|---|---|---|---|
| Creating or adding a secondary index | 否 | 是 | 否 | 是 | 否 |
| Dropping an index | 否 | 是 | 否 | 是 | 是 |
| Renaming an index | 否 | 是 | 否 | 是 | 是 |
Adding a FULLTEXT index |
否 | 是* | 否* | 否 | 否 |
Adding a SPATIAL index |
否 | 是 | 否 | 否 | 否 |
| Changing the index type | 是 | 是 | 否 | 是 | 是 |
语法和使用说明
-
创建或添加次要索引
CREATE INDEX name ON table (col_list);ALTER TABLE tbl_name ADD INDEX name (col_list);表在创建索引时保持可读写操作。
CREATE INDEX语句仅在所有事务完成后完成,因此索引的初始状态反映了表的最新内容。在线 DDL 支持添加次要索引意味着您可以通过创建表时不添加次要索引,然后在加载数据后添加次要索引来加速整个过程。
新创建的次要索引仅包含表在
CREATE INDEX或ALTER TABLE语句执行完成时的提交数据。它不包含未提交的值、旧版本的值或标记为删除但尚未从旧索引中删除的值。一些因素会影响该操作的性能、空间使用和语义。详细信息,请参阅 第 17.12.8 节,“在线 DDL 限制”。
-
删除索引
DROP INDEX name ON table;ALTER TABLE tbl_name DROP INDEX name;表在删除索引时保持可读写操作。
DROP INDEX语句仅在所有事务完成后完成,因此索引的初始状态反映了表的最新内容。 -
重命名索引
ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name, ALGORITHM=INPLACE, LOCK=NONE; -
添加
FULLTEXT索引CREATE FULLTEXT INDEX name ON table(column);添加第一个
FULLTEXT索引重建表,如果没有用户定义的FTS_DOC_ID列。其他FULLTEXT索引可以添加而不需要重建表。 -
添加
SPATIAL索引CREATE TABLE geom (g GEOMETRY NOT NULL); ALTER TABLE geom ADD SPATIAL INDEX(g), ALGORITHM=INPLACE, LOCK=SHARED; -
更改索引类型 (
USING {BTREE | HASH})ALTER TABLE tbl_name DROP INDEX i1, ADD INDEX i1(key_part,...) USING BTREE, ALGORITHM=INSTANT;
以下表格概述了在线 DDL 对主键操作的支持。星号表示附加信息、异常或依赖关系。请参阅 语法和使用说明。
表 17.17 在线 DDL 对主键操作的支持
| Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
|---|---|---|---|---|---|
| Adding a primary key | 否 | 是* | 是* | 是 | 否 |
| Dropping a primary key | 否 | 否 | 是 | 否 | 否 |
| Dropping a primary key and adding another | 否 | 是 | 是 | 是 | 否 |
语法和使用说明
-
添加主键
ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;在原地重建表。数据被实质性地重新组织,使其成为昂贵的操作。
ALGORITHM=INPLACE在某些条件下不允许,如果列需要转换为NOT NULL。重组 聚簇索引 总是需要复制表数据。因此,最好是在创建表时定义主键,而不是稍后发出
ALTER TABLE ... ADD PRIMARY KEY。当您创建
UNIQUE或PRIMARY KEY索引时,MySQL 需要执行一些额外的工作。对于UNIQUE索引,MySQL 会检查表中没有重复的键值。对于PRIMARY KEY索引,MySQL 还会检查主键列中没有NULL值。当您使用
ALGORITHM=COPY子句添加主键时,MySQL 会将关联列中的NULL值转换为默认值:数字为 0,字符基于列和 BLOBs 为空字符串,DATETIME为 0000-00-00 00:00:00。这是一种非标准行为,Oracle 建议您不要依赖它。使用ALGORITHM=INPLACE添加主键仅在SQL_MODE设置包括strict_trans_tables或strict_all_tables标志时才允许;当SQL_MODE设置为严格时,ALGORITHM=INPLACE是允许的,但语句仍可能失败,如果请求的主键列包含NULL值。ALGORITHM=INPLACE行为更加标准兼容。如果您创建了没有主键的表,
InnoDB将为您选择一个,这可能是第一个UNIQUE键定义在NOT NULL列上,或者是一个系统生成的键。为了避免不确定性和潜在的空间需求,建议在CREATE TABLE语句中指定PRIMARY KEY子句。MySQL 通过将现有表的数据复制到具有所需索引结构的临时表中,创建一个新的聚簇索引。一旦数据完全复制到临时表中,原始表将被重命名为另一个临时表名。临时表将被重命名为原始表名,并将原始表从数据库中删除。
在线性能增强不适用于主键索引操作。InnoDB 表的行存储在一个 聚簇索引 中,基于 主键,形成一些数据库系统所谓的 “索引组织表””。由于表结构紧密耦合到主键,因此重新定义主键仍然需要复制数据。
当操作使用
ALGORITHM=INPLACE时,即使数据仍然被复制,但它比使用ALGORITHM=COPY更高效,因为:-
不需要撤销日志或关联的重做日志记录
ALGORITHM=INPLACE。这些操作将增加 DDL 语句的开销,使用ALGORITHM=COPY。 -
次要索引条目是预排序的,可以按顺序加载。
-
更改缓冲区不被使用,因为没有随机访问插入到次要索引中。
-
-
删除主键
ALTER TABLE tbl_name DROP PRIMARY KEY, ALGORITHM=COPY;只有
ALGORITHM=COPY支持在同一个ALTER TABLE语句中删除主键而不添加新的主键。 -
删除主键并添加另一个
ALTER TABLE tbl_name DROP PRIMARY KEY, ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;数据被实质性地重新组织,使其成为昂贵的操作。
以下表格提供了在线 DDL 对列操作的概述。星号表示附加信息、异常或依赖关系。详细信息,请参阅 语法和使用说明。
表 17.18 在线 DDL 对列操作的支持
| Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
|---|---|---|---|---|---|
| Adding a column | 是* | 是 | 否* | 是* | 是 |
| Dropping a column | 是* | 是 | 是 | 是 | 是 |
| Renaming a column | 是* | 是 | 否 | 是* | 是 |
| Reordering columns | 否 | 是 | 是 | 是 | 否 |
| Setting a column default value | 是 | 是 | 否 | 是 | 是 |
| Changing the column data type | 否 | 否 | 是 | 否 | 否 |
Extending VARCHAR column size |
否 | 是 | 否 | 是 | 是 |
| Dropping the column default value | 是 | 是 | 否 | 是 | 是 |
| Changing the auto-increment value | 否 | 是 | 否 | 是 | 否* |
Making a column NULL |
否 | 是 | 是* | 是 | 否 |
Making a column NOT NULL |
否 | 是* | 是* | 是 | 否 |
Modifying the definition of an ENUM or SET column |
是 | 是 | 否 | 是 | 是 |
语法和使用说明
-
添加列
ALTER TABLE tbl_name ADD COLUMN column_name column_definition, ALGORITHM=INSTANT;INSTANT是 MySQL 8.3 中的默认算法。以下限制适用于使用
INSTANT算法添加列:-
语句不能将列的添加与其他
ALTER TABLE操作结合,后者不支持INSTANT算法。 -
INSTANT算法可以在表中的任何位置添加列。 -
不能将列添加到使用
ROW_FORMAT=COMPRESSED的表、具有FULLTEXT索引的表、数据字典表空间中的表或临时表中。临时表仅支持ALGORITHM=COPY。 -
MySQL 在
INSTANT算法添加列时检查行大小,并在添加超出限制时抛出以下错误。ERROR 4092 (HY000): 列不能使用 ALGORITHM=INSTANT 添加,因为添加后行大小超过了最大允许的行大小。请尝试 ALGORITHM=INPLACE/COPY。
-
表的内部表示中的列数不能超过 1022 个,否则将抛出以下错误。
ERROR 4158 (HY000): 列不能添加到
tbl_name中使用 ALGORITHM=INSTANT。请尝试 ALGORITHM=INPLACE/COPY -
INSTANT算法不能添加或删除系统架构表中的列,例如内部mysql表。
可以在同一个
ALTER TABLE语句中添加多个列。例如:ALTER TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT, ALGORITHM=INSTANT;每个
ALTER TABLE ... ALGORITHM=INSTANT操作添加或删除一个或多个列后,会创建一个新的行版本。INFORMATION_SCHEMA.INNODB_TABLES.TOTAL_ROW_VERSIONS列跟踪表的行版本数。该值在每次添加或删除列时递增。初始值为 0。mysql> SELECT NAME, TOTAL_ROW_VERSIONS FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME LIKE 'test/t1'; +---------+--------------------+ | NAME | TOTAL_ROW_VERSIONS | +---------+--------------------+ | test/t1 | 0 | +---------+--------------------+当使用
ALTER TABLE或OPTIMIZE TABLE操作重建表时,TOTAL_ROW_VERSIONS值将被重置为 0。允许的最大行版本数为 64,因为每个行版本都需要额外的表元数据空间。当达到行版本限制时,ADD COLUMN和DROP COLUMN操作使用ALGORITHM=INSTANT将被拒绝,并显示错误消息,建议使用COPY或INPLACE算法。ERROR 4080 (HY000): 表 test/t1 的行版本达到最大限制。无法再使用 ALGORITHM=INSTANT 添加或删除列。请使用 COPY/INPLACE。
以下
INFORMATION_SCHEMA列提供了即时添加列的附加元数据。请参阅这些列的描述以获取更多信息。参见 第 28.4.9 节,“INFORMATION_SCHEMA INNODB_COLUMNS 表”,和 第 28.4.23 节,“INFORMATION_SCHEMA INNODB_TABLES 表”。-
INNODB_COLUMNS.DEFAULT_VALUE -
INNODB_COLUMNS.HAS_DEFAULT -
INNODB_TABLES.INSTANT_COLS
在添加自动递增列时,不允许并发 DML。数据被大幅重新组织,使其成为昂贵的操作。至少需要
ALGORITHM=INPLACE, LOCK=SHARED。如果使用
ALGORITHM=INPLACE添加列,表将被重建。 -
-
删除列
ALTER TABLE tbl_name DROP COLUMN column_name, ALGORITHM=INSTANT;INSTANT是 MySQL 8.3 中的默认算法。使用
INSTANT算法删除列时,以下限制适用:-
不能在同一语句中将删除列与其他
ALTER TABLE操作结合,除非这些操作也支持ALGORITHM=INSTANT。 -
不能从使用
ROW_FORMAT=COMPRESSED的表、具有FULLTEXT索引的表、数据词典表空间中的表或临时表中删除列。临时表仅支持ALGORITHM=COPY。
可以在同一
ALTER TABLE语句中删除多个列;例如:ALTER TABLE t1 DROP COLUMN c4, DROP COLUMN c5, ALGORITHM=INSTANT;每次使用
ALGORITHM=INSTANT添加或删除列时,都将创建一个新的行版本。INFORMATION_SCHEMA.INNODB_TABLES.TOTAL_ROW_VERSIONS列跟踪表的行版本数。该值每次添加或删除列时都会递增。初始值为 0。mysql> SELECT NAME, TOTAL_ROW_VERSIONS FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME LIKE 'test/t1'; +---------+--------------------+ | NAME | TOTAL_ROW_VERSIONS | +---------+--------------------+ | test/t1 | 0 | +---------+--------------------+当使用
ALTER TABLE或OPTIMIZE TABLE操作重建表时,TOTAL_ROW_VERSIONS值将被重置为 0。允许的最大行版本数为 64,因为每个行版本都需要额外的表元数据空间。当达到行版本限制时,使用ALGORITHM=INSTANT的ADD COLUMN和DROP COLUMN操作将被拒绝,并显示一条错误消息,建议使用COPY或INPLACE算法重建表。ERROR 4080 (HY000): 表 test/t1 达到最大行版本。无法再添加或删除列。请使用 COPY/INPLACE。
如果使用其他算法,而不是
ALGORITHM=INSTANT,数据将被大幅重新组织,使其成为昂贵的操作。 -
-
重命名列
ALTER TABLE tbl CHANGE old_col_name new_col_name data_type, ALGORITHM=INSTANT;要允许并发 DML,请保持相同的数据类型,只更改列名。
如果保持相同的数据类型和
[NOT] NULL属性,只更改列名,操作可以在线上执行。从另一个表引用的列只能使用
ALGORITHM=INPLACE重命名。如果使用ALGORITHM=INSTANT、ALGORITHM=COPY或其他条件导致操作使用这些算法,ALTER TABLE语句将失败。ALGORITHM=INSTANT支持重命名虚拟列:ALGORITHM=INPLACE不支持。ALGORITHM=INSTANT和ALGORITHM=INPLACE不支持在同一语句中重命名列和添加或删除虚拟列。在这种情况下,只支持ALGORITHM=COPY。 -
重新排序列
要重新排序列,请在
CHANGE或MODIFY操作中使用FIRST或AFTER。ALTER TABLE tbl_name MODIFY COLUMN col_name column_definition FIRST, ALGORITHM=INPLACE, LOCK=NONE;数据将被大幅重新组织,使其成为昂贵的操作。
-
更改列数据类型
ALTER TABLE tbl_name CHANGE c1 c1 BIGINT, ALGORITHM=COPY;更改列数据类型仅支持使用
ALGORITHM=COPY。 -
扩展
VARCHAR列大小ALTER TABLE tbl_name CHANGE COLUMN c1 c1 VARCHAR(255), ALGORITHM=INPLACE, LOCK=NONE;VARCHAR 列的长度字节数必须保持不变。对于 0 到 255 字节大小的 VARCHAR 列,每个值需要一个长度字节来编码值。对于 256 字节或更大大小的 VARCHAR 列,需要两个长度字节来编码值。因此,在位 ALTER TABLE 仅支持将 VARCHAR 列大小从 0 增加到 255 字节,或者从 256 字节增加到更大大小。在位 ALTER TABLE 不支持将 VARCHAR 列大小从小于 256 字节增加到 256 字节或更大大小。在这种情况下,所需的长度字节数从 1 变为 2,只能通过表复制(ALGORITHM=COPY)来支持。例如,尝试使用在位 ALTER TABLE 将 VARCHAR 列大小从 VARCHAR(255) 更改为 VARCHAR(256) 将返回以下错误:
ALTER TABLE tbl_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.NoteVARCHAR 列的字节长度取决于字符集的字节长度。
使用在位 ALTER TABLE 减少 VARCHAR 大小是不支持的。减少 VARCHAR 大小需要表复制(ALGORITHM=COPY)。
-
设置列默认值
ALTER TABLE tbl_name ALTER COLUMN col SET DEFAULT literal, ALGORITHM=INSTANT;仅修改表元数据。默认列值存储在 数据字典 中。
-
删除列默认值
ALTER TABLE tbl ALTER COLUMN col DROP DEFAULT, ALGORITHM=INSTANT; -
更改自动递增值
ALTER TABLE table AUTO_INCREMENT=next_value, ALGORITHM=INPLACE, LOCK=NONE;修改内存中的值,而不是数据文件。
在分布式系统中使用复制或分区时,您有时需要将自动递增计数器重置为特定值。下一行插入表中的行将使用指定的值作为其自动递增列的值。你也可以在数据仓库环境中使用这种技术,周期性地清空所有表并重新加载它们,从 1 开始自动递增序列。
-
使列为
NULLALTER TABLE tbl_name MODIFY COLUMN column_name data_type NULL, ALGORITHM=INPLACE, LOCK=NONE;就地重建表。数据被大幅重新组织,使其成为昂贵的操作。
-
使列为
NOT NULLALTER TABLE tbl_name MODIFY COLUMN column_name data_type NOT NULL, ALGORITHM=INPLACE, LOCK=NONE;就地重建表。
STRICT_ALL_TABLES或STRICT_TRANS_TABLESSQL_MODE是操作成功所需的。操作将失败,如果列包含 NULL 值。服务器禁止更改可能导致引用完整性丢失的外键列。见 第 15.1.9 节,“ALTER TABLE 语句”。数据被大幅重新组织,使其成为昂贵的操作。 -
修改
ENUM或SET列的定义CREATE TABLE t1 (c1 ENUM('a', 'b', 'c')); ALTER TABLE t1 MODIFY COLUMN c1 ENUM('a', 'b', 'c', 'd'), ALGORITHM=INSTANT;修改
ENUM或SET列的定义,通过将新枚举或集合成员添加到有效成员值列表的末尾,可以实时或就地执行,只要存储大小不变。例如,将成员添加到SET列中,该列有 8 个成员,改变每个值的存储大小从 1 字节到 2 字节;这需要表复制。将成员添加到列表中间将导致现有成员重新编号,需要表复制。
以下表提供了在线 DDL 对生成列操作的支持概述。有关详细信息,请参阅 语法和使用说明。
表 17.19 在线 DDL 对生成列操作的支持
| Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
|---|---|---|---|---|---|
Adding a STORED column |
否 | 否 | 是 | 否 | 否 |
Modifying STORED column order |
否 | 否 | 是 | 否 | 否 |
Dropping a STORED column |
否 | 是 | 是 | 是 | 否 |
Adding a VIRTUAL column |
是 | 是 | 否 | 是 | 是 |
Modifying VIRTUAL column order |
否 | 否 | 是 | 否 | 否 |
Dropping a VIRTUAL column |
是 | 是 | 否 | 是 | 是 |
语法和使用说明
-
添加一个
STORED列ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) STORED), ALGORITHM=COPY;ADD COLUMN不是存储列的就地操作(不使用临时表),因为服务器需要评估表达式。 -
修改
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=INSTANT;添加虚拟列可以即时或在非分区表中就地执行。
添加一个
VIRTUAL列不是分区表的就地操作。 -
修改
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=INSTANT;删除一个
VIRTUAL列可以即时或在非分区表中就地执行。
以下表格提供了在线 DDL 对外键操作的概述。星号表示附加信息、异常或依赖项。详细信息,请参阅 语法和使用说明。
表 17.20 在线 DDL 对外键操作的支持
| Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
|---|---|---|---|---|---|
| Adding a foreign key constraint | 否 | 是* | 否 | 是 | 是 |
| Dropping a foreign key constraint | 否 | 是 | 否 | 是 | 是 |
语法和使用说明
-
添加外键约束
使用
INPLACE算法时,需要禁用foreign_key_checks选项。否则,只支持COPY算法。ALTER TABLE tbl1 ADD CONSTRAINT fk_name FOREIGN KEY index (col1) REFERENCES tbl2(col2) referential_actions; -
删除外键约束
ALTER TABLE tbl DROP FOREIGN KEY fk_name;删除外键可以在线执行,
foreign_key_checks选项启用或禁用。如果您不知道特定表的外键约束名称,请执行以下语句,并在
CONSTRAINT子句中找到约束名称:SHOW CREATE TABLE table\G或者,查询信息模式
TABLE_CONSTRAINTS表,并使用CONSTRAINT_NAME和CONSTRAINT_TYPE列来标识外键名称。您也可以在单个语句中删除外键及其关联索引:
ALTER TABLE table DROP FOREIGN KEY constraint, DROP INDEX index;
如果已经在被修改的表中存在外键(即,它是一个包含 FOREIGN KEY ... REFERENCE 子句的子表),则在线 DDL 操作将受到限制,即使它们不直接涉及外键列:
-
在子表上执行
ALTER TABLE可能会等待另一个事务提交,如果父表的更改通过ON UPDATE或ON DELETE子句使用CASCADE或SET NULL参数引起了子表的关联更改。 -
同样,如果一个表是外键关系中的父表,即使它不包含任何
FOREIGN KEY子句,它仍然可能等待ALTER TABLE完成,如果一个INSERT、UPDATE或DELETE语句在子表中引发了ON UPDATE或ON DELETE操作。
以下表提供了在线 DDL 对表操作的概述。星号表示附加信息、异常或依赖关系。有关详细信息,请参阅 语法和使用说明。
表 17.21 在线 DDL 对表操作支持
| Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
|---|---|---|---|---|---|
Changing the ROW_FORMAT |
否 | 是 | 是 | 是 | 否 |
Changing the KEY_BLOCK_SIZE |
否 | 是 | 是 | 是 | 否 |
| Setting persistent table statistics | 否 | 是 | 否 | 是 | 是 |
| Specifying a character set | 否 | 是 | 是* | 是 | 否 |
| Converting a character set | 否 | 否 | 是* | 否 | 否 |
| Optimizing a table | 否 | 是* | 是 | 是 | 否 |
Rebuilding with the FORCE option |
否 | 是* | 是 | 是 | 否 |
| Performing a null rebuild | 否 | 是* | 是 | 是 | 否 |
| Renaming a table | 是 | 是 | 否 | 是 | 是 |
语法和使用说明
-
更改
ROW_FORMATALTER TABLE tbl_name ROW_FORMAT = row_format, ALGORITHM=INPLACE, LOCK=NONE;数据被重新组织,变得非常昂贵。
有关
ROW_FORMAT选项的更多信息,请参阅 表选项。 -
更改
KEY_BLOCK_SIZEALTER TABLE tbl_name KEY_BLOCK_SIZE = value, ALGORITHM=INPLACE, LOCK=NONE;数据被重新组织,变得非常昂贵。
有关
KEY_BLOCK_SIZE选项的更多信息,请参阅 表选项。 -
设置持久表统计选项
ALTER TABLE tbl_name STATS_PERSISTENT=0, STATS_SAMPLE_PAGES=20, STATS_AUTO_RECALC=1, ALGORITHM=INPLACE, LOCK=NONE;仅修改表元数据。
持久统计包括
STATS_PERSISTENT、STATS_AUTO_RECALC和STATS_SAMPLE_PAGES。有关更多信息,请参阅 第 17.8.10.1 节,“配置持久优化器统计参数”。 -
指定字符集
ALTER TABLE tbl_name CHARACTER SET = charset_name, ALGORITHM=INPLACE, LOCK=NONE;如果新字符编码不同,则重建表。
-
转换字符集
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name, ALGORITHM=COPY;如果新字符编码不同,则重建表。
-
优化表
OPTIMIZE TABLE tbl_name;不支持具有
FULLTEXT索引的表的就地操作。操作使用INPLACE算法,但ALGORITHM和LOCK语法不允许。 -
使用
FORCE选项重建表ALTER TABLE tbl_name FORCE, ALGORITHM=INPLACE, LOCK=NONE;从 MySQL 5.6.17 开始使用
ALGORITHM=INPLACE。不支持具有FULLTEXT索引的表。 -
执行“空”重建
ALTER TABLE tbl_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;从 MySQL 5.6.17 开始使用
ALGORITHM=INPLACE。不支持具有FULLTEXT索引的表。 -
重命名表
ALTER TABLE old_tbl_name RENAME TO new_tbl_name, ALGORITHM=INSTANT;可以即时或就地重命名表。MySQL 重命名对应于表
tbl_name的文件,而不创建副本。(您也可以使用RENAME TABLE语句重命名表。请参阅 第 15.1.36 节,“RENAME TABLE 语句”。)授予特定表的权限不会被迁移到新名称。它们必须手动更改。
以下表格概述了在线 DDL 对表空间操作的支持。有关详细信息,请参阅 语法和使用说明。
表 17.22 在线 DDL 对表空间操作的支持
| Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
|---|---|---|---|---|---|
| Renaming a general tablespace | 否 | 是 | 否 | 是 | 是 |
| Enabling or disabling general tablespace encryption | 否 | 是 | 否 | 是 | 否 |
| Enabling or disabling file-per-table tablespace encryption | 否 | 否 | 是 | 否 | 否 |
语法和使用说明
-
重命名通用表空间
ALTER TABLESPACE tablespace_name RENAME TO new_tablespace_name;ALTER TABLESPACE ... RENAME TO使用INPLACE算法,但不支持ALGORITHM子句。 -
启用或禁用通用表空间加密
ALTER TABLESPACE tablespace_name ENCRYPTION='Y';ALTER TABLESPACE ... ENCRYPTION使用INPLACE算法,但不支持ALGORITHM子句。有关相关信息,请参阅 第 17.13 节,“InnoDB 静态数据加密”。
-
启用或禁用文件每表表空间加密
ALTER TABLE tbl_name ENCRYPTION='Y', ALGORITHM=COPY;有关相关信息,请参阅 第 17.13 节,“InnoDB 静态数据加密”。
除了某些 ALTER TABLE 分区子句外,online DDL 操作对分区 InnoDB 表遵循与普通 InnoDB 表相同的规则。
某些 ALTER TABLE 分区子句不通过与普通非分区 InnoDB 表相同的内部 online DDL API。因此,对 ALTER TABLE 分区子句的 online 支持各不相同。
以下表格显示每个 ALTER TABLE 分区语句的 online 状态。无论使用哪种 online DDL API,MySQL 都尝试尽可能地最小化数据复制和锁定。
ALTER TABLE 分区选项使用 ALGORITHM=COPY 或仅允许 “ALGORITHM=DEFAULT, LOCK=DEFAULT”,使用 COPY 算法重新分区表。换言之,使用新的分区方案创建一个新的分区表。新创建的表包括 ALTER TABLE 语句应用的所有更改,并将表数据复制到新的表结构中。
表 17.23 在线 DDL 对分区操作的支持
| Partitioning Clause | Instant | In Place | Permits DML | Notes |
|---|---|---|---|---|
PARTITION BY |
否 | 否 | 否 | 允许 ALGORITHM=COPY, LOCK={DEFAULT|SHARED|EXCLUSIVE} |
ADD PARTITION |
否 | 是* | 是* | ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSIVE} 支持 RANGE 和 LIST 分区,ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} 支持 HASH 和 KEY 分区,ALGORITHM=COPY, LOCK={SHARED|EXCLUSIVE} 支持所有分区类型。对于 RANGE 或 LIST 分区的表,不复制现有数据。对于 HASH 或 LIST 分区的表,使用 ALGORITHM=COPY 时允许并发查询,因为 MySQL 在持有共享锁时复制数据。 |
DROP PARTITION |
否 | 是* | 是* |
|
DISCARD PARTITION |
否 | 否 | 否 | 仅允许 算法=默认, 锁=默认 |
IMPORT PARTITION |
否 | 否 | 否 | 仅允许 算法=默认, 锁=默认 |
TRUNCATE PARTITION |
否 | 是 | 是 | 不复制现有数据。它只是删除行;它不改变表的定义或任何分区的定义。 |
COALESCE PARTITION |
否 | 是* | 否 | 算法=就地、锁={默认|共享|排他} 是支持的。 |
REORGANIZE PARTITION |
否 | 是* | 否 | 算法=就地、锁={默认|共享|排他} 是支持的。 |
EXCHANGE PARTITION |
否 | 是 | 是 | |
ANALYZE PARTITION |
否 | 是 | 是 | |
CHECK PARTITION |
否 | 是 | 是 | |
OPTIMIZE PARTITION |
否 | 否 | 否 | 算法 和 锁 子句被忽略。重建整个表。见 第 26.3.4 节,“分区维护”。 |
REBUILD PARTITION |
否 | 是* | 否 | 算法=就地、锁={默认|共享|排他} 是支持的。 |
REPAIR PARTITION |
否 | 是 | 是 | |
REMOVE PARTITIONING |
否 | 否 | 否 | 允许 算法=复制, 锁={默认|共享|排他} |
非分区在线 ALTER TABLE 操作在分区表上遵循与普通表相同的规则。然而,ALTER TABLE 在每个表分区上执行在线操作,这会增加系统资源的需求,因为操作是在多个分区上执行的。
有关 ALTER TABLE 分区子句的更多信息,请参见 分区选项 和 第 15.1.9.1 节,“ALTER TABLE 分区操作”。有关分区的更多信息,请参见 第 26 章,分区。