InnoDBテーブルのTable is Fullエラ

この文で

症状

4.xでは、5.0.84以下、下記の5.1.37と、InnoDBのプラグイン5.1.40とし、以下の

使用のInnoDBテーブルスペースは、すべてのバージョンを使用していませんもしinnodb_file_per_table

問題を再現:

自動拡張機能を備えたInnoDBのテーブルスペースは、すべてのバージョンの使用を含むもしinnodb_file_per_table

原因

4.xでは、5.0.84以下、以下のInnoDBプラグとでは、次の5.1.37と5.1.40

固定サイズのInnoDBテーブルスペースを使用し、もしinnodb_file_per_tableのすべてのバージョンを使用していません

自動拡張機能を備えたInnoDBのテーブルスペースは、すべてのバージョンの使用を含むもしinnodb_file_per_table

ソリューション

5.1.40とバージョン4.x以下、5.0.84以下、5.1.37以下、InnoDBのプラグインで

InnoDBのテーブルスペースの固定サイズを使用し、もしinnodb_file_per_tableのすべてのバージョンを使用していません

自動拡張機能を備えたInnoDBのテーブルスペースは、すべてのバージョンの使用を含むもしinnodb_file_per_table参考

このドキュメントでは、Oracle Support’s Rapid Visibility (RaV) で送信されるため、独立した技術検査の対象ではありませんされています。

 

適用範囲:

MySQLサーバのバージョン4.0以上

この資料の情報は、すべてのプラットフォームに適用できる。

***Checked for relevance on 22jun2014***

 

症状

このトラブルに及ぼす可能性は二つがある:

4.xでは、5.0.84以下、5.1.37以下、同様、、InnoDBのプラグインとバージョン5.1.40、次のサーバーのバージョンのMySQLのいずれかを実行しているとき:

  • 0と4.1すべてのバーション
  • 0.84とその以下
  • InnoDBプラグインなしの1:5.1.37とその以下
  • MySQLの1ウィジェットがあるInnoDB:5.1.40以下

1023を超えた動的なトランザクションがあって、エラ情報”Table is Full”がクライアントへ返されたときに、インサートエラが起こる。エラログには、より記述的なエラを含む:

110912 14:52:14 InnoDB: Warning: cannot find a free slot for an undo log. Do you have too

InnoDB: many active transactions running concurrently?

 

すべてのバーションは固定した大きさのInnoDBテーブルを使っている、それにinnodb_file_per_tableを使っていない。

それでデータをInnoDB テーブルにインサートする場合に以下のエラになる:

The table ‘<tablename>’ is full

その中に<tablename> はテーブルの名である。該当するMySQL エラコードSQL 状態は:

MySQL Error Code: 1114

SQLState: HY000

 

MySQLエラログに反映するエラは使っているInnoDBストレージエンジンバーションに左右される。

  • InnoDBプラグインがあるMySQL 5.1 とMySQL 5.5 ,エラログには以下のようなエラを含んでいる:

InnoDB: Error: Data file(s) ran out of space.

Please add another data file or use ‘autoextend’ for the last data file.

110908 12:18:13 [ERROR] /usr/sbin/mysqld: The table ‘<tablename>’ is full

  • MySQL/InnoDB に対して更早的版本(InnoDBがあるbuildinバーションのMySQL 5.1 を含む),エラ情報は:

110908 13:25:37 [ERROR] /usr/sbin/mysqld: The table ‘t1’ is full

 

たとえ SHOW TABLE STATUS 或 SELECT * FROM information_schema.TABLES はInnoDB テーブルに0を超えたData_freeがあることと示した 。

トラブルを再現する:

このステップは以下のステップで再現できる:

  1. 再びインストールしたMySQLを起動する
  2. MySQLを起動する前に、my.cnfにこのようにセットされたことを確保してください:

innodb_data_file_path = ibdata1:100M

それにinnodb_file_per_tableを起動しないでください

  1. MySQLを起動して、InnoDB がデータファイルを作成させる。
  2. MySQLに登録して実行する:

CREATE DATABASE innodbtest;

use innodbtest

CREATE TABLE t1 (id mediumint unsigned NOT NULL auto_increment PRIMARY KEY) ENGINE=InnoDB;

  1. The table ‘t1’ is fullが返されたまで持続的に行をテーブルにインサートする。
  2. スペースがもうすぐ使い切るにエラ情報は:

SQLSTATE[HY000]: General error: 1114 The table ‘t1’ is full

  1. SHOW TABLE STATUSを実行する:

mysql> SHOW TABLE STATUS LIKE ‘t1’\G

*************************** 1. row ***************************

Name: t1

Engine: InnoDB

Version: 10

Row_format: Compact

Rows: 3918789

Avg_row_length: 23

Data_length: 90800128

Max_data_length: 0

Index_length: 0

Data_free: 4194304

Auto_increment: 3920001

Create_time: 2011-09-08 12:14:35

Update_time: NULL

Check_time: NULL

Collation: latin1_swedish_ci

Checksum: NULL

Create_options:

Comment:

1 row in set (0.00 sec)

使用可能なデータがなくともData_free はまだ4194304 。

 

自動的に 拡張するInnoDB テーブルスペースには innodb_file_per_table を使ったすべてのバーションを含んでいる。

 

Table is full errorが現れて、 MySQLエラログによくある症状は:

2014-09-15 08:33:38 7f28aeb8a700 InnoDB: Error: Write to file /mysql/data/ibdata1 failed at offset 20971520.

InnoDB: 1048576 bytes should have been written, only -1 were written.

InnoDB: Operating system error number 28.

InnoDB: Check that your OS and file system support files of this size.

InnoDB: Check also that the disk is not full or a disk quota exceeded.

InnoDB: Error number 28 means ‘No space left on device’.

InnoDB: Some operating system error numbers are described at

InnoDB: http://dev.mysql.com/doc/refman/5.6/en/operating-system-error-codes.html

2014-09-15 08:33:38 7101 [ERROR] /usr/sbin/mysqld: The table ‘t1’ is full

2014-09-15 08:33:39 7101 [ERROR] /usr/sbin/mysqld: The table ‘t1’ is full

Windowsに,エラがこのようになるかもしれない:

2014-09-15 10:04:06 12AB InnoDB: Encountered a problem with file C:\ProgramData\MySQL\ibdata1

2014-09-15 10:04:06 12AB InnoDB: Disk is full. Try to clean the disk to free space.

2014-09-15 10:04:06 13D7 [ERROR] C:\Program Files\MySQL\bin\mysqld.exe: The table ‘t1’ is full

以上は共有テーブルスペースのエラで、似たようなエラは各テーブルスペースにも起こる。

 

原因

4.x, 5.0.84 とその以下, 5.1.37 とその以下, InnoDBプラグイン付きの5.1.40 及以下版本とその以下

これはIf InnoDB Runs Out of Undo Slots, It Returns Misleading ‘Table is Full’ bugによるものである。在MySQL 5.1 とその以下にはInnoDB せいぜい1023動的なトランザクションを支持する。より多くの起動はエラになるかもしれない。またはbugの影響を受けたバーションにassertionが作成する。

 

大きさが固定したInnoDB テーブルスペースを使うが、どんな innodb_file_per_tableバーションも利用しない。

このトラブルはInnoDBが共有テーブルスペースの使用可能なスペースを使い切ったからである。すべてのガイドブックにはTable is fullがディスクを使い切ったあるいはテーブルが最大に達ったと意味する。InnoDBが共有テーブルスペースと設定されたら、InnoDBテーブルスペースの大きさは(データファイル)テーブルの最大なスペースと同じようになる。

 

InnoDBテーブルスペースにはディフォルト16KBのデータページを含んでいる。一部のページが全然利用されていないが、実際には新たなデータに対して提示しないから、SHOW TABLE STATUS報告にはまだスペースがあるが、どんなデータもインサートできなくなる。

 

MySQLガイドブックのページを参考してください:

  • The table is full
  • Limits on Table Size
  • Configuring InnoDB
  • InnoDB File Space Management

 

自動的に 拡張するInnoDB テーブルスペースには innodb_file_per_table を使ったすべてのバーションを含んでいる

この場合の原因は:

ストレージテーブルスペースディスクが満たされた。

設定した限度が満たされた

テーブルスペースファイルがファイルシステムが支持できる最大なサイズに達した。

 

解決策

4.x, 5.0.84 とその以下, 5.1.37 とその以下, InnoDBプラグイン付きの5.1.40 及以下版本とその以下。

解決策はプラグイン付きのMySQLのバーションにアップロードする:

  • MySQL 5.0: 5.0.85
  • InnoDBプラグインなしのMySQL 5.1:1.38
  • MySQLの1ウィジェットがあるInnoDB:5.1.40

 

使用可能で最新なGAバーションにアップロードする。

 

アップロードする前にデータベース部分を作成してください。(schema、データ及びデータベースが実行する必要があるプログラム(変数、トリガーなど))。安全こそ最善策である。もしや、アップグレード途中に何かトラブルが起きたら、前のバーションに容易くリカバリできる。

 

アップグレードは以下の通りに参考してください:

  • Downloading MySQL Server
  • MySQLをアップロードするあるいはダウンロードする場合に、テーブルとインディクスをテストして再構造する必要があるかを確認することは一番大事である。ダウンロードしたバーションにページ: 5, 5.1, 5.0を使ってください。How to Upgrade your Existing MySQL Server to MySQL 5.6 Version を参考して、より多くのアドバイスを獲得できる。

 

生産サーバがアップロードする前に、開發段階でテストしてください。

 

大きさが固定したInnoDBテーブルとinnodb_file_per_tableすべてのバーションを使わない場合。

解決策は’InnoDBテーブルスペースをより大きくなってあげる。以下のステップで完成できる:

 

生産に投入する前に、開發段階で試してください。

 

  1. MySQLを中止する

2.好みのエディタでMySQL配置ファイルをオープンする。

  1. innodb_data_file_path オプションを設定する行を見つけ出す。
  2. 新たなテーブルテーブルを追加するあるいは最近のテーブルスペースを自動的に拡張する:
  3. innodb_data_file_path を

innodb_data_file_path = ibdata1:100M;ibdata2:100Mと設定する

あるいは

  1. innodb_data_file_path を

innodb_data_file_path = ibdata1:100M:autoextendと設定する

  1. MySQL配置ファイルを格納する
  2. MySQLを再起動する

7.データを再びInnoDBテーブルにインサートできるかを確認する。

8.解決策を別の環境に移す。

 

MySQLガイドブックにある以下のページを参考してください:

Configuring InnoDB

Adding, Removing, or Resizing InnoDB Data and Log Files

 

 

自動的拡張するInnoDBテーブルスペースを使ってinnodb_file_per_tableすべてのバーションを含む

その原因はテーブルの大きさをより大きく拡張できないから、解決策は:

  • テーブルスペースファイルストレージパスには余ったディスクスペースがあることを確保してください。

スペースを空けるために共有なテーブルスペースとInnoDBファイルを削除するのはいかない。削除すれば、InnoDBが起動できなくなる。

スペースを取り戻すには、以下の内容を参考してください。

  • ディフォルトの定量がテーブルスペースが伸びることを阻止しないことを確保してください。
  • ファイルシステムが支持する最大ファイルサイズが達していないことを確保してください。もしこれはTable is fullエラの原因であれば、以下の解決策を使ってください:
    1. すべてのテーブルを共有テーブルスペースに格納してください。(innodb_file_per_table = 0):
      1. 別の共有テーブルスペースファイルを作成してください。
      2. あるいは、別の共有テーブルスペースを作成して、innodb_file_per_tableでそれをテーブルスペースから移す。これで、共有なテーブルスペースの大きさに影響を及ばない。MySQL Server Variable: innodb_file_per_tableに参考して、innodb_file_per_tableについて、より詳しい情報が獲得できる。
    2. 各テーブルのテーブルスペースのファイルに対して、パーティションしてください。パーティション完成したテーブルに対して、各パーティションが自身のテーブルスペースにあるから、それにinnodb_file_per_table = 1、所以这是你能将总大小分割到多个文件。

 

ディスクスペースを解放する方法は以下の通り:

 

  • OPTIMIZE TABLE <table_name>で各テーブルスペースに余ったスペースを取り戻す必要がある。

这需要重建在表空间文件位置的表。テーブルスペースファイル位置のテーブルを再構造する必要があるから、スペースを解放したあるいはテーブルを別の位置に移した場合に限って効ける。

  • 共有テーブルスペースのファイルを取り戻すには:How to Reclaim Unused Space and Decrease InnoDB ibdata1 Data File Size.
  • もしエラーログ、スロークエリログ、一般クエリログ、監査ログなどテーブルスペースと同じディスクに格納されたら、これらのログを別のディスクに移してください:
    1. サーバログ維持
    2. audit_log_rotate_on_size
  • もし2進数ログがデータと同じなディスクにあれば、古い2進数ログを削除することを考えてください。

削除された2進数ログは確実にいらないということを確保してください。例えば、2進数がコピするときに使われていないが、リカバリするときにまだ使う必要があれば、ログを削除する前ににバックアップを作成してください。

PURGE BINARY LOGS コマンドで古い2進数ログを削除できるか。

  • MySQL 5.6で, InnoDB native linksでtablespaceにあるテーブルスペースを別のディスクに移すことができる。
  • ログを別のディスクに移す:
    1. What is the General Query Log and How to Control Where the Log is Stored?
    2. What is the Slow Query Log and How to Control Where the Log is Stored and What is Logged?
    3. –log_ error
    4. –audit_ log_file

Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *