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 を指定できます。
CREATE TABLEステートメントでSTORAGE DISK
を指定することにより、 ディスク上 テーブルがメモリ内にないことを希望すると述べました。そのようなテーブルでは、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
_を使用します。
_mysql> select FILE_NAME, FREE_EXTENTS*EXTENT_SIZE as bytes_free, extra from information_schema.FILES where TABLESPACE_NAME='ts_1' and FILE_TYPE="DATAFILE";
+-----------+------------+----------------+
| FILE_NAME | bytes_free | extra |
+-----------+------------+----------------+
| data1 | 132120576 | CLUSTER_NODE=3 |
| data1 | 132120576 | CLUSTER_NODE=4 |
+-----------+------------+----------------+
2 rows in set (0.01 sec)
_
注:テーブルからDELETE
した場合、Bytes_freeは増加しません。ディスク領域は、DELETE
の後に_OPTIMIZE TABLE
_を実行した場合、または_TRUNCATE TABLE
_を実行した場合にのみ再利用されます。
注2:ディスクテーブルの場合、MySQL Clusterは固定行形式を使用するため、VARCHAR(10000)
はCHAR(10000)
として処理されます。 BLOB
またはTEXT
の使用はさらに複雑です。最初の256バイトはDataMemory
に格納され、残りは2kのチャンクに分割され、ヘルパーテーブルに格納されます。上記の表に5000個の1kレコードを挿入すると、次のような結果になります。
前:
_+-----------+------------+----------------+------------+
| FILE_NAME | bytes_free | extra | row_format |
+-----------+------------+----------------+------------+
| data1 | 134217728 | CLUSTER_NODE=4 | FIXED |
| data1 | 134217728 | CLUSTER_NODE=3 | FIXED |
+-----------+------------+----------------+------------+
ndb_mgm> all report memory usage;
Node 3: Data usage is 2%(59 32K pages of total 2560)
Node 3: Index usage is 1%(26 8K pages of total 2592)
Node 4: Data usage is 2%(59 32K pages of total 2560)
Node 4: Index usage is 1%(26 8K pages of total 2592)
_
後:
_+-----------+------------+----------------+------------+
| FILE_NAME | bytes_free | extra | row_format |
+-----------+------------+----------------+------------+
| data1 | 123731968 | CLUSTER_NODE=4 | FIXED |
| data1 | 123731968 | CLUSTER_NODE=3 | FIXED |
+-----------+------------+----------------+------------+
ndb_mgm> all report memory usage;
Node 3: Data usage is 4%(120 32K pages of total 2560)
Node 3: Index usage is 1%(42 8K pages of total 2592)
Node 4: Data usage is 4%(120 32K pages of total 2560)
Node 4: Index usage is 1%(42 8K pages of total 2592)
_
ディスクの使用状況
_$> echo $(((134217728-123731968)/5000))
2097
_