web-dev-qa-db-ja.com

ndbcluster:エラー:1114、テーブルを使用しているときにテーブルがいっぱいです

このエラーについてしばらく検索しました。 2つのデータノードで実行されているMySQLクラスターがあります。クラスタには他のいくつかのデータベースが格納されています。別のサーバーからの--tab形式のデータベースのダンプがあります。 ndbclusterをテーブルエンジンとして使用するようにSQLを変更し、SQLを正常にインポートできます。 mysqlimportを使用してデータをテーブルにインポートしようとすると、いくつかのテーブルが読み込まれますが、次のメッセージが表示されます。

mysqlimport: Error: 1114, The table 'doc_archive' is full, when using table: doc_archive

このエラーを探してみると、データノードのメモリが不足していることがわかりますが、次のようにそうではありません。

ndb_mgm> all report memory
Node 31: Data usage is 45%(179865 32K pages of total 393216)
Node 31: Index usage is 67%(88761 8K pages of total 131200)
Node 32: Data usage is 45%(179863 32K pages of total 393216)
Node 32: Index usage is 67%(88761 8K pages of total 131200)

「完全」になるまでデータベースをインポートすると、各データノードのデータ使用量が2%増加するだけで、インデックス使用量は3%しか増加しません。

これは、管理ノードからのconfig.iniのコピーです。

[ndbd default]
# Options affecting ndbd processes on all data nodes:

NoOfReplicas=2    # Number of replicas

DataMemory=12G    # How much memory to allocate for data storage

IndexMemory=1G   # How much memory to allocate for index storage
            # For DataMemory and IndexMemory, we have used the
            # default values. Since the "world" database takes up
            # only about 500KB, this should be more than enough for
            # this example Cluster setup.

MaxNoOfOrderedIndexes=8192
MaxNoOfUniqueHashIndexes=512
MaxNoOfAttributes=100000
MaxNoOfExecutionThreads=8
MaxNoOfConcurrentOperations=256000
MaxNoOfTables=2048
MaxBufferedEpochs=100000
TimeBetweenEpochsTimeout=32000
TransactionDeadlockDetectionTimeout=1000000
TransactionInactiveTimeout=10000000
MaxNoOfTriggers=3072 # Default is 768

datadir=/var/lib/mysql-cluster   # Directory for this data node's data files
serverport=1187

NoOfFragmentLogFiles=1125
RedoBuffer=32M

[ndb_mgmd]
# Management process options:
nodeid=30
hostname=192.168.2.30
datadir=/var/lib/mysql-cluster

[ndbd]
nodeid=31
hostname=192.168.2.31

[ndbd]
nodeid=32
hostname=192.168.2.32

[mysqld]
nodeid=33
hostname=192.168.2.33

[mysqld]
nodeid=34
hostname=192.168.2.34

他にどこを見ればいいですか?十分なディスク容量と予備のメモリがあります。

3
John Locke

同様の問題がありました。私を除いて、すべてのノードが0%のデータとインデックスメモリを使用しているにもかかわらず、大きなテーブルがいっぱいであるという不満がありました。

私にとってそれを修正したのは、MaxNoOfExecutionThreads = 4を設定することでした(値が8の場合、テーブルがいっぱいになりました)。

これがうまくいった理由はわかりませんが、うまくいきました。 ndbmtd実行可能ファイルが、どの内部メモリまたはリソースがいっぱいであるかを正確に説明するなど、単なる(テーブルがいっぱいである)よりも詳細な出力を提供したいのですが、メモリもディスクもいっぱいではありません。

お役に立てれば!

1
Jorge

パラメータNoOfFragmentLogFilesを設定してみてください(デフォルトでは、他の多くの値と同じです)。

設定に関するリンク: http://johanandersson.blogspot.ru/2007/05/good-configuration.html

MySQLドキュメントの説明: http://dev.mysql.com/doc/refman/5.6/en/mysql-cluster-ndbd-definition.html#ndbparam-ndbd-nooffragmentlogfiles

UPD(申し訳ありませんが、他の種類の投稿である必要があります):

はい、--initial(datanode startコマンド内)はすべての[〜#〜] ndb [〜#〜]データをワイプします。

まず、バックアップを作成する必要があります。次のようになります。

ndb_mgm> START BACKUP [backup_id] [WAIT {STARTED | COMPLETED} | NOWAIT] [ {SNAPSHOTSTART|SNAPSHOTEND} ](申し訳ありませんが、何らかの方法で奇妙で無効なコマンドの説明である可能性があります。ドキュメントをよく見てください)。

START BACKUP 1と入力するだけで、1がバックアップIDになります。

その後、完全に再起動します(すべてのノードで--initialを使用)。そして復元します。

メタデータを復元します(これを任意のデータノードで1回実行します):ndb_restore -m -b <backupid> -n <nodeid> --backup_path=/path/to/backup/filesここで、<backupid>START BACKUPコマンドからの番号です(1)。ここで-mは「メタデータの復元」です。

その後、データを復元します(すべてのデータノードで実行する必要があります):ndb_restore -r -b <backupid> -n <nodeid> --backup_path=/path/to/backup/files。ここで-rは「データの復元」です。

バックアップが実際に作成され、存在することを確認することを忘れないでください。

0
ckorzhik