MySQLの8KBの壁でエラーが出た時の対処法

久々にVPS立ち上げのお仕事を頂いたので、さくらVPSをあれこれいじってたら、

「ついでにphpMyAdmin入れてCSVデータもインポートしといてね―」

との事だったので、phpMyAdminをインストール。
メニューのインポートから100行程度の小さなCSVファイルをインポートしてたら、エラーで止まる事態に。

おや?CSVのファイルサイズは700KBぐらいだし、DBのカラムは全部TEXTだし、なんだべ?と思ってたら以下のエラー。

#1118 – Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.

これ昔きいたことあるやつだ!
InnoDBってカラムが8KB超えるとエラー出るんだよね、確か…。

でもご親切にエラーの中にヒントがありますね。

カラムはTEXTかBLOBにしろコラ!FORMATはDYNAMICかCOMPRESSEDにしろコラ!
とありがたいお言葉が。(コラ!は付いてないけど)

カラムは全てTEXTなので問題はFORMATでしょうね~。

面倒なのでphpMyAdminのSQLから

SHOW TABLE STATUS like ‘テーブル名

で確認すると、やっぱりCreate_optionsに何も指定されてない状態でした。
これまたphpMyAdminのSQLから

ALTER TABLE テーブル名 ROW_FORMAT=DYNAMIC;

でこのテーブルにROW_FORMAT=DYNAMICを指定してやります。
その後、念のためMySQLを再起動。

# /etc/init.d/mysqld restart

Stopping mysqld:                          [  OK  ]
Starting mysqld:                           [  OK  ]

さー、これでOKと思いきや、また同じエラーでインポートできず (/・ω・)/

どうやらここだけ指定してもダメなようで、confファイルにinnodbのファイルフォーマットを指定しておかないといけないようです。

etc>my.cnf

を開いて

[mysqld]
innodb_large_prefix
innodb_file_format = Barracuda
innodb_file_per_table = 1

の3行を追加、MySQLを再起動。再度同じCSVファイルをインポートしてみたら

インポートは正常に終了しました。98 個のクエリを実行しました。

で無事完了しました。

レンタルサーバーだとmy.cnfを直接いじる事ができないので、その際は思い切ってデータベースの型をInnoDBからMyISAMへ変更しましょう。

MyISAMだとトランザクションが扱えないとうデメリットがありますが、データベースが使えなくなるよりはマシだと思います。

InnoDBからMyISAMへ変更するのには、SQLで

ALTER TABLE テーブル名 engine=MyISAM;

で変更できますので、お試しください。

innodb_file_format = BarracudaはMySQLインストール時にデフォルトで入るようにしててもいいんじゃないかなーと思う今日この頃。ではでは。

Written by 真嘉 朝慶(まか ちょうけい)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする