Ruby on Rails - Mysql2::Error: 非アクティブのため、クライアントはサーバーによって切断されました
概要
Ruby on Rails プロジェクトの Ruby バージョンを 2.5.8 から 3.0.6 にアップグレードしました。私の Ruby on Rails のバージョンは 6.1.7.6 です。 Ruby のバージョンをアップグレードした後、Rails コンソールを使用しているときに次のようなエラーが大量に発生するようになりました。 Ruby v2.5.8 ではそうではありませんでした。アプリ使用中は発生せず、コンソールからのみ発生するようです。
/usr/local/bundle/gems/mysql2-0.5.5/lib/mysql2/client.rb:151:in `_query': Mysql2::Error: The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior. (ActiveRecord::StatementInvalid)
/usr/local/bundle/gems/mysql2-0.5.5/lib/mysql2/client.rb:151:in `_query': The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior. (Mysql2::Error)
これが私のdatabase.ymlです
defaults: &defaults
adapter: mysql2
wait_timeout: 30
timeout: 500
reconnect: true
strict: false
host: somehostname
port: someportnumber
username: someusername
password: somepassword
database: somedatabasename
encoding: utf8mb4
collation: utf8mb4_unicode_ci
pool: 13
development:
primary:
<<: *defaults
shard1:
<<: *defaults
database: shard1
shard2:
<<: *defaults
database: shard2
mysql2 gem を 0.5.5 から 0.5.4 にダウングレードしようとしましたが、問題は解決していません。さらに、database.ymlのタイムアウトを増やしてみましたが、それも問題を解決していないようです。 Database.yml の再接続オプションが機能しなくなったようです。
解決策
これは、database.yml の wait_timeout 設定 30 秒です。 wait_timeout は、サーバーが非対話型接続でのアクティビティを閉じるまで待機する秒数です。 mysql2 gem は、デフォルトでは非対話型クライアントです (CLIENT_INTERACTIVE を使用して明示的に構築した場合を除く)。 wait_timeout 設定を削除するかもしれません。デフォルトの 8 時間は妥当だと思われます。