問題なく動作していたSQL文が突然動作しなくなったのでその原因を調べてみた。
現象
20個ほどあるテーブルで機能しなくなったのは3個。INSERTとUPDATEだけが何故か無視されるようになった。
ログを採ってみたがヒントになるようなものはなかった。
試してみたこと
問題が発生するテーブルと正常に動作するテーブルの違いから
・カラム数の制限オーバー
・データサイズの制限オーバー
などが原因ではないかと予想して、試験的にカラム数を減らしてみたら正常に動作するようになった。
しかし、制限オーバーになるほどの数ではなく、カラム数を減らす対策は現実的ではない。
チェックポイントはバージョンアップとsql_mode
MariaDBやMySQLの最新版には『sql_mode』のデフォルト値として "STRICT_TRANS_TABLES" が設定されているらしい。
この"STRICT_TRANS_TABLES"が設定されていると
『厳密モードとも呼ばれInsertやUpdateをした値がテーブルの指定に従っていない場合にSQLの実行を中止します』という動作モードになる。
『テーブルの指定に従っていない場合』の意味はまだ理解できていないがとりあえず『sql_mode』から"STRICT_TRANS_TABLES"を外す方法を試してみた。
先ずはMariaDBのサイト
https://mariadb.com/docs/server/server-management/variables-and-modes/sql-mode
でsql_modeのデフォルト情報が
STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO , NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
であることが分かったので
ERROR_FOR_DIVISION_BY_ZERO , NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
だけを設定する。
MariaDBの場合、設定をカスタマイズする方法として拡張子.cnfのファイルを作成し、そのファイルを「/etc/mysql/conf.d」フォルダーにコピーすればいいので
下記内容の「dbpatch.cnf」を作成、コピーしてMariaDBを再起動した。
[mysqld]
sql_mode=ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
その結果は
テーブル構成もプログラムも一切の修正なしで問題なく動作するようになった。
しかし、『テーブルの指定に従っていない場合』の対策はまだできていない。