InnoDB アーキテクチャ

InnoDB アーキテクチャ

こんにちは。私は bacula を使用していますが、テーブルの 1 つがいっぱいです。

JobId 8946: Fatal error: sql_create.c:860 Fill File table Query failed: INSERT INTO File (FileIndex, JobId, PathId, FilenameId, LStat, MD5, DeltaSeq) SELECT batch.FileIndex, batch.JobId, Path.PathId, Filename.FilenameId,batch.LStat, batch.MD5, batch.DeltaSeq FROM batch JOIN Path ON (batch.Path = Path.Path) JOIN Filename ON (batch.Name = Filename.Name): ERR=The table 'File' is full

次に実行します:

mysql> show table status from current_bacula like 'File';
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows     | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free  | Auto_increment | Create_time         | Update_time | Check_time | Collation         | Checksum | Create_options | Comment |
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| File | InnoDB |      10 | Compact    | 52153488 |            142 |  7419723776 |               0 |   2593128448 | 2605711360 |      569929045 | 2013-04-15 21:03:59 | NULL        | NULL       | latin1_swedish_ci |     NULL |                |         |
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
1 row in set (0.31 sec)

my.cnf ファイルには次の内容が含まれています。

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:12800M

私が理解しているコマンドは次のとおりです:

ALTER TABLE tbl_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;

MyISAM エンジンでのみ動作しますか? (間違っていたら訂正してください)

そこで質問です。のみたとえば、las autotextend:max は次のようになります。

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M

サービスを再起動する以外に別のアクションを実行する必要がありますか。安全ですか? 別の ibdataN ファイルを定義できることはわかっていますが、サーバー上で現在実行されている他のデータベースへの影響はできるだけ少なくしたいと考えています。

何をお勧めですか?

CentOS 6.4にmysql-5.1.67-1.el6_3.x86_64をインストールしています

前もって感謝します!

答え1

別のibdataファイルを開始することができます

ただし、その前に、ibdata1と が何を占めているかを知っておく必要がありますibdata2

  • テーブルデータ(innodb_file_per_table無効になっています)
  • テーブルインデックス(innodb_file_per_table無効になっています)
  • MVCC (マルチバージョン同時実行制御) データ
  • テーブルメタデータ
  • ロールバックセグメント
  • ログを元に戻す
  • ダブルライトバッファ

InnoDB アーキテクチャ

InnoDB アーキテクチャ

私は以前、以前の雇用主のクライアントの1つでibdata3の追加に取り組んだことがあります(私のDBA StackExchangeの投稿を参照してください)。「innodb_file_per_table」で「テーブルがいっぱいです」というエラーを解決するにはどうすればよいでしょうか?)。これは、ibdata2 が ext3 のバイト上限に達したために必要でした2,196,875,759,616。そのような状況は発生しません。

あなたのアイデアでいい

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M

しかし、最大値を完全に削除した方が良いでしょう

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend

警告

スペースが不足した理由は、UNDOログに関係しています。ibdataファイルには1023個のUNDOログが保存されています。これらのログは、動作するために余裕が必要です。内部の余裕がなければ、MVCC情報はロールバックの際にデータのスナップショットを保持できません。内部の余裕は2605711360約 ですが2.5G、明らかに十分ではありません。以前の雇用主のクライアントでは、106G余裕は で、それは彼らにとって十分ではなかった

提案

すべてのデータを内部に残しibdata1ibdata2設定を

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M

余裕を監視する必要があります。

このように監視することができます

IBDATA_FILESIZE=8187281408
#
# 8187281408 is 7680M + 128M
#
SQL="SELECT SUM(data_length+index_length)"
SQL="${SQL} FROM information_schema.tables WHERE ENGINE='InnoDB'"
IBDATA_DATAINDEX=`mysql -uroot -p... -ANe"${SQL}"`
(( WIGGLE_ROOM = IBDATA_FILESIZE - IBDATA_DATAINDEX )))
echo ${WIGGLE_ROOM}

これを実行するたびに、空き容量がわかります。どの InnoDB テーブルも、余裕 (元に戻す情報のためのスペース) がない場合にいっぱいであるとエラーを発する可能性があるため、どのテーブルが関係しているかを知る必要はありません。

関連情報