web-dev-qa-db-ja.com

テーブルサイズがテーブルスペースよりもはるかに小さい場合でも、「テーブルがいっぱいです」というエラーが発生する

現在、MySQL NDBCluster7.3.5を使用しています。 UNDOFILEhhme.datINITIAL_SIZE=200mで作成しました。

また、1つのテーブルスペースhhmefep_tbsDATAFILEhhmefep_tbs.datINITIAL_SIZE=500M ENGINE=NDBがあります。

また、クエリの出力は次のとおりです。

mysql> select FILE_NAME,TOTAL_EXTENTS,FREE_EXTENTS,EXTENT_SIZE, extra  from information_schema.FILES where TABLESPACE_NAME='hhmefep_tbs' and FILE_TYPE="DATAFILE";
+-----------------+---------------+--------------+-------------+----------------+
| FILE_NAME       | TOTAL_EXTENTS | FREE_EXTENTS | EXTENT_SIZE | extra          |
+-----------------+---------------+--------------+-------------+----------------+
| hhmefep_tbs.dat |           500 |           21 |     1048576 | CLUSTER_NODE=1 |
| hhmefep_tbs.dat |           500 |           21 |     1048576 | CLUSTER_NODE=2 |
+-----------------+---------------+--------------+-------------+----------------+

データベースの合計サイズは32MBで、すべてのテーブルがENGINE=NDBを使用しています。

それでも、挿入を実行すると「テーブルがいっぱいです」というエラーが発生します。

500MBのテーブルスペースはまだ使い果たされていないので、誰かがここで問題を指摘できますか?.

なぜfree_extents = 21を取得するのですか?

編集:このDBスキーマを作成するためのDDLは次のとおりです。

mysql> CREATE LOGFILE GROUP hhme ADD UNDOFILE 'hhme.dat' UNDO_BUFFER_SIZE=16M INITIAL_SIZE=200m ENGINE=NDB;
Query OK, 0 rows affected (9.70 sec)

mysql> CREATE DATABASE hhmefep;
Query OK, 1 row affected (0.05 sec)

mysql> CREATE TABLESPACE hhmefep_tbs ADD DATAFILE 'hhmefep_tbs.dat' USE LOGFILE GROUP hhme INITIAL_SIZE=500M ENGINE=NDB;
Query OK, 0 rows affected (24.30 sec)

[root@mgmtserver ~]$ ndb_mgm -e "all report mem"
Connected to Management Server at: localhost:1186
Node 1: Data usage is 16%(2723 32K pages of total 16384)
Node 1: Index usage is 9%(1605 8K pages of total 16416)
Node 2: Data usage is 16%(2723 32K pages of total 16384)
Node 2: Index usage is 9%(1605 8K pages of total 16416)

Edit2: @ user3420095によって提案されたクエリの出力:

mysql> select FILE_NAME, FREE_EXTENTS*EXTENT_SIZE as bytes_free, extra  
    -> from information_schema.FILES 
    -> where TABLESPACE_NAME='hhmefep_tbs' 
    -> and   FILE_TYPE="DATAFILE";
+-----------------+------------+----------------+
| FILE_NAME       | bytes_free | extra          |
+-----------------+------------+----------------+
| hhmefep_tbs.dat |   22020096 | CLUSTER_NODE=1 |
| hhmefep_tbs.dat |   22020096 | CLUSTER_NODE=2 |
+-----------------+------------+----------------+

それが混乱を解消することを願っています。

1
Patel Parimal

まず第一に、あなたはあなたのテーブルを作成していますか?

_CREATE TABLE table_name TABLESPACE hhmefep_tbs STORAGE DISK ENGINE NDBCLUSTER;_

あるいは単に

_CREATE TABLE table_name ENGINE=NDBCLUSTER;
_

1つは、テーブルデータをディスクに保存するテーブルを作成することです。2つ目は、デフォルトのmysqlクラスターテーマであり、mysqlクラスターが存在する理由であり、データをメモリに保存します。

したがって、データをメモリに保存する場合は、管理ノードでコマンドを実行する必要があります(ndb_mgmコマンドを使用してndb_mgmコンソールに入ります)

_ALL REPORT MEMORY USAGE
_

メモリ使用量がいっぱいかどうかを確認します。

また、mysqlでディスクテーブルスペースを使用する場合、varchar(100)変数は、列のすべての行に100文字あるように、すべてのスペースを予約することに注意してください。

これは、TSがいっぱいかどうかを確認するために使用するのにより正確になります。

_select FILE_NAME, FREE_EXTENTS*EXTENT_SIZE as bytes_free, extra  
from information_schema.FILES 
where TABLESPACE_NAME='hhmefep_tbs' 
and   FILE_TYPE="DATAFILE";
_
1
bkaratatar