我正在尝试对 MySQL Cluster 进行一些测试。
我正在使用以下命令创建我的数据库:
CREATE DATABASE test1;
use test1;
CREATE LOGFILE GROUP lg1
ADD UNDOFILE 'undofile.dat'
ENGINE = NDB;
CREATE TABLESPACE ts1
ADD DATAFILE 'datafile.dat'
USE LOGFILE GROUP lg1
ENGINE = NDB;
CREATE TABLE `dane` (
`id` int(11) NOT NULL,
`data` blob NOT NULL,
PRIMARY KEY (`id`)
)
TABLESPACE ts1 STORAGE DISK
engine=ndb;
然后我用一些数据和每个 50KB 的随机 blob 填充表。但我收到以下错误:
mysql> INSERT INTO dane(id, data) VALUES(3790, randomBlob(51200));
ERROR 1114 (HY000): The table 'dane' is full
mysql> show warnings;
+---------+------+--------------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------------+
| Warning | 1296 | Got error 1601 'Out extents, tablespace full' from NDB |
| Error | 1114 | The table 'dane' is full |
+---------+------+--------------------------------------------------------+
2 rows in set (0,00 sec)
mysql> select count(*) from dane;
+----------+
| count(*) |
+----------+
| 2507 |
+----------+
1 row in set (0,03 sec)
这不是集群内存使用问题:
ndb_mgm> ALL REPORT MEMORYUSAGE
Connected to Management Server at: localhost:1186
Node 3: Data usage is 6%(164 32K pages of total 2560)
Node 3: Index usage is 7%(178 8K pages of total 2432)
2500*50KB ~= 1GB
每当我尝试插入超过 1GB 的 blob 时都会出现此错误。
如何扩展此表空间的大小?
第一个 2500*50kB ~= 128MB。然后,如果您检查CREATE TABLESPACE语法,则数据文件的默认 INITIAL_SIZE 为 128MB!
因此,如果您想存储更多数据,您可以在创建表空间时指定所需的 INITIAL_SIZE ,也可以ALTER TABLESPACE ADD DATAFILE。
通过
STORAGE DISK
在 CREATE TABLE 语句中指定,您声明要在磁盘表上而不是在内存中。使用这样的表ALL REPORT MEMORYUSAGE
显示对该表没有任何意义。如果您想要存储在内存中的“经典” NDB 表,只需跳过
TABLESPACE ts1 STORAGE DISK
修饰符,然后ALL REPORT MEMORYUSAGE
将显示用于数据和索引的内存量。该关键字对和
INITIAL_SIZE
都具有误导性。它表明该文件可能会按需自动扩展,但实际上不是。所以只是.CREATE TABLESPACE
CREATE LOGFILE GROUP
INITIAL_SIZE
SIZE
这里没有任何关系
ALL REPORT MEMORY USAGE
,因为您的表是在磁盘上创建的(因为CREATE TABLE .. TABLESPACE ts1 STORAGE DISK
)。只有id
您存储在内存中的字段(从 开始PRIMARY KEY
)。我对表空间中的空闲字节感兴趣,请使用INFORMATION_SCHEMA.FILES
,例如注意:
DELETE
如果你从表中增加 Bytes_free 是不会的。只有在执行OPTIMIZE TABLE
之后DELETE
或执行时才会回收磁盘空间TRUNCATE TABLE
。Note2:对于磁盘表 MySQL Cluster 使用固定的行格式,所以
VARCHAR(10000)
被处理为CHAR(10000)
. 使用BLOB
orTEXT
则更复杂:前 256 个字节存储在 the 中DataMemory
,其余的被分成 2k 个块,并存储在一个辅助表中。所以在上表中插入 5000 条 1k 记录,结果是这样的前:
后:
磁盘使用情况