orenoblog

エンジニアになりたいExcel方眼紙erの物語

Magentoログテーブルのレコード削除

Magentoはユーザーの行動履歴など全てログテーブルへ記録します。
Google Analyticsを利用している場合や、記録されたデータを活用しない場合は不要です。

管理者画面よりログ取得OFFにすると、ロギングしないらしいのですが、
私の環境では無効化しても動作しなかったためSQLで削除することにしました。

どれがログテーブルにあたるのかは${MAGENT_HOME}/shell/log.php statusで確認できます。

ログテーブル一覧

$ php ${MAGENTO_HOME}/shell/log.php status
-----------------------------------+------------+------------+------------+
Table Name                         | Rows       | Data Size  | Index Size |
-----------------------------------+------------+------------+------------+
log_customer                       | ****K    | ****Mb    | ****Mb     |
log_visitor                        | ****K    | ****Mb    | 0 b        |
log_visitor_info                   | ****K    | ****Mb    | 0 b        |
log_url                            | *****K    | ****Mb    | ****Mb    |
log_url_info                       | *****     | ****Gb    | 0 b        |
log_quote                          | 0          | ****Kb    | 0 b        |
report_viewed_product_index        | ****M      | ****Mb   | ****Gb     |
report_compared_product_index      | ****K     | ****Mb     | ****Mb     |
report_event                       | ****K    | ****Mb    | ****Mb   |
catalog_compare_item               | ****K     | ****Kb   | ****Mb     |
-----------------------------------+------------+------------+------------+
Total                              | ****M     | ****Gb    | ****Gb     |
-----------------------------------+------------+------------+------------+

この中でreport_viewed_product_index,repodt_compared_product_indexは
最近チェックした商品などで利用されるため、全て削除してしまうとサイト閲覧中の利用者に影響があります。

ログテーブルのレコード削除(Magentoスクリプトを利用)

${MAGENTO_HOME}/shell/log.php cleanで削除できます。

$ php ${MAGENTO_HOME}/shell/log.php clean

これはforeachで100件ずつ削除しているため非常に遅いです
(削除件数はMage_core_config系に書かれてるっぽい、管理画面で変更可能のはず)
また、削除対象のレコード数が多い場合にこのスクリプトを実行するとMySQLのmax_allowed_packetに関するエラーが出力されてしまいます。
件数が多すぎる場合はDELETE文なりトランクするのが良いと思います。

ログテーブルのレコード削除(手動)

あまりにも件数が多かったためTRUNCATEしたいところでしたが、
不安だったのでDELETEで少しずつ削除しました。
いろんな方面からトランクしたんか!!って詰められたくないし。

mysql> DELETE FROM log_customer ORDER BY log_id LIMIT <行数>;
mysql> DELETE FROM log_quote ORDER BY quote_id LIMIT <行数>;
mysql> DELETE FROM log_url ORDER BY url_id LIMIT <行数>;
mysql> DELETE FROM log_url_info ORDER BY  url_id LIMIT <行数>;
mysql> DELETE FROM log_visitor_info ORDER BY visitor_id LIMIT <行数>;

スクリプトを利用せずに削除しても問題ないことがわかりました。
サクッと削除したい場合はTRUNCATEしてしまってもよさそうです。
データ削除後はALTER TABLEでinnodbデータファイルをShrinkすることをお忘れなく。

innodb_file_per_table指定してないですって?
ご愁傷さまです。