2012年11月15日
データベースの不整合によるエラーの調査や修復を行う
ブログの一覧画面で「Can't call method "name" on an undefined value...」といったエラーが表示される、また、フォルダやカテゴリの一覧画面で、変更した設定をエラーで保存できないなどの事象が出る場合、下記の原因である可能性があります。
- ブログに、親となるウェブサイトが存在しない
- フォルダやカテゴリに親カテゴリが指定されている時に、何らかの原因で親カテゴリ(フォルダ)が存在しない状態になっている
- 存在していないブログ/ウェブサイトの配下にオブジェクトが残っている
このような状態になった原因としては以下のような原因が考えられます。
- 配下に大量にオブジェクトの登録されているウェブサイトをバックアップと復元機能で復元する際にタイムアウトで中途半端なデータが残った
- CSVインポート機能でparent_idやparentの数字指定を間違えた
- 大量のオブジェクトを削除する際にタイムアウトが発生して中途半端なデータが残った
このような状態になっているかどうかはデータベースの中身を調査することで特定できますが、このような状態を解消するためのスクリプトを用意しました。--debug 1 を付けると削除は実行せずに該当のオブジェクトの種類とIDを標準出力しますので、不整合があるかどうかのチェックにも使用できます。
- Github にて配布中しています。
https://github.com/alfasado/mt-tools-repair-db
※必ずデータベースのバックアップを行ってからスクリプトを実行してください。また、ご利用においては自己責任でお願いします。実行した結果について当社では一切の責任を負いません。
MTのtoolsディレクトリにスクリプトを設置し、コマンドラインから下記のように実行します。
$ cd /path/to/mt $ perl ./tools/repair-db --debug 1 $ perl ./tools/repair-db
※ /path/to/mt については PowerCMS のインストール先を指します。ご利用の環境にあわせて読み替えてください。
このスクリプトが行うのは下記の処理です。
- blog_idカラムの存在するオブジェクトで、当該のblog_idのブログ又はウェブサイトの存在しないオブジェクトの削除
- 親ウェブサイトの存在しないブログの削除
- 親カテゴリ/フォルダの存在しないカテゴリ/フォルダの削除
また、ブログの削除が管理画面でエラーになる場合に、スクリプトの実行によってブログを削除するスクリプトも作成しました。--blog_id 1,2(ブログID)のように引数をつけて実行します。
トラブルの解消を保証するものではありませんが、データベースの不整合が疑われるケースや、大量のデータの削除の際には役に立つかもしれません。
コメントを投稿する