Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Online DDL Operations

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 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支持主要键操作

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语句。

    当您创建UNIQUEPRIMARY 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_tablesstrict_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 TABLEOPTIMIZE 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算法删除列时,以下限制适用:

    • 不能在同一个语句中与其他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 TABLEOPTIMIZE 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是支持的。

  • 重新排序列

    要重新排序列,使用FIRSTAFTERCHANGEMODIFY操作中。

    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.
    Note

    VARCHAR 列的字节长度取决于字符集的字节长度。

    减少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_TABLESSTRICT_TRANS_ TABLESSQL_MODE以成功执行操作。如果列包含NULL值,操作将失败。服务器禁止对可能导致引用完整性丢失的外键列进行更改。请参阅第15.1.9节,“ALTER TABLE Statement”。数据将被重组,导致昂贵的操作。

  • 修改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支持生成列操作

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

    或者,查询信息SchemaTABLE_CONSTRAINTS表,并使用CONSTRAINT_NAMECONSTRAINT_TYPE列来确定外键名称。

    您也可以在单个语句中删除外键和其关联索引:

    ALTER TABLE table DROP FOREIGN KEY constraint, DROP INDEX index;
Note

如果表中已经存在外键(即是子表,包含FOREIGN KEY ... REFERENCE子句),对该表进行在线DDL操作时,还会应用额外的限制,即使这些操作不直接涉及到外键列:

  • ALTER TABLE语句对子表的执行可能会等待另一个事务提交,如果父表中的更改导致子表中的相应更改通过ON UPDATEON DELETE子句使用CASCADESET NULL参数。

  • 同样,如果一个表是外键关系中的父表,即使它不包含任何FOREIGN KEY子句,它也可能会等待ALTER TABLE语句完成,如果一个INSERTUPDATEDELETE语句导致子表中的ON UPDATEON 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_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索引的表进行in-place操作。该操作使用INPLACE算法,但ALGORITHMLOCK语句不被允许。

  • 使用FORCE选项重建表

    ALTER TABLE tbl_name FORCE, ALGORITHM=INPLACE, LOCK=NONE;

    从MySQL 5.6.17开始使用ALGORITHM=INPLACEALGORITHM=INPLACE不支持在表中包含FULLTEXT索引的表。

  • 执行“null”重建

    ALTER TABLE tbl_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;

    从MySQL 5.6.17开始使用ALGORITHM=INPLACEALGORITHM=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

分区操作

除了某些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=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分区的表,不复制现有数据。使用ALGORITHM=COPY时,允许并发查询,以HASHLIST分区为基础,因为MySQL在持有共享锁的情况下将数据复制。
DROP PARTITION 是* 是*

ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSIVE} 是支持的。对表分区以RANGELIST方式不复制数据。

DROP PARTITION with ALGORITHM=INPLACE 删除存储在分区中的数据并删除分区。然而,DROP PARTITION with ALGORITHM=COPYold_alter_table=ON 重新构建分区表并尝试将从删除的分区中移动数据到另一个具有兼容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 take no effect。重新构建整个表。请参见第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章,分区