21.5.11 NDB 群集中使用 ALTER TABLE 进行的在线操作

MySQL NDB Cluster 7.5 使用 MySQL Server(ALGORITHM=DEFAULT|INPLACE|COPY)所采用的标准ALTER TABLE语法支持联机 table 架构更改,该语法在其他地方进行了介绍。

Note

NDB Cluster 的某些较早版本使用特定于NDB的语法进行在线ALTER TABLE操作。此语法已被删除。

在线在NDBtable 的可变宽度列上添加和删除索引的操作。在线操作不可复制;也就是说,它们不需要重新创建索引。它们不会锁定 NDB 群集中其他 API 节点无法更改的 table(但请参见NDB 在线操作的局限性,本节后面的内容)。对于在具有多个 API 节点的 NDB 集群中进行的NDBtable 更改,此类操作不需要单用户模式。联机 DDL 操作期间,事务可以不间断地 continue 进行。

ALGORITHM=INPLACE可用于对NDB个 table 执行联机ADD COLUMNADD INDEX(包括CREATE INDEX语句)和DROP INDEX操作。还支持在线重命名NDBtable。

当前,您无法在线将基于磁盘的列添加到NDB个 table 中。这意味着,如果希望将内存列添加到使用 table 级STORAGE DISK选项的NDBtable 中,则必须将新列声明为显式使用基于内存的存储。例如,假设您已经创建了 table 空间ts1,则假定您按以下方式创建 tablet1

mysql> CREATE TABLE t1 (
     >     c1 INT NOT NULL PRIMARY KEY,
     >     c2 VARCHAR(30)
     >     )
     >     TABLESPACE ts1 STORAGE DISK
     >     ENGINE NDB;
Query OK, 0 rows affected (1.73 sec)
Records: 0  Duplicates: 0  Warnings: 0

您可以在线添加到此 table 的新的内存列,如下所示:

mysql> ALTER TABLE t1
     >     ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC STORAGE MEMORY,
     >     ALGORITHM=INPLACE;
Query OK, 0 rows affected (1.25 sec)
Records: 0  Duplicates: 0  Warnings: 0

如果省略STORAGE MEMORY选项,则此语句失败:

mysql> ALTER TABLE t1
     >     ADD COLUMN c4 INT COLUMN_FORMAT DYNAMIC,
     >     ALGORITHM=INPLACE;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason:
Adding column(s) or add/reorganize partition not supported online. Try
ALGORITHM=COPY.

如果省略COLUMN_FORMAT DYNAMIC选项,则会自动采用动态列格式,但会发出警告,如下所示:

mysql> ALTER ONLINE TABLE t1 ADD COLUMN c4 INT STORAGE MEMORY;
Query OK, 0 rows affected, 1 warning (1.17 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Warning
   Code: 1478
Message: DYNAMIC column c4 with STORAGE DISK is not supported, column will
become FIXED

mysql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `c1` int(11) NOT NULL,
  `c2` varchar(30) DEFAULT NULL,
  `c3` int(11) /*!50606 STORAGE MEMORY */ /*!50606 COLUMN_FORMAT DYNAMIC */ DEFAULT NULL,
  `c4` int(11) /*!50606 STORAGE MEMORY */ DEFAULT NULL,
  PRIMARY KEY (`c1`)
) /*!50606 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1
1 row in set (0.03 sec)

Note

STORAGECOLUMN_FORMAT关键字仅在 NDB 群集中受支持;在任何其他版本的 MySQL 中,尝试在CREATE TABLEALTER TABLE语句中使用这些关键字中的任何一个都会导致错误。

也可以在NDB个 table 上使用不带partition_names INTO (partition_definitions)选项的ALTER TABLE ... REORGANIZE PARTITION, ALGORITHM=INPLACE语句。这可用于在已在线添加到群集的新数据节点之间重新分配 NDB 群集数据。这不会*不执行任何碎片整理,这需要OPTIMIZE TABLE或 null ALTER TABLE语句。有关更多信息,请参见第 21.5.7 节“在线添加 NDB 群集数据节点”

NDB 在线操作的局限性

不支持在线DROP COLUMN操作。

用于添加列或添加或删除索引的联机ALTER TABLECREATE INDEXDROP INDEX语句受以下限制:

  • 给定的在线ALTER TABLE只能使用ADD COLUMNADD INDEXDROP INDEX之一。可以在一个语句中在线添加一个或多个列;在一个语句中只能在线创建或删除一个索引。

  • 除了运行在线ALTER TABLE ADD COLUMNADD INDEXDROP INDEX操作(或CREATE INDEXDROP INDEX语句)的 API 节点以外,未更改的 table 对于 API 节点而言未锁定。但是,在执行联机操作时,该 table 被锁定以防止源自* same * API 节点的任何其他操作。

  • 要更改的 table 必须具有显式主键; NDB存储引擎创建的隐藏主键不足以实现此目的。

  • 该 table 使用的存储引擎无法在线更改。

  • 该 table 使用的 table 空间不能在线更改。 (缺陷#99269,缺陷#31180526)

  • 与 NDB 群集磁盘数据 table 一起使用时,无法在线更改列的存储类型(DISKMEMORY)。这意味着,当您以一种可以在线执行操作的方式添加或删除索引,并且希望更改一个或多个列的存储类型时,必须在添加或删除该语句的语句中使用ALGORITHM=COPY。指数。

要在线添加的列不能使用BLOBTEXT类型,并且必须满足以下条件:

  • 列必须是动态的。也就是说,必须可以使用COLUMN_FORMAT DYNAMIC创建它们。如果省略COLUMN_FORMAT DYNAMIC选项,则会自动采用动态列格式。

  • 这些列必须允许NULL值,并且除了NULL之外不得具有任何其他默认值。在线添加的列将自动创建为DEFAULT NULL,如下所示:

mysql> CREATE TABLE t2 (
     >     c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY
     >     ) ENGINE=NDB;
Query OK, 0 rows affected (1.44 sec)

mysql> ALTER TABLE t2
     >     ADD COLUMN c2 INT,
     >     ADD COLUMN c3 INT,
     >     ALGORITHM=INPLACE;
Query OK, 0 rows affected, 2 warnings (0.93 sec)

mysql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t2` (
  `c1` int(11) NOT NULL AUTO_INCREMENT,
  `c2` int(11) DEFAULT NULL,
  `c3` int(11) DEFAULT NULL,
  PRIMARY KEY (`c1`)
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
  • 必须在任何现有列之后添加这些列。如果您尝试在线添加任何现有列之前的列或使用FIRST关键字,则该语句将失败并显示错误。

  • 现有 table 列无法在线重新排序。

对于NDBtable 的在线ALTER TABLE操作,将固定格式的列在线添加或在线创建或删除索引时会转换为动态,如下所示(为清楚起见,重复了CREATE TABLEALTER TABLE语句):

mysql> CREATE TABLE t2 (
     >     c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY
     >     ) ENGINE=NDB;
Query OK, 0 rows affected (1.44 sec)

mysql> ALTER TABLE t2
     >     ADD COLUMN c2 INT,
     >     ADD COLUMN c3 INT,
     >     ALGORITHM=INPLACE;
Query OK, 0 rows affected, 2 warnings (0.93 sec)

mysql> SHOW WARNINGS;
*************************** 1. row ***************************
  Level: Warning
   Code: 1478
Message: Converted FIXED field 'c2' to DYNAMIC to enable online ADD COLUMN
*************************** 2. row ***************************
  Level: Warning
   Code: 1478
Message: Converted FIXED field 'c3' to DYNAMIC to enable online ADD COLUMN
2 rows in set (0.00 sec)

只有要在线添加的一个或多个列必须是动态的。现有列不必是;这包括 table 的主键,也可以是FIXED,如下所示:

mysql> CREATE TABLE t3 (
     >     c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY COLUMN_FORMAT FIXED
     >     ) ENGINE=NDB;
Query OK, 0 rows affected (2.10 sec)

mysql> ALTER TABLE t3 ADD COLUMN c2 INT, ALGORITHM=INPLACE;
Query OK, 0 rows affected, 1 warning (0.78 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW WARNINGS;
*************************** 1. row ***************************
  Level: Warning
   Code: 1478
Message: Converted FIXED field 'c2' to DYNAMIC to enable online ADD COLUMN
1 row in set (0.00 sec)

重命名操作不会将列从FIXED列格式转换为DYNAMIC列格式。有关COLUMN_FORMAT的更多信息,请参见第 13.1.18 节“ CREATE TABLE 语句”

使用ALGORITHM=INPLACEALTER TABLE语句支持KEYCONSTRAINTIGNORE关键字。

从 NDB Cluster 7.5.7 和 7.6.3 开始,不允许使用在线ALTER TABLE语句将MAX_ROWS设置为 0.您必须使用副本ALTER TABLE来执行此操作。 (缺陷号 21960004)