PowerCMS™

PowerCMS ブログ

ホーム > PowerCMS ブログ > データベースの問題で PowerCMS 管理画面へログインできなくなった場合の対処方法

2019年01月15日

データベースの問題で PowerCMS 管理画面へログインできなくなった場合の対処方法

PowerCMS 管理画面へログインできなくなった、ログイン後に画面遷移ができなくなった、という問題が発生した場合に確認すべきことと対処方法を紹介いたします。

本記事の内容は PowerCMS と Movable Type のどちらにも有効です。

この記事で取り上げるログインできない状況は下記の条件です。条件に当てはまらない場合、本記事の対策が有効でない場合があります。

  • ログイン画面は表示できる
  • ログイン直後に管理画面は表示されるが、メニューをクリックなど移動するたびにログイン画面が表示される
  • 近い期間で正常なログインを確認できたユーザが、ログインできなくなった
  • どのユーザでも発生する

本題に入る前に、ログインの仕組みをごく簡単に説明します。 問題解決優先の方は読み飛ばしてください。

ログインの仕組み

ログインの操作を行うとデータベースの mt_session テーブルにレコードが生成され、あわせてブラウザに Cookie が発行されます。そのレコードと Cookie が両方存在し且つ有効期限が過ぎていないことでログイン状態が保持されます。

mt_session テーブルのレコードと Cookie の片方しか存在しない場合、両方揃っていても有効期限が過ぎている場合、ログイン状態は保持されず、ログイン画面が表示される動作をします。

データベースのチェック、の前に

データベースの破損をチェックする前にディスク容量の空きがあるか確認しましょう。ディスク容量の空きがない場合、mt_session テーブルへ新しいレコードが保存できないことでログイン状態が保持できない場合があります。

ディスク容量にも問題がない場合、データベースのテーブルが破損していないかチェックを行います。

データベースのチェック (mysqlcheck)

チェックの方法はデータベースの種類やツールによって異なりますが、今回はもっとも利用がある MySQL データベースを対象に、コマンドラインで行う方法を紹介します。

コマンドラインでは mysqlcheck を利用してチェックを行い、下記のように指定を行います。


$ mysqlcheck --check --databases=db_name --user=db_user --password

--check はチェックを行うことを示す引数です。チェックはデフォルトの動作なので何も指定しなかった場合はチェックが行われます。 db_name には MySQL データベースの名前を、 db_user にはデータベースへ接続できる MySQL ユーザの名前を指定します。 MySQL ユーザのパスワードも引数に指定可能ですが、本記事では指定しない形式で行きます。指定しない場合は mysqlcheck の実行時に入力します。

データベース名が powercms 、 MySQL ユーザ名が alfasado の場合は次の指定になります。


$ mysqlcheck --check --databases=powercms --user=alfasado --password

実際に実行した場合の出力 (抜粋) が下記になります。


$ mysqlcheck --check --databases=powercms --user=alfasado --password
Enter password:
powercms.mt_accesstoken                         OK
powercms.mt_activity                            OK
powercms.mt_alttemplate                         OK
powercms.mt_alttemplate_meta                    OK
powercms.mt_alttemplate_rev                     OK
powercms.mt_asset                               OK
powercms.mt_asset_meta                          OK
...
..
.

結果はテーブル単位で出力され、OK でない結果が出力されたテーブルは対処が必要です。

データベースのチェック (check table)

コマンドラインで確認する方法をもう一つ紹介します。

データベースへ接続してからテーブルをチェックすることもできます。

MySQL へ接続後、下記を実行するとチェックが行えます。


> check table mt_session;

こんな感じです。


$ mysql powercms --user alfasado --password
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5876
Server version: 5.7.24 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> check table mt_session;
+---------------------+-------+----------+-------------------------------------------+
| Table               | Op    | Msg_type | Msg_text                                  |
+---------------------+-------+----------+-------------------------------------------+
| powercms.mt_session | check | Error    | Table 'powercms.mt_session' doesn't exist |
| powercms.mt_session | check | status   | Operation failed                          |
+---------------------+-------+----------+-------------------------------------------+
2 rows in set (0.00 sec)

上記例では Error と出ており、問題があることが確認できます。

問題の解決 (テーブルの修復)

テーブルに問題が見つかった場合、それを解消する必要があります。 MySQL データベースの場合、チェックと同様の手順で修復も行えます。


$ mysqlcheck --repair --databases=db_name --user=db_user --password

MySQL へ接続して行う場合は下記になります。


> repair table mt_session;

修復では、チェックと同様に結果が表示されるのでチェックと同様に OK と表示されれば問題ありません。 ログインが行えるようになったか確認してください。

しかし、下記のように修復が失敗した場合、別のアプローチが必要です。


mysql> repair table mt_session;
+---------------------+--------+----------+-------------------------------------------+
| Table               | Op     | Msg_type | Msg_text                                  |
+---------------------+--------+----------+-------------------------------------------+
| powercms.mt_session | repair | Error    | Table 'powercms.mt_session' doesn't exist |
| powercms.mt_session | repair | status   | Operation failed                          |
+---------------------+--------+----------+-------------------------------------------+
2 rows in set (0.00 sec)

まだ試せることがあるので諦めないでください。

問題の解決 (テーブルの再作成)

PowerCMS にテーブルを修復する仕組みはないため、データベースが提供する仕組みでテーブルの修復が行えなかった場合、 テーブルを再作成することでテーブルの問題を解消させます。

PowerCMS のアップグレードの処理の中ではテーブルの作成やカラムの追加などデータベースの更新が自動で行わるので、問題があるテーブルを削除した状態でアップグレードを実行することで、テーブルの再作成と同等のことが実現できます。

テーブルの削除はデータベースのチェックと同様に専用のツールやコマンドを利用して行ってください。 MySQL へ接続して行う場合は下記になります。


> drop table mt_session;

テーブルの削除が行えたらアップグレードの処理を行いましょう。 アップグレードの処理は PowerCMS をバージョンアップしたり、プラグインを追加や更新することで行われる場合があります。

今回はアップグレードの処理を行うための UpgraderSample プラグインを用意しました。UpgraderSample は何も機能を持ちませんが、設置した初回にアップグレードの処理が行われます。

UpgraderSample.zip を解凍して下記のように PowerCMS がインストールされているディレクトリの plugins ディレクトリへ設置してください。

  • (PowerCMS がインストールされているディレクトリ)/plugins/UpgraderSample/config.yaml

UpgraderSample を設置できたら管理画面へアクセスして、アップグレードを行います。

※ PSGI や FastCGI を利用している場合、プロセスを再起動するまでアップグレードが行えません。

アップグレードの処理が完了したら、削除したテーブルが作られているか、管理画面へログインできるようになったか確認しましょう。

ログインできるようになったら UpgraderSample は削除してください。

バックアップは定期的に

テーブルが修復できなかった場合にテーブルを削除、作成する方法をご案内致しましたが、削除したテーブルのデータは戻ってきません。

そのためデータベースを定期的にバックアップし、問題発生後にはバックアップへ復元することでも復旧は行えます。 その場合にはバックアップから復旧までの更新内容は取り戻せませんが、どちらが望ましいか適宜判断してください。

判断材料のためにサポートへお問い合わせ頂いても問題ございません。

今後とも PowerCMS をはじめとする製品およびサポートをよろしくお願いいたします。

参考


カテゴリー
サポート
トラブルシューティング

Recent Entries