2024年3月19日火曜日

MAX_QUERIES_PER_HOURでデータベース繋がらない

こんばんは、こうちゃんです。

先日開発中のサイトで突如データベースに繋がらなくなり困ってしまう事態が起きまして、
未来のために原因や解決方法等を備忘録代わりに残しておきますー。

まず、プログラム整備中のサイトにある時アクセスしたら、

has exceeded the 'max_connections_per_hour' resource (current value: 〇〇) i
n

みたいなエラーが出てデータベースに接続するプログラムがエラーで通らなくなってしまいました。
困ったことにこれ、エラー発生原因部分のプログラム消しても何しても一定時間アクセスできなくなってしまうんですね。
何もできないので、その間に、このエラーの原因や対処方法を確認しまして、一応の解決をしましたのでそのあたりのご説明を。

まずエラーに関しては、単純にエラーの英語文通りで、
プログラムで、一時間以内に、
MySQLの、max_connections_per_hour、という設定値以上のセッションを張ってしまったことが原因です。
この値はMySQLユーザーごとの設定ではありますが、
だいたいサイト開いた時に実行プログラム内で、どのユーザーで繋ぐかは決まっているのがほとんどですので、例えば、データを引き出すのに10クエリ発する画面があったとして、その画面を1時間以内に100回開かれれば、1000セッションを張ったことになり、設定値が1000であれば、これでもうエラーに引っ掛かります。

説明でも、
時間単位の接続数: 1時間で新しく開ける接続
これ、私のレンタルサーバーでは1500になっていたのですが、
1時間に新しく開ける接続、てことは、シンプルにサイトを見たら、トップページでSQL使っていたらどんなに工夫してあっても、1接続は発生しますよね、てことは1時間以内にちょっとアクセスが集中しただけでもうお陀仏なんじゃ・・・
なんて設定でしょうねえ。

公式にも
サーバーが実行されると、各アカウントがリソースを使用する回数がカウントされます。過去 1 時間以内にアカウントが接続数に対する制限に達した場合は、その時間が経過するまで、そのアカウントによる以降の接続が拒否されます。
てなってますし。

さすがにこれじゃ使い物にならないので、
解決するためには、まずはプログラムの方は最適化して、むやみにデータベースに対してコネクションを張らないように(必要最低限)するのはもちろんとして、
その上で、この設定値をかなり引き上げておくか、それでもいつかオーバーすることを予期して、規制を停止するかのいずれかがよいかと。

既定数を変更する場合、

GRANT USAGE ON *.* TO 'ユーザー名'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 数字;

とSQL発行して、数字で最大数を決めればその数値になります。
また、そもそも最大数を制御したくない(規制しない)場合はこの数値を0にします。

GRANT USAGE ON *.* TO 'ユーザー名'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0

これで今後この制御は外れます。
といっても、むやみにコネクションを増やさないようなシステム作りも心がけた方がよいのも言うまでもないですが。

こうちゃん

0 件のコメント:

コメントを投稿