NDB集群磁盘数据存储采用多个磁盘数据对象.其中包括:
表空间充当其他磁盘数据对象的容器。
Undo日志文件撤消回滚事务所需的信息。
将一个或多个撤消日志文件分配给日志文件组,然后将其分配给表空间。
数据文件storage Disk Data表数据。数据文件直接分配给表空间。
Undo日志文件和数据文件是每个数据节点文件系统中的实际文件;默认情况下,它们被放置在ndb_
在node_id
_fsDataDir
在NDB集群中指定config.ini
文件,node_id
为数据节点的节点ID。在创建撤消日志或数据文件时,可以将绝对路径或相对路径指定为文件名的一部分,从而将这些文件放在其他地方。本节稍后将展示创建这些文件的语句。
NDB集群表空间和日志文件组不作为文件实现。
虽然不是所有Disk Data对象都实现为文件,但它们都共享相同的名称空间。这意味着每个磁盘数据对象必须唯一命名(而不仅仅是给定类型的每个磁盘数据对象)。例如,不能同时命名表空间和日志文件组dd1
.
假设您已经建立了一个包含所有节点(包括管理节点和SQL节点)的NDB集群,在磁盘上创建NDB集群表的基本步骤如下:
创建一个日志文件组,并向其中分配一个或多个undo日志文件(undo日志文件有时也称为undofile).
请注意只有磁盘数据表才需要撤消日志文件;它们不是用来
NDBCLUSTER
仅存储在内存中的表。创建一个表空间;将日志文件组以及一个或多个数据文件分配给表空间。
创建一个Disk Data表,使用该表空间进行数据存储。
中的SQL语句可以完成这些任务中的每一个mysql客户端或其他MySQL客户端应用程序,如下面的示例所示。
我们创建一个名为
lg_1
使用创建日志文件组
.这个日志文件组将由两个撤消日志文件组成,我们将其命名undo_1.log
而且undo_2.log
,其初始大小分别为16mb和12mb。(undo日志文件的初始大小缺省为128mb)也可以指定日志文件组的undo缓冲区大小,或者允许它采用缺省值8mb。在本例中,我们将undo缓冲区的大小设置为2mb。所以我们添加undo_1.log
来lg_1
在这个创建日志文件组
声明:添加UNDOFILE 'undo_1.log' INITIAL_SIZE 16M UNDO_BUFFER_SIZE 2M ENGINE NDBCLUSTER;
添加
undo_2.log
对于日志文件组,使用以下命令修改日志文件组
声明:修改LOGFILE组lg_1添加UNDOFILE 'undo_2.log' INITIAL_SIZE 12M ENGINE NDBCLUSTER;
需要注意的事项:
的
. log
此处使用的文件扩展名不是必需的。我们使用它只是为了使日志文件易于识别。每一个
创建日志文件组
而且修改日志文件组
语句必须包含引擎
选择。此选项仅允许的值为NDBCLUSTER
而且NDB
.重要的同一NDB集群在任何时间内最多只能存在一个日志文件组。
将撤消日志文件添加到日志文件组时使用
添加UNDOFILE”
,一个文件名文件名
'文件名
在ndb_
目录内node_id
_fsDataDir
的每个数据节点,其中node_id
为数据节点的节点ID。每个undo日志文件的大小与SQL语句中指定的大小一致。例如,如果一个NDB集群有4个数据节点,那么修改日志文件组
语句创建4个undo日志文件,在4个数据节点的data目录中各有1个on;每个文件都有名称undo_2.log
每个文件大小为12mb。UNDO_BUFFER_SIZE
受可用系统内存量的限制。有关的更多信息
创建日志文件组
声明中,看到第13.1.15节," CREATE LOGFILE GROUP Statement ".有关修改日志文件组
,请参阅第13.1.5节,“ALTER LOGFILE GROUP语句”.
现在我们可以创建一个表空间,其中包含NDB集群磁盘数据表用于存储数据的文件。表空间还与特定的日志文件组相关联。创建新表空间时,必须指定用于撤销日志记录的日志文件组;您还必须指定一个数据文件。创建表空间后,可以向表空间中添加更多的数据文件;也可以从表空间删除数据文件(本节稍后将提供删除数据文件的示例)。
假设我们希望创建一个名为
ts_1
它使用lg_1
作为其日志文件组。此表空间包含两个命名为data_1.dat
而且data_2.dat
,其初始大小分别为32 MB和48 MB。的默认值INITIAL_SIZE
我们可以使用两个SQL语句来实现,如下所示:创建表空间ts_1,添加一个名为data_1.dat的数据文件,使用LOGFILE组lg_1。在表空间ts_1中添加一个名为data_2.dat的数据文件。
的
创建表空间
语句创建表空间ts_1
使用数据文件data_1.dat
,和同事ts_1
使用日志文件组lg_1
.的修改表空间
添加第二个数据文件(data_2.dat
).需要注意的事项:
就像
. log
本例中用于undo日志文件的文件扩展名,对于.dat
文件扩展名;它只是用来方便地识别数据文件。将数据文件添加到表空间时使用
添加数据文件”
,一个文件名文件名
'文件名
在ndb_
目录内node_id
_fsDataDir
的每个数据节点,其中node_id
为数据节点的节点ID。每个数据文件都具有SQL语句中指定的大小。例如,如果一个NDB集群有4个数据节点,那么修改表空间
语句创建4个数据文件,在4个数据节点的数据目录中各有1个;每个文件都有名称data_2.dat
每个文件大小为48 MB。NDB 7.6(以及更高版本)保留每个表空间的4%供数据节点重启时使用。此空间不能用于存储数据。
所有
创建表空间
而且修改表空间
语句必须包含引擎
条款;表空间中只能创建与表空间使用相同存储引擎的表。对于NDB Cluster表空间,该选项仅允许的值为NDBCLUSTER
而且NDB
.有关的更多信息
创建表空间
而且修改表空间
语句,看到第13.1.19节“创建表空间语句”,第13.1.9节:ALTER表空间语句.
现在可以创建一个表,其非索引列存储在磁盘的表空间中
ts_1
:CREATE TABLE dt_1 (member_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, last_name VARCHAR(50) NOT NULL, first_name VARCHAR(50) NOT NULL, dob DATE NOT NULL, joined DATE NOT NULL, INDEX(last_name, first_name))表空间ts_1存储NDBCLUSTER;
的
表空间……存储磁盘
选项告诉NDBCLUSTER
存储引擎使用表空间ts_1
用于磁盘数据存储。一次表
ts_1
已创建如图所示,您可以执行吗插入
,选择
,更新
,删除
语句,就像处理其他MySQL表一样。方法还可以指定单个列是存储在磁盘上还是存储在内存中
存储
子句作为列定义的一部分创建表
或ALTER TABLE
声明。存储磁盘
将列存储在磁盘上,并且存储记忆
导致使用内存内存储。看到第13.1.18节," CREATE TABLE语句",以查询更多资料。
对磁盘上隐式存储的列进行索引。对于表dt_1
如刚才所示示例中所定义的,只有强加于人
而且加入
列存储在磁盘上。这是因为在id
,last_name
,first_name
列,因此属于这些列的数据存储在RAM中。只有非索引的列可以保存在磁盘上;索引和索引列数据继续存储在内存中。在设计Disk Data表时,必须考虑使用索引和节省RAM之间的权衡。
不能向已显式声明的列添加索引存储磁盘
,而不先将其存储类型更改为内存
;任何这样做的尝试都失败并出现错误。这一列隐式地使用磁盘存储可以被索引;完成此操作后,列的存储类型将更改为内存
自动。通过”隐式地”,我们指的是没有声明存储类型,但从父表继承的列。在下面的CREATE TABLE语句中(使用表空间ts_1
前面定义),列c2
而且c3
隐式使用磁盘存储:
mysql> CREATE TABLE ti (-> c1 INT PRIMARY KEY, -> c2 INT, -> c3 INT, -> c4 INT ->) -> STORAGE DISK -> TABLESPACE ts_1 -> ENGINE NDBCLUSTER;查询OK, 0行受影响(1.31秒)
因为c2
,c3
,c4
难道自己不宣告与存储磁盘
,就可以将它们编入索引。在这里,我们添加索引c2
而且c3
分别使用创建索引
而且ALTER TABLE
:
CREATE INDEX i1 ON ti(c2);查询OK, 0 rows affected (2.72 sec) Records: 0 duplicate: 0 Warnings: 0 mysql> ALTER TABLE ti ADD INDEX i2(c3);查询OK, 0 rows affected (0.92 sec) Records: 0 duplicate: 0 warning: 0
显示创建表
确认已添加索引。
mysql >显示创建表ti \ G *************************** 1。行 *************************** 表:ti创建表:创建表“透明国际”(c1的int(11)不是NULL, c2的int(11)默认为空,c3的int(11)默认为空,c4的int(11)默认为空,主键(c1),关键的i1 (c2),关键的i2 (c3)) / * !50100表空间' ts_1 ' STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1
你可以看到ndb_desc索引列(强调的文本)现在使用内存中而不是磁盘上的存储:
壳>。/ ndb_desc - d测试t1 - t1 -版本:33554433片段类型:HashMapPartition K值:6分钟负载因素:78年最大负荷系数:80临时表:没有数量的属性:4号主键:1纳数据长度:317 Max行:0行校验和:1行GCI: 1 SingleUserMode: 0 ForceVarPart: 1 PartitionCount: 4 FragmentCount: 4 PartitionBalance: FOR_RP_BY_LDM ExtraRowGciBits: 0 ExtraRowAuthorBits: 0 TableStatus:检索表选项:HashMap:——属性——c1 Int主键分配键AT=固定ST=内存c3 Int NULL AT=固定ST=内存c4 Int NULL AT=FIXED ST=DISK——Indexes——PRIMARY KEY(c1) - UniqueHashIndex i2(c3) - OrderedIndex PRIMARY(c1) - OrderedIndex i1(c2) - OrderedIndex NDBT_ProgramExit: 0 - OK
性能报告。如果磁盘数据文件保存在与数据节点文件系统独立的物理磁盘上,那么使用磁盘数据存储的集群的性能将得到极大提高。必须为集群中的每个数据节点这样做,才能获得明显的好处。
可以使用绝对和相对文件系统路径添加UNDOFILE
而且添加数据文件
.相对路径是相对于数据节点的数据目录计算的。你也可以使用符号链接;看到第21.5.10.2节“在磁盘数据对象中使用符号链接”,以获取更多信息和示例。
必须按照特定的顺序创建日志文件组、表空间和使用它们的任何Disk Data表。同样的道理也适用于删除这些对象:
只要有任何表空间在使用日志文件组,就不能删除它。
只要表空间包含任何数据文件,就不能删除表空间。
只要还有任何表在使用表空间,就不能从表空间删除任何数据文件。
不能删除与创建文件的表空间不同的表空间关联创建的文件。(错误# 20053)
例如,要删除到目前为止在这一节中创建的所有对象,您可以使用以下语句:
删除表表删除数据库表空间ts_1—删除数据库表空间DATAFILE ' dat_2 .dat'—删除数据库表空间ts_1删除数据库表空间ts_1 -删除数据库表空间DATAFILE 'data_1.dat'删除表空间ts_1 ->引擎mysql> DROP LOGFILE GROUP lg_1 -> ENGINE NDBCLUSTER;
这些语句必须按照所示的顺序执行,除了这两个改变表空间……删除数据文件
语句可以按任意一种顺序执行。
查询“磁盘数据”表使用的数据文件信息文件
表中INFORMATION_SCHEMA
数据库。一个额外的”零
行”提供有关undo日志文件的附加信息。有关更多信息和示例,请参见第24.3.9节“INFORMATION_SCHEMA文件表”.