MySQL NDB Cluster 8.0支持使用标准在线修改表模式ALTER TABLE
MySQL服务器使用的语法(算法=默认|原地|复制
),并在别处有所描述。
一些旧版本的NDB集群使用特定的语法NDB
为在线ALTER TABLE
操作。该语法已被删除。
的可变宽度列上添加和删除索引的操作NDB
表是在线出现的。在线操作是非复制的;也就是说,它们不需要重新创建索引。它们不锁定NDB集群中其他API节点正在修改的表(但请参见NDB在线操作的局限性,在本节后面)。这样的操作不需要单用户模式进行NDB
在具有多个API节点的NDB集群中更改表;事务可以在在线DDL操作期间不间断地继续进行。
算法=原地
可以用来在线执行吗添加一列
,添加索引
(包括创建索引
语句),指数下降
上的操作NDB
表。在线重命名NDB
还支持表格。
在此之前,NDB
不能在线重命名表;这一限制在NDB 8.0.18中被取消。
当前不能将基于磁盘的列添加到NDB
在线表格。这意味着,如果您希望将内存中的列添加到NDB
使用表级的表存储磁盘
选项,则必须显式地将新列声明为使用基于内存的存储。例如,假设您已经创建了表空间壹空间
假设你创建了一个表t1
如下:
mysql> CREATE TABLE t1 (> c1 INT NOT NULL PRIMARY KEY, > c2 VARCHAR(30) > TABLESPACE ts1 STORAGE DISK > ENGINE NDB;查询OK, 0行受影响(1.73秒)记录:0重复:0警告:0
你可以在线向这个表中添加一个新的内存列,如下所示:
mysql> ALTER TABLE t1 > ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC STORAGE MEMORY, > ALGORITHM=INPLACE;查询确定,0行受影响(1.25秒)记录:0重复:0警告:0
,则此语句失败存储记忆
选项省略:
mysql> ALTER TABLE t1 > ADD COLUMN c4 INT COLUMN_FORMAT DYNAMIC, > ALGORITHM=INPLACE;ERROR 1846 (0A000): ALGORITHM=INPLACE不支持。原因:不支持在线添加列或添加/重组分区。试算法=复制。
如果省略COLUMN_FORMAT动态
选项,则会自动使用动态列格式,但会发出警告,如下所示:
mysql> ALTER ONLINE TABLE t1查询OK, 0 rows affected, 1 warning (1.17 sec) Records: 0 duplicate: 0 Warnings: 0 mysql> SHOW Warnings \G *************************** 1.查询OK, 0 rows affected, 1 warning (1.17 sec)命令行***************************级别:警告代码:1478消息:DYNAMIC column c4 with STORAGE DISK不支持,column将变成FIXED mysql> SHOW CREATE TABLE t1\G ***************************行 *************************** 表:t1创建表:创建表的t1 (c1的int(11)不是NULL, c2的varchar(30)默认为空,c3的int (11) / * !50606内存*/ /*!NULL, ' c4 ' int(11) /*!50606存储内存*/ NULL,主键(' c1 ')) /*!50606 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1(0.03秒)
的存储
而且COLUMN_FORMAT
关键字仅在NDB集群中支持;在任何其他版本的MySQL中,试图使用这些关键字中的任何一个创建表
或ALTER TABLE
语句将导致错误。
也可以使用语句修改表…重新组织分区,算法= inplace
没有
选项partition_names
到(partition_definitions
)NDB
表。这可以用于在在线添加到集群的新数据节点之间重新分配NDB集群数据。这并不执行任何碎片整理,这需要优化表
或空ALTER TABLE
声明。有关更多信息,请参见第23.5.7节在线添加NDB集群数据节点.
NDB在线操作的局限性
在线删除列
不支持操作。
在线ALTER TABLE
,创建索引
,或指数下降
添加列或添加或删除索引的语句受以下限制:
一个给定的在线
ALTER TABLE
只能使用其中之一吗添加一列
,添加索引
,或指数下降
.可以在一条语句中在线添加一个或多个列;在一条语句中只能在线创建或删除一个索引。被修改的表对API节点没有锁定,而在线的API节点除外
ALTER TABLE
添加一列
,添加索引
,或指数下降
操作(或创建索引
或指数下降
语句)运行。对象上发起的任何其他操作都会锁定该表相同API节点。要修改的表必须有显式的主键;属性创建的隐藏主键
NDB
存储引擎不能满足此目的。表使用的存储引擎不能在线修改。
表使用的表空间不能在线修改。从NDB 8.0.21开始,出现了如下语句
ALTER TABLE
是特别禁止的。(Bug #99269, Bug #31180526)ndb_table
...算法=原地,表空间=new_tablespace
当与NDB集群磁盘数据表一起使用时,不可能更改存储类型(
磁盘
或内存
)的一个在线专栏。这意味着,当以在线执行操作的方式添加或删除索引时,并且希望更改列的存储类型时,必须使用算法=复制
在添加或删除索引的语句中。
列必须是动态的;也就是说,必须能够使用
COLUMN_FORMAT动态
.如果省略COLUMN_FORMAT动态
选项,则自动使用动态列格式。柱子必须允许
零
值,并且没有任何显式的默认值零
.在线添加的列将自动创建为默认为空
,如下图所示:mysql> CREATE TABLE t2 (> c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY >)mysql> ALTER TABLE t2 > ADD COLUMN c2 INT, > ADD COLUMN c3 INT, > ALGORITHM=INPLACE;查询好,0行影响,2警告(0.93秒)mysql >显示创建表t1 \ G *************************** 1。列***************************表:t1创建表:Create表' t2 ' (' c1 ' int(11) NOT NULL AUTO_INCREMENT, ' c2 ' int(11) DEFAULT NULL, ' c3 ' int(11) DEFAULT NULL,主键(' c1 ')) ENGINE=ndbcluster DEFAULT CHARSET=latin1 1 row in set (0.00 sec)
列必须添加到任何现有列之后。方法在任何现有列之前在线添加列或使用
第一个
关键字,则语句失败并报错。现有的表列不能在线重新排序。
为在线ALTER TABLE
上的操作NDB
当在线添加表和固定格式列时,或者在线创建或删除索引时,它们将被转换为动态的,如下所示(重复创建表
而且ALTER TABLE
为了清晰起见,只列出了以下语句):
mysql> CREATE TABLE t2 (> c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY >)mysql> ALTER TABLE t2 > ADD COLUMN c2 INT, > ADD COLUMN c3 INT, > ALGORITHM=INPLACE;查询OK, 0行影响,2警告(0.93秒)mysql>显示警告;*************************** 1。行 *************************** 级别:警告代码:1478信息:转换固定字段的c2动态启用在线添加列 *************************** 2。row ***************************级别:警告代码:1478消息:将FIXED字段“c3”转换为DYNAMIC以启用在线添加set中的COLUMN 2行(0.00 sec)
只有在线添加的一个或多个列必须是动态的。现有的列不需要;这包括表的主键,也可以是固定
,如图所示:
mysql> CREATE TABLE t3 (> c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY COLUMN_FORMAT FIXED >)mysql> ALTER TABLE t3 ADD COLUMN c2 INT, ALGORITHM=INPLACE;查询OK, 0行影响,1警告(0.78秒)记录:0重复:0警告:0 mysql>显示警告;*************************** 1。级别:警告代码:1478消息:将FIXED字段“c2”转换为DYNAMIC以启用在线添加set (0.00 sec)中的COLUMN 1行
列不能从固定
来动态
通过重命名操作来格式化列。欲了解更多有关COLUMN_FORMAT
,请参阅第13.1.20节“CREATE TABLE语句”.
的关键
,约束
,忽略
关键字在ALTER TABLE
语句的使用算法=原地
.
设置MAX_ROWS
到0使用在线ALTER TABLE
声明不被允许。你必须使用复印ALTER TABLE
执行该操作。(错误# 21960004)