こんばんは、K’z Style代表・宮崎です。
baserCMS 4.3.4がリリースされたので、久しぶりにクリーンインストールをしてみたところ、インストールの最後のステップで「内部エラー」が発生。
ログ(インストール先ディレクトリ/app/tmp/logs/error.log)を見てみると
: 2020-04-25 13:20:02 Error: [PDOException] SQLSTATE[HY000]: General error: 1525 Incorrect DATETIME value: '0000-00-00 00:00:00' Request URL: /baser4/installations/step5 Stack Trace: :
というのが記録されていた。
どうやらデータベースへの書き込み時の問題のようだ。
で、MySQLの設定を確認してみる。使っているのはMySQL 5.7。
MySQLにログインしてsql_modeの状態を確認してみると
mysql> select @@session.sql_mode; +-------------------------------------------------------------------------------------------------------------+ | @@session.sql_mode | +-------------------------------------------------------------------------------------------------------------+ | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | +-------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select @@GLOBAL.sql_mode; +-------------------------------------------------------------------------------------------------------------+ | @@GLOBAL.sql_mode | +-------------------------------------------------------------------------------------------------------------+ | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | +-------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
MySQLのsql_modeは特に設定変更していないのでこれがMySQL5.7の既定値。
どうやら「NO_ZERO_DATE」が影響している様子。
NO_ZERO_IN_DATE(月や日に0がある日時を無効な日時として扱う)、NO_ZERO_DATE(0や0000-00-00を無効な日時として扱う) を外すことにする。
まずは /etc/my.cnf を編集
: [mysqld] <--- このセクションの最後くらいに下記を挿入 : sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION :
- ONLY_FULL_GROUP_BY
- STRICT_TRANS_TABLES
- ERROR_FOR_DIVISION_BY_ZERO
- NO_ENGINE_SUBSTITUTION
を指定することにする。
各設定値の意味は「MySQL5.6 リファレンスマニュアル :: 5.1.7 サーバー SQL モード」を参照。
/etc/my.cnfの編集が終わったらMySQL デーモンを再起動
# systemctl restart mysqld
sql_modeの内容を再確認してみると
mysql> select @@GLOBAL.sql_mode; +------------------------------------------------------------------------------------------+ | @@GLOBAL.sql_mode | +------------------------------------------------------------------------------------------+ | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | +------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select @@session.sql_mode; +------------------------------------------------------------------------------------------+ | @@session.sql_mode | +------------------------------------------------------------------------------------------+ | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | +------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
ちゃんと設定変更されている。
この状態で再度baserCMSにアクセスしてみたところ、無事アクセスできた。
さて、
今回baserCMSをインストールしたサーバでは、他のシステムは動いていないので比較的手軽にsql_modeの設定変更をすることができたのだけど、これが実運用で他のシステムが稼働中の場合にはこんなふうにはいかないだろう。
どう判断すべきか?
心情としては安易にsql_modeを変更したくはない。
今回はオンプレのサーバだからmy.cnfファイルを編集できたけれど、これがレンタルサーバだとこうはいかない。
さりとてbaserCMS側のコードを変更していくのも(0000-00-00 をinsertしている箇所をせめて0001-01-01 くらいにすればよいのだろう)次のアップデートが発生した場合に上書きされてしまうだろう。
できれば開発元に対応してほしいところだけど、、
開発元としては「sql_modeからはNO_ZERO_DATEは外すべき」というポリシーなのだろうか?
「動いたからよし!」というわけにもいかない。
悩ましいところだ…
最後までおつきあいいただき、ありがとうございます。
コメント