17.12.1 在线 DDL 操作
本节提供了在线 DDL 操作的详细信息、语法示例和使用说明。
以下表格提供了在线 DDL 支持的索引操作概述。星号表示额外信息、异常或依赖项。详细信息请见语法和使用说明。
表17.15:在线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.16在线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检查表中不包含重复值的键。对于主要键索引,MySQL还检查主要键列是否包含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
列上的第一个唯一键,或者是一个系统生成的键。为了避免不确定性和潜在的额外隐藏列空间需求,请将PRIMARY KEY
子句作为CREATE TABLE
语句的一部分指定。MySQL 创建了一个新的聚簇索引,通过将原始表中的数据复制到一个临时表中,该临时表具有所需的索引结构。等待所有数据被完全复制到临时表后,原始表将被重命名为不同的临时表名称。临时表,组成新的聚簇索引,将被重命名为原始表的名称,并且原始表将从数据库中删除。
对次要索引操作的在线性能增强不适用于主键索引。InnoDB 表中的行存储在一个聚簇索引中,该索引基于主键,形成一些数据库系统称为“索引组织表”。由于表结构紧密地与主键相关,重新定义主键仍然需要复制数据。
当使用ALGORITHM=INPLACE的操作时,即使数据仍被复制,它比使用ALGORITHM=COPY更高效,因为:
-
无需为ALGORITHM=INPLACE操作记录undo日志或相关redo日志。这些操作增加了使用ALGORITHM=COPY的DDL语句的开销。
-
次要索引条目已经预排序,可以按顺序加载。
-
change buffer 不被使用,因为没有随机访问插入到次要索引中。
-
-
删除主键
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支持的列操作
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.4 的默认算法。以下限制适用于
INSTANT
算法添加列时:-
语句不能同时添加列和其他不支持
INSTANT
算法的ALTER TABLE
动作。 -
INSTANT
算法可以在表中的任何位置添加列。 -
不能将列添加到使用
ROW_FORMAT=COMPRESSED
的表、具有FULLTEXT
索引的表、位于数据字典表空间的表或临时表中。临时表仅支持ALGORITHM=COPY
。 -
MySQL 在
INSTANT
算法添加列时检查行大小,如果超出限制将抛出错误。ERROR 4092 (HY000): 添加列不能使用 ALGORITHM=INSTANT,因为在此后可能的行大小超过可允许的行大小。请尝试 ALGORITHM=INPLACE/COPY。
-
在添加列时,
INSTANT
算法不能使表的内部表示中的列数超过 1022。错误信息是:ERROR 4158 (HY000): 不能使用 ALGORITHM=INSTANT 在
tbl_名
表中添加列 anymore。请尝试 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,每个行版本都需要额外的表元数据空间。当达到行版本限制时,使用ALGORITHM=INSTANT
的ADD COLUMN
和DROP COLUMN
操作将被拒绝,并显示一个错误消息,建议使用COPY
或INPLACE
算法重建表。ERROR 4080 (HY000): 表test/t1的行版本数已达到最大限制。不能再使用瞬态方式添加或删除列。请使用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.4的默认算法。使用
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
是支持的。 -
重新排序列
要重新排序列,使用
FIRST
或AFTER
在CHANGE
或MODIFY
操作中。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 列,两个长度字节是必要的。因此,在-place ALTER TABLE 只支持将 VARCHAR 列大小从 0 到 255 字节增加到更大,或者从 256 字节增加到更大。在-place ALTER TABLE 不支持将小于 256 字节的 VARCHAR 列大小增加到等于或更大 256 字节。在这种情况下,需要的长度字节数从 1 变为 2,这是只有表复制(
ALGORITHM=COPY
)才能支持的。例如,尝试使用 in-place 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 列的字节长度取决于字符集的字节长度。
减少
VARCHAR
大小使用in-placeALTER TABLE
不受支持。减少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;
修改内存中的值,而不是数据文件。
在使用复制或分片的分布式系统中,您有时需要将表的自增计数器重置到特定值。下一个插入到表中的行将使用指定值作为其自增列。您也可能在数据仓库环境中使用这种技术, periodically清空所有表并重新加载它们,然后从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 Statement”。数据将被重组,导致昂贵的操作。 -
修改
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支持生成列操作
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
不是存储列的in-place操作(使用临时表),因为表达式必须由服务器评估。 -
修改
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;
可以立即或在非分区表中进行in-place操作。
添加
VIRTUAL
不是分区表的in-place操作。 -
修改
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;
可以立即或在非分区表中进行in-place操作。
以下表格提供了在线DDL支持的外键操作概述。星号表示额外信息、异常或依赖项。详细信息,请见语法和使用说明。
表17.19:在线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
或者,查询信息Schema
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.20在线DDL支持的表操作
Operation | Instant | In Place | Rebuilds Table | Permits Concurrent DML | Only Modifies Metadata |
---|---|---|---|---|---|
Changing the ROW_FORMAT |
No | Yes | Yes | Yes | No |
Changing the KEY_BLOCK_SIZE |
No | Yes | Yes | Yes | No |
Setting persistent table statistics | No | Yes | No | Yes | Yes |
Specifying a character set | No | Yes | Yes* | Yes | No |
Converting a character set | No | No | Yes* | No | No |
Optimizing a table | No | Yes* | Yes | Yes | No |
Rebuilding with the FORCE option |
No | Yes* | Yes | Yes | No |
Performing a null rebuild | No | Yes* | Yes | Yes | No |
Renaming a table | Yes | Yes | No | Yes | Yes |
-
更改
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
选项的更多信息,请见Table Options. -
设置持久表统计选项
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
索引的表进行in-place操作。该操作使用INPLACE
算法,但ALGORITHM
和LOCK
语句不被允许。 -
使用
FORCE
选项重建表ALTER TABLE tbl_name FORCE, ALGORITHM=INPLACE, LOCK=NONE;
从MySQL 5.6.17开始使用
ALGORITHM=INPLACE
。ALGORITHM=INPLACE
不支持在表中包含FULLTEXT
索引的表。 -
执行“null”重建
ALTER TABLE tbl_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;
从MySQL 5.6.17开始使用
ALGORITHM=INPLACE
。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 Statement”。)对重命名后的表格授予的特定权限不会被迁移到新名称中,需要手动更改。
表space 操作
以下表格提供了对表space 操作的在线 DDL 支持概述。详细信息请见语法和使用说明。
表17.21 在线 DDL 支持对表space 操作
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 | 否 | 否 | 是 | 否 | 否 |
-
重命名通用表space
ALTER TABLESPACE tablespace_name RENAME TO new_tablespace_name;
ALTER TABLESPACE ... RENAME TO
使用INPLACE
算法,但不支持ALGORITHM
子句。 -
启用或禁用通用表space 加密
ALTER TABLESPACE tablespace_name ENCRYPTION='Y';
ALTER TABLESPACE ... 加密
使用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。因此,online支持ALTER TABLE
分区子句的支持有所不同。
以下表格显示了每个ALTER TABLE
分区语句的online状态,无论使用哪种内部online DDL API,MySQL 都尝试最小化数据复制和锁定。
ALTER 表
分区选项使用ALGORITHM=COPY
或仅允许“ALGORITHM=DEFAULT, LOCK=DEFAULT
”,重新分区表使用COPY
算法。换言之,创建了一个新的分区表,以新的分区方案为基础。新创建的表包括由ALTER 表
语句应用的任何更改,并将表数据复制到新的表结构中。
表17.22 在线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|EXCLUSISVE} 支持RANGE 和LIST 分区,ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSISVE} 支持HASH 和KEY 分区,ALGORITHM=COPY, LOCK={SHARED|EXCLUSIVE} 支持所有分区类型。对于以RANGE 或LIST 分区的表,不复制现有数据。使用ALGORITHM=COPY 时,允许并发查询,以HASH 或LIST 分区为基础,因为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 take no effect。重新构建整个表。请参见第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章,分区。