最近ブログさぼっていたonagataniです。
実はMTの記事じゃなくてMySQL側の話なんですが、ディレクターさんとかデザイナーさんではまった人がいるかもしれないので簡単に記事にしておきました。
以下のメッセーが記事登録時に表示されたら今回の記事で修正可能です。
Row size too large (> 8126)
これは何かをいうと、インプットされたデータが大きすぎだよ、というエラーです。
照井さんの指摘で修正
端的に言うと可変長カラムが多すぎ。というエラーでした。
Movable TypeではデータベースにMySQLを使用している人がほとんどだと思いますが、ストレージエンジンは何を使用していますか?
MyISAMでしょうか、InnoDBでしょうか、AWSのRDSだとMultiAZするにはInnoDB使わないとダメだったりするのでInnoDBに移行している人が増えてきていると思いますが、InnoDBは標準のまま使用していると1レコードあたり最大サイズ8KBの制限があります。
MyISAMは64KBだったのでInnoDBに気軽に変更すると上記のようなエラーに遭遇する可能性が高くなります。
もうちょっと詳しく説明すると、UTF8では1文字3バイト(utf8mb4だと4バイト)消費しますが
デフォルトのInnoDBだと、可変長カラムは1カラムあたり768バイト消費するので(768バイト以上の文はオーバーフローページに保存されるので別カウント扱いになる) 可変長カラムに日本語なら255文字以上入力されたカラムが11カラムあると8kbを超えてエラーになります。
MTでは先ほど確認したところ11カラム以上あるので、可能性としてありえるわけです。
特にプラグインなどを大量に入れていると可能性がぐっと上がりますね。
修正方法は簡単でエラーメッセージと一緒にMySQLが教えてくれます。
using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED
テーブルのROW_FORMATをCompactから変更しろって事ですね。
で、変更できますが、実はすぐにはできません。
DYNAMICやCOMPRESSEDはInnoDBのファイルフォーマットBarracudaの機能なのでデフォルトのAntelopeから変更する必要があります。
これはmy.cnf等で以下を設定する必要があります。
[mysqld]
innodb_file_per_table = 1
innodb_file_format = Barracuda
再起動したくない人は SET GLOBAL innodb_file_format = Barracuda;などで変更可能なようです(僕は再起動しちゃいました)。
Barracudaの設定が完了したら先ほどのAlter Tableを実行してください。
これで8kbの制限が解除されたかと思いますので存分にブログ記事がかけますね。
という事で安易にInnoDBに変更すると死ぬよというお話でした。
※MTでなる可能性は低いかな〜
参考:http://blog.kamipo.net/entry/2014/12/05/235641
実はMTの記事じゃなくてMySQL側の話なんですが、ディレクターさんとかデザイナーさんではまった人がいるかもしれないので簡単に記事にしておきました。
以下のメッセーが記事登録時に表示されたら今回の記事で修正可能です。
Row size too large (> 8126)
照井さんの指摘で修正
端的に言うと可変長カラムが多すぎ。というエラーでした。
Movable TypeではデータベースにMySQLを使用している人がほとんどだと思いますが、ストレージエンジンは何を使用していますか?
MyISAMでしょうか、InnoDBでしょうか、AWSのRDSだとMultiAZするにはInnoDB使わないとダメだったりするのでInnoDBに移行している人が増えてきていると思いますが、InnoDBは標準のまま使用していると1レコードあたり最大サイズ8KBの制限があります。
MyISAMは64KBだったのでInnoDBに気軽に変更すると上記のようなエラーに遭遇する可能性が高くなります。
もうちょっと詳しく説明すると、UTF8では1文字3バイト(utf8mb4だと4バイト)消費しますが
デフォルトのInnoDBだと、可変長カラムは1カラムあたり768バイト消費するので(768バイト以上の文はオーバーフローページに保存されるので別カウント扱いになる) 可変長カラムに日本語なら255文字以上入力されたカラムが11カラムあると8kbを超えてエラーになります。
MTでは先ほど確認したところ11カラム以上あるので、可能性としてありえるわけです。
特にプラグインなどを大量に入れていると可能性がぐっと上がりますね。
修正方法は簡単でエラーメッセージと一緒にMySQLが教えてくれます。
using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED
テーブルのROW_FORMATをCompactから変更しろって事ですね。
ALTER TABLE `mt_entry` ROW_FORMAT = DYNAMIC;
で、変更できますが、実はすぐにはできません。
DYNAMICやCOMPRESSEDはInnoDBのファイルフォーマットBarracudaの機能なのでデフォルトのAntelopeから変更する必要があります。
これはmy.cnf等で以下を設定する必要があります。
[mysqld]
innodb_file_per_table = 1
innodb_file_format = Barracuda
再起動したくない人は SET GLOBAL innodb_file_format = Barracuda;などで変更可能なようです(僕は再起動しちゃいました)。
Barracudaの設定が完了したら先ほどのAlter Tableを実行してください。
これで8kbの制限が解除されたかと思いますので存分にブログ記事がかけますね。
という事で安易にInnoDBに変更すると死ぬよというお話でした。
※MTでなる可能性は低いかな〜
参考:http://blog.kamipo.net/entry/2014/12/05/235641
コメント