Techioz Blog

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 時間は妥当だと思われます。