web-dev-qa-db-ja.com

MySQL Cluster-NDBからエラー1601「エクステント、テーブルスペースがいっぱいです」が発生する

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を挿入しようとするといつでもこのエラーが発生します。
このテーブルスペースのサイズを拡張するにはどうすればよいですか?

2
Michał Herman

最初の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はデータとインデックスに使用されるメモリの量を示します。

3

キーワード_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
_
0