本节中的以下主题提供了在线 DDL 操作的支持详情、语法示例和使用说明。
下表概述了在线 DDL 对索引操作的支持。星号表示附加信息、异常或依赖项。有关详细信息,请参阅 语法和使用说明。
表 17.15 在线 DDL 对索引操作的支持
操作 | 即时 | 就地 | 重建表 | 允许并发 DML | 仅修改元数据 |
---|---|---|---|---|---|
创建或添加二级索引 | 否 | 是 | 否 | 是 | 否 |
删除索引 | 否 | 是 | 否 | 是 | 是 |
重命名索引 | 否 | 是 | 否 | 是 | 是 |
添加 FULLTEXT 索引 |
否 | 是* | 否* | 否 | 否 |
添加 SPATIAL 索引 |
否 | 是 | 否 | 否 | 否 |
更改索引类型 | 是 | 是 | 否 | 是 | 是 |
语法和使用说明
创建或添加二级索引
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.16 在线 DDL 对主键操作的支持
操作 | 即时 | 就地 | 重建表 | 允许并发 DML | 仅修改元数据 |
---|---|---|---|---|---|
添加主键 | 否 | 是* | 是* | 是 | 否 |
删除主键 | 否 | 否 | 是 | 否 | 否 |
删除主键并添加另一个主键 | 否 | 是 | 是 | 是 | 否 |
语法和使用说明
添加主键
ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
就地重建表。数据会发生实质性重组,使其成为一项昂贵的操作。如果必须将列转换为
NOT NULL
,则在某些情况下不允许使用ALGORITHM=INPLACE
。重构 聚簇索引 始终需要复制表数据。因此,最好在创建表时定义 主键,而不是以后执行
ALTER TABLE ... ADD PRIMARY KEY
。创建
UNIQUE
或PRIMARY KEY
索引时,MySQL 需要进行一些额外的操作。对于UNIQUE
索引,MySQL 会检查表中是否包含重复的键值。对于PRIMARY KEY
索引,MySQL 还会检查所有PRIMARY KEY
列是否包含NULL
值。使用
ALGORITHM=COPY
子句添加主键时,MySQL 会将相关列中的NULL
值转换为默认值:数字为 0,基于字符的列和 BLOB 为空字符串,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
会为您选择一个主键,它可以是定义在NOT NULL
列上的第一个UNIQUE
键,也可以是系统生成的键。为了避免不确定性以及可能为额外隐藏列分配的存储空间,请在CREATE TABLE
语句中指定PRIMARY KEY
子句。MySQL 通过将现有数据从原始表复制到具有所需索引结构的临时表来创建一个新的聚集索引。数据完全复制到临时表后,原始表将使用不同的临时表名重命名。包含新聚集索引的临时表将使用原始表的名称重命名,原始表将从数据库中删除。
适用于辅助索引操作的在线性能增强不适用于主键索引。
InnoDB
表的行存储在一个 聚集索引 中,该索引根据 主键 组织,形成某些数据库系统称为““索引组织表” 的结构。由于表结构与主键紧密相关,因此重新定义主键仍然需要复制数据。当主键操作使用
ALGORITHM=INPLACE
时,即使数据仍然被复制,但它比使用ALGORITHM=COPY
更有效率,因为ALGORITHM=INPLACE
不需要撤消日志或关联的重做日志。这些操作会为使用ALGORITHM=COPY
的 DDL 语句增加开销。辅助索引条目已预先排序,因此可以按顺序加载。
不使用更改缓冲区,因为没有对辅助索引进行随机访问插入。
删除主键
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.17 在线 DDL 对列操作的支持
操作 | 即时 | 就地 | 重建表 | 允许并发 DML | 仅修改元数据 |
---|---|---|---|---|---|
添加列 | 是* | 是 | 否* | 是* | 是 |
删除列 | 是* | 是 | 是 | 是 | 是 |
重命名列 | 是* | 是 | 否 | 是* | 是 |
重新排序列 | 否 | 是 | 是 | 是 | 否 |
设置列默认值 | 是 | 是 | 否 | 是 | 是 |
更改列数据类型 | 否 | 否 | 是 | 否 | 否 |
扩展 VARCHAR 列大小 |
否 | 是 | 否 | 是 | 是 |
删除列默认值 | 是 | 是 | 否 | 是 | 是 |
更改自动递增值 | 否 | 是 | 否 | 是 | 否* |
将列设置为 NULL |
否 | 是 | 是* | 是 | 否 |
将列设置为 NOT NULL |
否 | 是* | 是* | 是 | 否 |
修改 ENUM 或 SET 列的定义 |
是 | 是 | 否 | 是 | 是 |
语法和使用说明
添加列
ALTER TABLE tbl_name ADD COLUMN column_name column_definition, ALGORITHM=INSTANT;
在 MySQL 9.0 中,
INSTANT
是默认算法。当
INSTANT
算法添加列时,以下限制适用语句不能将添加列与不支持
INSTANT
算法的其他ALTER TABLE
操作组合在一起。INSTANT
算法可以在表的任何位置添加列。不能将列添加到使用
ROW_FORMAT=COMPRESSED
的表、具有FULLTEXT
索引的表、位于数据字典表空间的表或临时表。临时表仅支持ALGORITHM=COPY
。当
INSTANT
算法添加列时,MySQL 会检查行大小,如果添加超过限制,则会抛出以下错误。ERROR 4092 (HY000): Column can't be added with ALGORITHM=INSTANT as after this max possible row size crosses max permissible row size. Try ALGORITHM=INPLACE/COPY.
使用
INSTANT
算法添加列后,表内部表示中的列数不能超过 1022。错误消息是ERROR 4158 (HY000): Column can't be added to
tbl_name
with ALGORITHM=INSTANT anymore. Please try ALGORITHM=INPLACE/COPYINSTANT
算法不能向系统架构表添加或删除列,例如内部mysql
表。使用
INSTANT
算法不能删除具有函数索引的列。
可以在同一
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,因为每个行版本都需要额外的空间来存储表元数据。当达到行版本限制时,使用ALGORITHM=INSTANT
的ADD COLUMN
和DROP COLUMN
操作将被拒绝,并显示一条错误消息,建议使用COPY
或INPLACE
算法重建表。ERROR 4080 (HY000): Maximum row versions reached for table test/t1. No more columns can be added or dropped instantly. Please use 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;
在 MySQL 9.0 中,
INSTANT
是默认算法。当使用
INSTANT
算法删除列时,以下限制适用删除列不能在同一语句中与不支持
ALGORITHM=INSTANT
的其他ALTER TABLE
操作组合在一起。不能从使用
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): Maximum row versions reached for table test/t1. No more columns can be added or dropped instantly. Please use 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.
注意VARCHAR
列的字节长度取决于字符集的字节长度。使用就地
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 重新开始自动递增序列。
将列设置为
NULL
ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NULL, ALGORITHM=INPLACE, LOCK=NONE;
就地重建表。数据将被重新组织,这会使它成为一项昂贵的操作。
将列设置为
NOT NULL
ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NOT NULL, ALGORITHM=INPLACE, LOCK=NONE;
就地重建表。操作成功需要
STRICT_ALL_TABLES
或STRICT_TRANS_TABLES
SQL_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
列的定义,可以立即或就地执行,只要数据类型的存储大小没有改变。例如,将成员添加到具有 8 个成员的SET
列,会将每个值所需的存储空间从 1 字节更改为 2 字节;这需要复制表。在列表中间添加成员会导致对现有成员进行重新编号,这需要复制表。
下表概述了对生成列操作的在线 DDL 支持。有关详细信息,请参见 语法和使用说明。
表 17.18 在线 DDL 对生成列操作的支持
操作 | 即时 | 就地 | 重建表 | 允许并发 DML | 仅修改元数据 |
---|---|---|---|---|---|
添加 STORED 列 |
否 | 否 | 是 | 否 | 否 |
修改 STORED 列顺序 |
否 | 否 | 是 | 否 | 否 |
删除 STORED 列 |
否 | 是 | 是 | 是 | 否 |
添加 VIRTUAL 列 |
是 | 是 | 否 | 是 | 是 |
修改 VIRTUAL 列顺序 |
否 | 否 | 是 | 否 | 否 |
删除 VIRTUAL 列 |
是 | 是 | 否 | 是 | 是 |
语法和使用说明
添加
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 支持。星号表示其他信息、异常或依赖关系。有关详细信息,请参见 语法和使用说明。
语法和使用说明
添加外键约束
当
foreign_key_checks
禁用时,支持INPLACE
算法。否则,仅支持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 操作也会有额外的限制
如果对父表的更改通过使用
CASCADE
或SET NULL
参数的ON UPDATE
或ON DELETE
子句导致子表中的相关更改,则对子表的ALTER TABLE
可能需要等待另一个事务提交。同样,如果一个表是在外键关系中的 父表,即使它不包含任何
FOREIGN KEY
子句,如果INSERT
、UPDATE
或DELETE
语句导致子表中的ON UPDATE
或ON DELETE
操作,它也可能需要等待ALTER TABLE
完成。
下表概述了对表操作的在线 DDL 支持。星号表示其他信息、异常或依赖关系。有关详细信息,请参见 语法和使用说明。
表 17.20 在线 DDL 对表操作的支持
操作 | 即时 | 就地 | 重建表 | 允许并发 DML | 仅修改元数据 |
---|---|---|---|---|---|
更改 ROW_FORMAT |
否 | 是 | 是 | 是 | 否 |
更改 KEY_BLOCK_SIZE |
否 | 是 | 是 | 是 | 否 |
设置持久表统计信息 | 否 | 是 | 否 | 是 | 是 |
指定字符集 | 否 | 是 | 是* | 是 | 否 |
转换字符集 | 否 | 否 | 是* | 否 | 否 |
优化表 | 否 | 是* | 是 | 是 | 否 |
使用 FORCE 选项重建 |
否 | 是* | 是 | 是 | 否 |
执行空重建 | 否 | 是* | 是 | 是 | 否 |
重命名表 | 是 | 是 | 否 | 是 | 是 |
语法和使用说明
更改
ROW_FORMAT
ALTER TABLE tbl_name ROW_FORMAT = row_format, ALGORITHM=INPLACE, LOCK=NONE;
数据被大量重新组织,这使得它成为一项昂贵的操作。
有关
ROW_FORMAT
选项的更多信息,请参见 表选项。更改
KEY_BLOCK_SIZE
ALTER 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
索引的表,不支持ALGORITHM=INPLACE
。执行“空”重建
ALTER TABLE tbl_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;
从 MySQL 5.6.17 开始使用
ALGORITHM=INPLACE
。对于具有FULLTEXT
索引的表,不支持ALGORITHM=INPLACE
。重命名表
ALTER TABLE old_tbl_name RENAME TO new_tbl_name, ALGORITHM=INSTANT;
重命名表可以立即或就地执行。MySQL 会重命名与表
tbl_name
相对应的文件,而不会进行复制。(您还可以使用RENAME TABLE
语句来重命名表。参见 第 15.1.36 节,“RENAME TABLE 语句”。)专门授予重命名表的权限不会迁移到新名称。它们必须手动更改。
下表概述了对表空间操作的在线 DDL 支持。有关详细信息,请参见 语法和使用说明。
表 17.21 在线 DDL 对表空间操作的支持
操作 | 即时 | 就地 | 重建表 | 允许并发 DML | 仅修改元数据 |
---|---|---|---|---|---|
重命名通用表空间 | 否 | 是 | 否 | 是 | 是 |
启用或禁用通用表空间加密 | 否 | 是 | 否 | 是 | 否 |
启用或禁用每个表文件表空间加密 | 否 | 否 | 是 | 否 | 否 |
语法和使用说明
重命名通用表空间
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
分区子句外,对分区 InnoDB
表的在线 DDL 操作遵循与常规 InnoDB
表相同的规则。
某些 ALTER TABLE
分区子句不会像常规非分区 InnoDB
表那样经过相同的内部在线 DDL API。因此,对 ALTER TABLE
分区子句的在线支持会有所不同。
下表显示了每个 ALTER TABLE
分区语句的在线状态。无论使用哪种在线 DDL API,MySQL 都尝试尽可能地减少数据复制和锁定。
使用 ALGORITHM=COPY
或仅允许 “ALGORITHM=DEFAULT, LOCK=DEFAULT
” 的 ALTER TABLE
分区选项,使用 COPY
算法对表进行重新分区。换句话说,将使用新的分区方案创建一个新的分区表。新创建的表包含 ALTER TABLE
语句应用的任何更改,并且表数据将复制到新的表结构中。
表 17.22 在线 DDL 对分区操作的支持
分区子句 | 即时 | 就地 | 允许 DML | 说明 |
---|---|---|---|---|
PARTITION BY |
否 | 否 | 否 | 允许 ALGORITHM=COPY 、LOCK={DEFAULT|SHARED|EXCLUSIVE} |
ADD PARTITION |
否 | 是* | 是* | ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSISVE} 支持 RANGE 和 LIST 分区,ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSISVE} 支持 HASH 和 KEY 分区,而 ALGORITHM=COPY, LOCK={SHARED|EXCLUSIVE} 支持所有分区类型。对于按 RANGE 或 LIST 分区的表,不会复制现有数据。对于按 HASH 或 LIST 分区的表,使用 ALGORITHM=COPY 允许并发查询,因为 MySQL 在持有共享锁时复制数据。 |
DROP PARTITION |
否 | 是* | 是* |
使用 |
DISCARD PARTITION |
否 | 否 | 否 | 仅允许 ALGORITHM=DEFAULT ,LOCK=DEFAULT |
IMPORT PARTITION |
否 | 否 | 否 | 仅允许 ALGORITHM=DEFAULT ,LOCK=DEFAULT |
TRUNCATE PARTITION |
否 | 是 | 是 | 不会复制现有数据。它只删除行;它不会更改表本身或任何分区的定义。 |
COALESCE PARTITION |
否 | 是* | 否 | ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} 支持。 |
REORGANIZE PARTITION |
否 | 是* | 否 | ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} 支持。 |
EXCHANGE PARTITION |
否 | 是 | 是 | |
ANALYZE PARTITION |
否 | 是 | 是 | |
CHECK PARTITION |
否 | 是 | 是 | |
OPTIMIZE PARTITION |
否 | 否 | 否 | ALGORITHM 和 LOCK 子句将被忽略。重新构建整个表。请参见 第 26.3.4 节,“分区的维护”。 |
REBUILD PARTITION |
否 | 是* | 否 | ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} 支持。 |
REPAIR PARTITION |
否 | 是 | 是 | |
REMOVE PARTITIONING |
否 | 否 | 否 | 允许 ALGORITHM=COPY 、LOCK={DEFAULT|SHARED|EXCLUSIVE} |
对分区表的非分区在线 ALTER TABLE
操作遵循适用于普通表的相同规则。但是,ALTER TABLE
对每个表分区执行在线操作,由于对多个分区执行操作,会导致对系统资源的需求增加。
有关 ALTER TABLE
分区子句的更多信息,请参见 分区选项,以及 第 15.1.9.1 节,“ALTER TABLE 分区操作”。有关分区的一般信息,请参见 第 26 章,分区。