MySQLv4.0(!)で、DISK容量の空きは十分なのにThe table is fullエラーが出た時の話
あるMyISAMテーブル(ここではtest1とします)を、スキーマ変更のため一時テーブル(test2)へコピーしようとした時、
mysql> create table test2 select * from test1; ERROR 1114 (HY000): The table 'test2' is full
のようなエラーが発生した。
test1はそこそこ大きなテーブルなので、MySQLがDATA領域(tmp領域を含む)として使うDISKの空きを確認するが、十分なスペースがあった。
調べてみると、
どうやらcreate table A select * from B構文だとMAX_ROWSの値は受け継がれず、
デフォルトの領域しか割与えられない仕組みのよう。
試しに1件だけ挿入すると
mysql> show create table test1\G *************************** 1. row *************************** Table: test1 Create Table: CREATE TABLE `test1` ( `id` int(11) default NULL ) TYPE=MyISAM MAX_ROWS=100000000 1 row in set (0.00 sec) mysql> create table test2 select * from test1 limit 1; Query OK, 1 rows affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> show create table test2\G *************************** 1. row *************************** Table: test2 Create Table: CREATE TABLE `test2` ( `id` int(11) default NULL ) TYPE=MyISAM 1 row in set (0.00 sec)
test2からはMAX_ROWS=100000000の設定が消えてしまっている。
そこでcreate table A select * from B構文は使わず、
CREATE TABLE `test2` ( `id` int(11) default NULL ) TYPE=MyISAM MAX_ROWS=100000000;
でテーブルを先に作成した上で、
INSERT INTO test2 SELECT * FROM test1;
とすると、無事コピーできた。
v4.0!