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 COLUMN
,ADD 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
STORAGE
和COLUMN_FORMAT
关键字仅在 NDB 群集中受支持;在任何其他版本的 MySQL 中,尝试在CREATE TABLE或ALTER 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 TABLE,CREATE INDEX或DROP INDEX语句受以下限制:
-
给定的在线ALTER TABLE只能使用
ADD COLUMN
,ADD INDEX
或DROP INDEX
之一。可以在一个语句中在线添加一个或多个列;在一个语句中只能在线创建或删除一个索引。 -
除了运行在线ALTER TABLE
ADD COLUMN
,ADD INDEX
或DROP INDEX
操作(或CREATE INDEX或DROP INDEX语句)的 API 节点以外,未更改的 table 对于 API 节点而言未锁定。但是,在执行联机操作时,该 table 被锁定以防止源自* same * API 节点的任何其他操作。 -
要更改的 table 必须具有显式主键; NDB存储引擎创建的隐藏主键不足以实现此目的。
-
该 table 使用的存储引擎无法在线更改。
-
该 table 使用的 table 空间不能在线更改。 (缺陷#99269,缺陷#31180526)
-
与 NDB 群集磁盘数据 table 一起使用时,无法在线更改列的存储类型(
DISK
或MEMORY
)。这意味着,当您以一种可以在线执行操作的方式添加或删除索引,并且希望更改一个或多个列的存储类型时,必须在添加或删除该语句的语句中使用ALGORITHM=COPY
。指数。
要在线添加的列不能使用BLOB或TEXT类型,并且必须满足以下条件:
-
列必须是动态的。也就是说,必须可以使用
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 TABLE
和ALTER 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=INPLACE
的ALTER TABLE语句支持KEY
,CONSTRAINT
和IGNORE
关键字。
从 NDB Cluster 7.5.7 和 7.6.3 开始,不允许使用在线ALTER TABLE
语句将MAX_ROWS
设置为 0.您必须使用副本ALTER TABLE
来执行此操作。 (缺陷号 21960004)