昨日リリースしたプログラム、実際に使ってもらったらどうも結果が思うようにならない。
ログを見てみると、SQLでエラーになってるみたいだ。データ件数が大きくなったことでエラーにつながったのかな?
今日のやったこと、できたこと
- システムメンテナンス
- プログラミング
- バグ調査
- 取引先のホームページ更新
- 読書
明日への課題
- 経理処理
- プログラミング
- プログラム勉強会
今日のワーク
今日起こったエラーは結果から言うとSQLの問題だった。
開発・テスト環境では100件くらいまでしかテストしなかったので、対象件数が増えた時に起こるエラーだった。
結論としては、SELECT文でINを使ってるんだけど、その対象件数が多くなった時にメモリ不足になったようだ。
最初調べた時はOracleにはINに1000件という件数制限があって、それが原因なのかなと思ったけどMySQLの場合には1000件の件数制限はなくて、SQL文の長さの問題だけだとあった。
なので、最初はプログラムを1000件単位でSELECTするように修正しようと思ってて、でも別で検索したオブジェクトをまとめるの簡単な書き方ないかな?なんて考えてた。
しかし、SQL文の長さの問題なら容量増やしたら大丈夫なんじゃない?ってことで、通信容量をチェックした。
MySQLの設定でいうところの「max_allowed_packet」です。
確認すると、これが1MBだった。これってデフォルトなのかな?
なので、この容量を一気に16MBに増やしてmariaDBを再起動すると、プログラム全然普通に動いた。
というわけで、プログラム直さずに対応完了した。
とりあえず、当分監視は続けるけどね。忘れないように設定の方法はこんな感じ。
まずは、設定ファイル「my.cnf」に下記を追記
max_allowed_packet=16MB
そしたら、MySQLを再起動。うちはMariaDBなのでこのコマンド
systemctl restart mariadb.service
再起動が完了したら、コマンドラインからチェック
$ mysql -u xxx -p MariaDB [(none)]> show variables like 'max_allowed_packet'; +--------------------+----------+ | Variable_name | Value | +--------------------+----------+ | max_allowed_packet | 16777216 | +--------------------+----------+ 1 row in set (0.00 sec)
無事に16MBになってますね。よかったよかった。
明日はプログラムの勉強会があるので、新しいプロジェクトのプログラムを少しでも進めたいんだけど、その前に今月の経理処理を終わらせておかないとな。
結構経理の仕事嫌いじゃない感じ。
一人でやるのもいいなと。規模のせいもあるんだけど、任せるより気楽な気がする。
そんな感じ。