Estou tentando fazer alguns testes no MySQL Cluster.
Estou criando meu banco de dados usando os seguintes comandos:
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;
Em seguida, preencho a tabela com alguns dados e blobs aleatórios de 50 KB cada. Mas estou recebendo o seguinte erro:
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)
Não é um problema de uso de memória do cluster:
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*50 KB ~= 1 GB Ocorre
esse erro sempre que tento inserir mais de 1 GB de blobs.
Como posso estender o tamanho deste tablespace?
Primeiro 2500*50kB ~= 128MB. Então, se você verificar CREATE TABLESPACE , o padrão de sintaxe INITIAL_SIZE para o arquivo de dados é de 128 MB!
Portanto, se você deseja armazenar mais dados, pode especificar INITIAL_SIZE necessário ao criar o tablespace ou pode ALTER TABLESPACE ADD DATAFILE .
Ao especificar
STORAGE DISK
na instrução CREATE TABLE, você declarou que deseja uma tabela em disco e não na memória. Com essas tabelasALL REPORT MEMORYUSAGE
não mostra nada significativo para essa tabela.Se você deseja uma tabela NDB "clássica" que é armazenada na memória, basta pular os
TABLESPACE ts1 STORAGE DISK
modificadores e, em seguidaALL REPORT MEMORYUSAGE
, mostrará quanta memória é usada para os dados e índices.A palavra-chave
INITIAL_SIZE
é enganosa para ambosCREATE TABLESPACE
eCREATE LOGFILE GROUP
. Ele sugere que o arquivo pode ser estendido automaticamente sob demanda, mas na verdade não . Portanto,INITIAL_SIZE
é apenasSIZE
.Não há nada a ver
ALL REPORT MEMORY USAGE
aqui, pois sua tabela é criada no disco (por causa deCREATE TABLE .. TABLESPACE ts1 STORAGE DISK
). Apenas oid
campo você é armazenado na memória (desdePRIMARY KEY
). Se você está interessado nos bytes livres no tablespace, useINFORMATION_SCHEMA.FILES
, comoNota: Bytes_free não aumenta se você
DELETE
sair da tabela. O espaço em disco é recuperado apenas se for feitoOPTIMIZE TABLE
apósDELETE
ou se for executadoTRUNCATE TABLE
.Nota 2: Para tabelas de disco, MySQL Cluster usa formato de linha fixo, portanto,
VARCHAR(10000)
é tratado comoCHAR(10000)
. UsarBLOB
ouTEXT
é ainda mais complicado: os primeiros 256 bytes são armazenados noDataMemory
e o restante é dividido em blocos de 2k e armazenados em uma tabela auxiliar. Portanto, inserindo 5.000 registros de 1k na tabela acima, teremos um resultado como esseAntes da:
Depois:
Uso de disco