OpenPNE の画像がアップできない原因はいくつかあります。GD がないとかは他にも参考になるサイトがあるのでそれ以外の場合を書きました。

最初からアップロードできない場合

MySQL の最大パケット転送料に引っかかっている場合があります。以前書いた以下のエントリが参考になるかと思います。
MySQL に大きなデータを送る際に max_allowed_packet を確認した方がいい

急に画像がアップロードできなくなった場合

今回この調査依頼が来て、調査したところ MySQL の最大テーブル長 (Max_data_length)に引っかかっていました。

mysql > show table status like 'c_image'\G
*************************** 1. row ***************************
           Name: c_image
         Engine: MyISAM
        Version: 9
     Row_format: Dynamic
           Rows: 23279
 Avg_row_length: 184499
    Data_length: 4294961036
Max_data_length: 4294967295
   Index_length: 740352
      Data_free: 0
 Auto_increment: 26026
    Create_time: 2008-03-10 17:57:28
    Update_time: 2009-07-06 20:36:14
     Check_time: 2009-07-06 15:39:07
      Collation: utf8_unicode_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)

赤字の部分です。Max_data_length はデフォルトの 4294967295。現在のデータサイズは 4294961036。ほとんど差がありません。

この状態で OpenPNE が画像ファイルを MySQL に挿入する部分で以下のエラーが出ていました。

[nativecode=1114 ** The table 'c_image' is full]

解決方法は Max_data_length を大きくするしかありません。
Max_data_length は以下のようにして変更できます。

mysql > ALTER TABLE テーブル名 MAX_ROWS=最大レコード数, AVG_ROW_LENGTH=平均レコード長

MAX_ROWS x AVG_ROW_LENGTH のサイズが Max_data_length になります。

OpenPNE 2.10 でこの不具合が出ないように、修正されたようです。チケットがありました。
#305 (c_imageのMAX_ROWS設定) – OpenPNE – Trac

c_imageのMAX_ROWS設定画像アップできない不具合の解決
ALTER TABLE c_image ENGINE=MyISAM DEFAULT CHARSET=utf8 MAX_ROWS=190000;
で。

OpenPNE の 2.8 から 2.10 へのアップグレードの SQL を確認してみました。
以下のようになっていました。

ALTER TABLE c_image ENGINE=MyISAM DEFAULT CHARSET=utf8 MAX_ROWS=190000;

BLOB とか可変長のものがあるときは AVG_ROW_LENGTH を指定しないといけないと思っていたのだが、いいのか。

今回発生したバージョンは 2.8.8 でした。バージョンアップって大切ですね。

関連する投稿