MySQL集群NDB 8.0支持使用在线表模式变化ALTER TABLE……算法=默认|原地|复制
。NDB集群处理复制
和原地
描述在接下来的几个段落。
为算法=复制
,mysqldNDB集群处理程序执行下列操作:
告诉数据节点创建一个空表的副本,并使这个副本所需的模式变化。
从原始表中读取行,写他们的副本。
讲述了数据节点删除原表,然后重命名复制。
我们有时称之为”复制”或”离线”ALTER TABLE
。
DML操作时不允许同时复制ALTER TABLE
。
的mysqld复制的ALTER TABLE
声明发布元数据锁,但实际上这只是mysqld。其他NDB
客户可以修改行数据复制ALTER TABLE
,导致不一致。
为算法=原地
,NDB集群处理程序告诉数据节点进行所需的更改,和不执行任何复制的数据。
我们也称之为一个”non-copying”或”在线”ALTER TABLE
。
一个non-copyingALTER TABLE
允许并发DML操作。
算法=即时
不支持NDB 8.0。
不管使用的算法,mysqld需要一个全球模式锁(GSL)而执行ALTER TABLE;这可以防止执行任何(其他)同时在这个或任何其他SQL DDL或备份集群中的节点。这通常不是问题,除非ALTER TABLE
需要很长时间。
一些老版本的NDB集群使用一个特定的语法NDB
为在线ALTER TABLE
操作。语法已经被移除。
添加和删除的操作不同宽度的列上的索引NDB
表出现在网上。在线操作noncopying;也就是说,它们不需要重新创建索引。他们不锁的表被修改其他API访问节点在一个NDB集群(但看到NDB在线操作的局限性后来在这一节中)。这样的操作不需要单用户模式NDB
表变化在一个NDB集群与多个API节点;网上交易可以继续不间断在DDL操作。
算法=原地
网上可以用来执行添加一列
,添加索引
(包括创建索引
语句),指数下降
上的操作NDB
表。在线重命名NDB
表还支持(NDB 8.0之前,这样的列不能在线重命名)。
基于磁盘的列不能被添加到NDB
在线表格。这意味着,如果你想添加一个内存中的一个列NDB
表,使用一个表级存储磁盘
选项,您必须显式声明使用基于内存存储的新列。您已经创建了表空间的example-assuming壹空间
假设您创建的表t1
如下:
mysql > CREATE TABLE t1 (c1 INT >不是零主键> c2 VARCHAR(30) >) >表空间ts1存储磁盘>引擎NDB;查询好,0行影响(1.73秒)记录:0副本:0警告:0
你可以添加一个新的内存列这个表在线如下所示:
mysql > ALTER TABLE t1 >添加列c3 INT COLUMN_FORMAT动态存储记忆,>算法=原地;查询好,0行影响(1.25秒)记录:0副本:0警告:0
这个语句失败如果存储记忆
选择是省略:
mysql > ALTER TABLE t1 >添加列c4 INT COLUMN_FORMAT动态>算法=原地;错误1846 (0 a000):算法=原地不受支持。原因:添加列(s)或添加/重组分区不支持在线。试算法=复制。
如果您省略了COLUMN_FORMAT动态
选择,动态列格式采用自动,但是发出一个警告,如下所示:
mysql >改变在线表t1添加列c4 INT存储记忆;查询好,0行影响,1警告(1.17秒)记录:0副本:警告:0 mysql >显示警告\ G * * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行* * * * * * * * * * * * * * * * * * * * * * * * * * *水平:警告代码:1478信息:不支持动态列c4与存储磁盘,列将成为固定mysql > SHOW CREATE TABLE t1 \ G * * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行* * * * * * * * * * * * * * * * * * * * * * * * * * *表:t1创建表:创建表的t1 (c1的int(11)不是NULL, c2的varchar(30)默认为空,c3的int (11) / * !50606存储内存* / / * !50606年COLUMN_FORMAT动态* /默认为空,c4“int (11) / * !”50606存储内存* /默认为空,主键(c1)) / * !50606表空间ts_1存储磁盘* /引擎= ndbcluster默认字符集= latin1一行在集合中的一个(0.03秒)
的存储
和COLUMN_FORMAT
支持关键字只有在NDB集群;在任何其他版本的MySQL,试图使用这些关键字的创建表
或ALTER TABLE
语句导致一个错误。
还可以使用声明ALTER TABLE……重组分区,算法=原地
没有
选项partition_names
到(partition_definitions
)NDB
表。这可以用于新数据节点之间分配NDB集群数据已经添加到集群网络。这并不执行任何碎片整理,这需要一个优化表
或空ALTER TABLE
声明。有关更多信息,请参见6.7节,“添加NDB集群数据节点在线”。
NDB在线操作的局限性
在线删除列
不支持的操作。
在线ALTER TABLE
,创建索引
,或指数下降
语句添加列或添加或删除索引受到以下限制:
一个给定的网络
ALTER TABLE
可以使用只有一个吗添加一列
,添加索引
,或指数下降
。可以添加一个或多个列在一个声明;只有一个指数可能会创建或删除网络在一个声明中。表被修改并不是锁定对API节点以外的一个在线
ALTER TABLE
添加一列
,添加索引
,或指数下降
操作(或创建索引
或指数下降
运行语句)。然而,对任何其他操作原始表被锁上相同API节点在线操作时执行。改变表必须有一个明确的主键;创建的隐藏的主键
NDB
存储引擎是不够的。使用的存储引擎在线表不能改变。
表空间使用的在线表不能改变。从NDB 8.0.21开始,声明等
ALTER TABLE
是不允许。(错误# 99269,错误# 31180526)ndb_table
…算法=原地,表空间=new_tablespace
NDB集群磁盘数据表一起使用时,它是不可能改变的存储类型(
磁盘
或内存
在线)的列。这意味着,当你添加或删除索引的方式将执行的操作在网上,和你想要的存储类型列或列被改变,你必须使用算法=复制
在声明中,添加或指数下降。
列必须是动态的;也就是说,必须能够使用创建它们
COLUMN_FORMAT动态
。如果您省略了COLUMN_FORMAT动态
采用自动选择,动态列格式。列必须允许
零
值并没有任何明确的默认值以外零
。列添加在线自动创建默认为空
在这里,我们可以看到:mysql > CREATE TABLE t2 (> c1 INT NOT NULL AUTO_INCREMENT主键>)引擎= NDB;查询好,0行影响(1.44秒)mysql > ALTER TABLE t2 >添加列c2 INT, INT >添加列c3, >算法=原地;查询好,0行影响,2警告(0.93秒)mysql >显示创建表t1 \ G * * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行* * * * * * * * * * * * * * * * * * * * * * * * * * *表:t1创建表:创建表的t2 (c1的int (11) NOT NULL AUTO_INCREMENT c2的int(11)默认为空,c3的int(11)默认为空,主键(c1))引擎= ndbcluster默认字符集= latin1一行在集合中的一个(0.00秒)
后列必须添加任何现有的列。如果您试图添加一个列或使用任何现有列前在线
第一个
关键字,语句失败的一个错误。网上现有的表列不能被重新排序。
为在线ALTER TABLE
上的操作NDB
表,以列转换为动态添加在线时,或者当在线创建或删除索引,如下所示(重复创建表
和ALTER TABLE
声明只是为了清晰显示):
mysql > CREATE TABLE t2 (> c1 INT NOT NULL AUTO_INCREMENT主键>)引擎= NDB;查询好,0行影响(1.44秒)mysql > ALTER TABLE t2 >添加列c2 INT, INT >添加列c3, >算法=原地;查询好,0行影响,2警告(0.93秒)mysql >显示警告;* * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行* * * * * * * * * * * * * * * * * * * * * * * * * * *水平:警告代码:1478消息:转换固定字段的c2动态启用在线添加列* * * * * * * * * * * * * * * * * * * * * * * * * * * 2。行* * * * * * * * * * * * * * * * * * * * * * * * * * *水平:警告代码:1478消息:固定字段的c3转化成动态启用在线添加列2行设置(0.00秒)
只列或列添加网络必须是动态的。现有的列不需要;这包括表的主键,也可以固定
,如下所示:
mysql > CREATE TABLE t3 (> c1 INT NOT NULL AUTO_INCREMENT主键COLUMN_FORMAT固定>)引擎= NDB;查询好,0行影响(2.10秒)mysql > ALTER TABLE t3添加列c2 INT,算法=原地;查询好,0行影响,1警告(0.78秒)记录:0副本:0警告:0 mysql >显示警告;* * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行* * * * * * * * * * * * * * * * * * * * * * * * * * *水平:警告代码:1478消息:转换固定字段的c2动态启用在线添加列一行设置(0.00秒)
列不转换固定
来动态
列格式通过重命名操作。更多信息COLUMN_FORMAT
,请参阅CREATE TABLE语句。
的关键
,约束
,忽略
支持关键字在ALTER TABLE
语句的使用算法=原地
。
设置MAX_ROWS
使用一个在线为0ALTER TABLE
声明无效。你必须使用一个复制ALTER TABLE
执行这个操作。(错误# 21960004)