MySQLのエラー『Server Has Gone Away』の解決方法

MySQLのエラー『Server Has Gone Away』の解決方法

MySQLで長時間のクエリ実行や大きなデータの送信を行う際に、『Server Has Gone Away』というエラーが発生することがある。このエラーは、サーバーとの接続が切断されたことを意味しており、主にタイムアウトやメモリ制限が原因となる。エラーの発生条件と具体的な解決策を確認する。

1. エラーの発生条件

このエラーは、以下のような状況で発生する。

  • 長時間実行されるクエリがある
  • 送信するデータサイズが大きすぎる
  • サーバーが再起動またはクラッシュした
  • ネットワーク接続が不安定
  • クライアントがMySQLに長時間接続し続けた後に操作を行った

2. MySQLのエラーログを確認する

エラーの原因を特定するために、MySQLのエラーログを確認する。

cat /var/log/mysql/error.log

3. max_allowed_packetのサイズを増やす

大きなデータを送信する際にエラーが発生する場合、max_allowed_packetのサイズを増やすことで解決できる。

[mysqld]
max_allowed_packet=64M

設定を反映させるためにMySQLを再起動する。

systemctl restart mysql

4. wait_timeoutの値を増やす

長時間のクエリ実行やアイドル接続が原因でエラーが発生する場合、wait_timeoutの値を増やす。

[mysqld]
wait_timeout=28800
interactive_timeout=28800

5. クライアント側の接続タイムアウトを調整する

PHPや他のアプリケーションから接続している場合、接続タイムアウトの設定を変更する。

mysqli_options($conn, MYSQLI_OPT_CONNECT_TIMEOUT, 60);

6. MySQLの接続を定期的にリフレッシュする

長時間アイドル状態の接続がある場合、定期的にクエリを実行して接続を維持する。

SET SESSION wait_timeout=28800;

7. クエリを最適化する

実行時間の長いクエリが原因の場合、クエリのパフォーマンスを改善する。

EXPLAIN SELECT * FROM large_table WHERE created_at > '2024-01-01';

8. MySQLサーバーのリソースを確認する

メモリやCPUの使用率を確認し、サーバーが適切に動作しているかチェックする。

free -m
top

9. MySQLの再起動

エラーが頻発する場合、MySQLを再起動することで改善することがある。

systemctl restart mysql

10. ネットワーク接続を確認する

リモートサーバーとの接続が不安定な場合、ネットワークの状態を確認する。

ping your-mysql-server
netstat -an | grep 3306

11. テーブルの破損をチェックする

テーブルが破損していると、クエリ実行中にエラーが発生することがある。

CHECK TABLE your_table;

12. MySQLのバージョンを確認する

古いバージョンを使用している場合、新しいバージョンへアップグレードすることでエラーを回避できる。

SELECT VERSION();