10bet网址
MySQL集群NDB 8.0
相关的文档10bet官方网站 下载这个摘录
PDF (Ltr)- 4.6 mb
PDF (A4)- 4.6 mb


MySQL集群NDB 8.0/NDB集群管理在集群NDB和ALTER TABLE /在线操作

6.11使用ALTER TABLE NDB集群中的在线操作

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 TABLEndb_table…算法=原地,表空间=new_tablespace是不允许。(错误# 99269,错误# 31180526)

  • 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)