文档首页
MySQL 8.4 参考手册
相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  在线 DDL 操作

17.12.1 在线 DDL 操作

本节中的以下主题提供了 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 INDEXALTER 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

    当您创建 UNIQUEPRIMARY 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_tablesstrict_all_tables 标志时才允许;当 SQL_MODE 设置为严格模式时,允许使用 ALGORITHM=INPLACE,但如果请求的主键列包含 NULL 值,语句仍然可能失败。 ALGORITHM=INPLACE 的行为更符合标准。

    如果您创建的表没有主键,InnoDB 会为您选择一个主键,它可以是定义在 NOT NULL 列上的第一个 UNIQUE 键,也可以是系统生成的键。为了避免不确定性和潜在的额外隐藏列的空间需求,请将 PRIMARY KEY 子句作为 CREATE TABLE 语句的一部分。

    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 是* 是*
修改 ENUMSET 列的定义

语法和使用说明
  • 添加列

    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

    • INSTANT 算法添加列时,MySQL 会检查行大小,如果添加超过限制,则会抛出以下错误。

      ERROR 4092 (HY000): 由于添加列后,最大可能的行大小超过了最大允许的行大小,因此无法使用 ALGORITHM=INSTANT 添加列。请尝试使用 ALGORITHM=INPLACE/COPY。

    • 使用 INSTANT 算法添加列后,表内部表示中的最大列数不能超过 1022。错误消息为

      ERROR 4158 (HY000): 无法再将列添加到 tbl_name 中,使用 ALGORITHM=INSTANT。请尝试使用 ALGORITHM=INPLACE/COPY

    • INSTANT 算法不能向系统模式表添加或删除列,例如内部 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=INSTANTADD COLUMNDROP COLUMN 操作将被拒绝,并显示错误消息,建议使用 COPYINPLACE 算法重建表。

    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 算法用于删除列时,以下限制适用

    • 删除列不能与其他不支持 ALGORITHM=INSTANTALTER 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=INSTANTADD COLUMNDROP COLUMN 操作将被拒绝,并显示错误消息,建议使用 COPYINPLACE 算法重建表。

    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=INSTANTALGORITHM=COPY 或其他导致操作使用这些算法的条件,则 ALTER TABLE 语句将失败。

    ALGORITHM=INSTANT 支持重命名虚拟列;ALGORITHM=INPLACE 不支持。

    ALGORITHM=INSTANTALGORITHM=INPLACE 不支持在同一个语句中添加或删除虚拟列时重命名列。在这种情况下,只支持 ALGORITHM=COPY

  • 重新排序列

    要重新排序列,请在 CHANGEMODIFY 操作中使用 FIRSTAFTER

    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_TABLESSTRICT_TRANS_TABLES SQL_MODE。如果列包含 NULL 值,则操作将失败。服务器禁止更改可能导致引用完整性丢失的外键列。请参阅 第 15.1.9 节“ALTER TABLE 语句”。数据将被大量重新组织,这使其成为一项昂贵的操作。

  • 修改 ENUMSET 列的定义

    CREATE TABLE t1 (c1 ENUM('a', 'b', 'c'));
    ALTER TABLE t1 MODIFY COLUMN c1 ENUM('a', 'b', 'c', 'd'), ALGORITHM=INSTANT;

    通过将新的枚举或集合成员添加到有效成员值列表的 末尾,可以立即或原地修改 ENUMSET 列的定义,只要数据类型的存储大小不发生变化。例如,将一个成员添加到具有 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 支持。星号表示其他信息、异常或依赖项。有关详细信息,请参阅 语法和使用说明

表 17.19 在线 DDL 对外键操作的支持

操作 即时 就地 重建表 允许并发 DML 仅修改元数据
添加外键约束 是*
删除外键约束

语法和使用说明
  • 添加外键约束

    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

    或者,查询 Information Schema TABLE_CONSTRAINTS 表并使用 CONSTRAINT_NAMECONSTRAINT_TYPE 列来标识外键名称。

    您也可以在一个语句中删除外键及其关联的索引

    ALTER TABLE table DROP FOREIGN KEY constraint, DROP INDEX index;
注意

如果 外键 已经存在于要修改的表中(即,它是包含 FOREIGN KEY ... REFERENCE 子句的 子表),即使不直接涉及外键列,对在线 DDL 操作也适用额外的限制

  • 如果对子表的 ALTER TABLE 会等待另一个事务提交,这是因为对父表的更改会导致子表通过使用 CASCADESET NULL 参数的 ON UPDATEON DELETE 子句在子表中进行关联更改。

  • 同样,如果一个表是外键关系中的 父表,即使它不包含任何 FOREIGN KEY 子句,它也可能等待 ALTER TABLE 完成,如果 INSERTUPDATEDELETE 语句会导致子表中的 ON UPDATEON DELETE 操作。

表操作

下表概述了对表操作的在线 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_PERSISTENTSTATS_AUTO_RECALCSTATS_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 算法,但不允许 ALGORITHMLOCK 语法。

  • 使用 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 TABLE 分区子句之外,分区 InnoDB 表的在线 DDL 操作遵循适用于普通 InnoDB 表的相同规则。

某些 ALTER TABLE 分区子句不会像普通非分区 InnoDB 表一样经过相同的内部在线 DDL API。因此,对 ALTER TABLE 分区子句的在线支持会有所不同。

下表显示了每个 ALTER TABLE 分区语句的在线状态。无论使用哪种在线 DDL API,MySQL 都尽力最大程度地减少数据复制和锁定(在可能的情况下)。

使用 ALGORITHM=COPY 或只允许 ALGORITHM=DEFAULT, LOCK=DEFAULTALTER TABLE 分区选项使用 COPY 算法对表进行重新分区。换句话说,将使用新的分区方案创建新的分区表。新创建的表包含 ALTER TABLE 语句应用的任何更改,并且表数据将复制到新的表结构中。

表 17.22 在线 DDL 对分区操作的支持

分区子句 即时 就地 允许 DML 注释
PARTITION BY 允许 ALGORITHM=COPYLOCK={DEFAULT|SHARED|EXCLUSIVE}
ADD PARTITION 是* 是* ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSISVE} 支持 RANGELIST 分区,ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSISVE} 支持 HASHKEY 分区,而 ALGORITHM=COPY, LOCK={SHARED|EXCLUSIVE} 支持所有类型的分区。对于通过 RANGELIST 分区的表,不会复制现有数据。对于通过 HASHLIST 分区的表,使用 ALGORITHM=COPY 时允许并发查询,因为 MySQL 在保持共享锁的同时复制数据。
DROP PARTITION 是* 是*

ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSIVE} 支持。对于通过 RANGELIST 分区的表,不会复制数据。

使用 ALGORITHM=INPLACEDROP PARTITION 会删除存储在分区中的数据并删除该分区。但是,使用 ALGORITHM=COPYold_alter_table=ONDROP PARTITION 会重建分区表,并尝试将数据从已删除的分区移动到具有兼容 PARTITION ... VALUES 定义的另一个分区。无法移动到另一个分区的数据将被删除。

DISCARD PARTITION 仅允许 ALGORITHM=DEFAULTLOCK=DEFAULT
IMPORT PARTITION 仅允许 ALGORITHM=DEFAULTLOCK=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 忽略 ALGORITHMLOCK 子句。重建整个表。参见 第 26.3.4 节,“维护分区”
REBUILD PARTITION 是* ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} 支持。
REPAIR PARTITION
REMOVE PARTITIONING 允许 ALGORITHM=COPYLOCK={DEFAULT|SHARED|EXCLUSIVE}

对分区表的非分区在线 ALTER TABLE 操作遵循与普通表相同的规则。但是,ALTER TABLE 会对每个表分区执行在线操作,由于对多个分区执行操作,这会导致对系统资源的需求增加。

有关 ALTER TABLE 分区子句的更多信息,请参见 分区选项第 15.1.9.1 节,“ALTER TABLE 分区操作”。有关分区的一般信息,请参见 第 26 章,分区