InnoDBの意外な制約: Got Error 139 From Storage Engine
環境: MySQL 5.0 (追記)
某CMSにて、1つのテーブルにTEXT型のフィールドをたくさん(10前後)作ったところ、次のようなエラーが出てデータを保存できなくなった。
件のCMSの場合は特にInnoDBでなくても良かったので、テーブルをMyISAMに変換することで回避できた。
MyISAMの場合、行サイズの上限は64KBで、かつTEXTやBLOBの保存に要するのは9〜12バイトなので、同じ問題はまず起こらない。最近は特に何も考えずにInnoDBを使っていたので、ヒヤリとさせられた。
参考にしたサイト:
某CMSにて、1つのテーブルにTEXT型のフィールドをたくさん(10前後)作ったところ、次のようなエラーが出てデータを保存できなくなった。
Got error 139 from storage engineこのエラーメッセージで検索すればいろいろと情報が出てくるが、こういうことらしい:
- InnoDBの行サイズの上限はページサイズの約半分で、デフォルトでは約8000バイト
- 可変長カラム(VARBINARY, VARCHAR, BLOB, TEXT)のデータは行の外部に保存されるが、先頭の768バイトだけは行の内部に保存される
- よって例えば一つのテーブルに11個のTEXT型フィールドを作り、それぞれに768バイト以上のデータを入れようとすると、768*11=8448 > 8000 なので保存できない
件のCMSの場合は特にInnoDBでなくても良かったので、テーブルをMyISAMに変換することで回避できた。
1
|
|
参考にしたサイト:
- 13.2.11.2. File Space Management - MySQL 5.0 Reference Manual
- 10.5. Data Type Storage Requirements - MySQL 5.0 Reference Manual
- 限界までMySQLを使い尽くす!! - 漢(オトコ)のコンピュータ道
- Nix::WebLab : Got error 139 from storage engine
追記
SH2さんからのコメントで、MySQL 5.1+InnoDB Plugin/MySQL 5.5以降で新たなファイルフォーマット(Barracuda)を使用すれば状況は改善される、と教えていただきました。どうやらTEXT/BLOB一つあたり20バイトだけになるようです。詳細は以下のリンクなどを参照してください(私もまだ読んでいる途中ですが)。- MySQL :: InnoDB 1.1 for MySQL 5.5 User’s Guide :: 3 InnoDB Data Compression
- 漢(オトコ)のコンピュータ道: InnoDB Pluginことはじめ。快適ストレージエンジン生活はじまる!
- MySQL InnoDB Pluginのデータ圧縮機能 - SH2の日記
0 件のコメント:
コメントを投稿