このセクションでは、関連する Lost
connection to server during query
エラーもカバーしています。
MySQL server has gone away
エラーの最も一般的な原因は、サーバがタイムアウトして接続がクローズしたことです。デフォルトでは、何も起きない状態が
8
時間続くと、サーバは接続をクローズします。この時間は、mysqld
開始時に wait_timeout
変数を設定することで変更できます。
MySQL server has gone away
エラーが発生する一般的なもう一つの原因としては、MySQL
とのコネクション上で ``close''
を発行し、クローズしたコネクションでクエリを実行しようとしたことが考えられます。
スクリプトがある場合は、クライアントが自動再接続を実行するためのクエリを再発行するだけで解決します。
この場合、通常以下のエラーコードが取得されます(OS 依存です)。
エラーコード | 説明 |
CR_SERVER_GONE_ERROR |
クライアントがサーバに問い合わせを送信できませんでした。 |
CR_SERVER_LOST |
クライアントがサーバに書き込みを行った際エラーは発生しませんでしたが、問い合わせに対して完全な回答(または何らかの回答)が返ってきませんでした。 |
誰かが kill #スレッドID#
で実行中のスレッドを強制終了した場合も、このエラーが発生します。
mysqladmin version
を実行し、使用可能時間を調べることによって、MySQL
が強制終了されていないことを確認できます。問題が
mysqld
のクラッシュであれば、クラッシュの理由を見つけ出すことに注力してください。
この場合、まずクエリを再発行して、MySQL
が再び強制終了されるかどうかをチェックする必要があります。
See 項A.4.1. 「MySQL が何度もクラッシュする場合に行うこと」。
間違ったクエリか大きすぎるクエリをサーバに送信した場合も、このエラーが発生する可能性があります。mysqld
は大きすぎるか異常のあるパケットを取得すると、クライアントに何か問題が発生したとみなし、接続をクローズします。大きなクエリが必要な場合(たとえば、大きな
BLOB
カラムを使用している場合)、mysqld
を -O max_allowed_packet=#
オプション(デフォルト
1MB)で起動して、クエリ制限を引き上げることができます。拡張メモリは要求に応じて割り当てられます。そのため、mysqld
は、ユーザが大きなクエリを発行するときや、mysqld
が大きな結果レコードを返す必要のあるときだけ、メモリを増やして割り当てます。
クライアントが 4.0.8 より古く、サーバが 4.0.8 以上の場合、またはその逆の場合、16MB 以上のパケットを送信すると接続が失われます。
この問題についてバグレポートを作成する際には、必ず以下の情報を記入してください。
MySQL
が強制終了されたかどうか(この情報は、hostname.err
ファイル
にある)。 See
項A.4.1. 「MySQL が何度もクラッシュする場合に行うこと」。
特定のクエリが、mysqld
と、クエリ実行前に CHECK TABLE
によるチェックが実行された関連テーブルを強制終了する場合、このテストケースを実行することができるか。
See 項E.1.6. 「テーブルが破損した場合にテストケースを作成する」。
MySQL サーバにおける wait_timeout
変数の値は何か。 この値は、mysqladmin
variables
で確認することができる。
mysqld
を --log
で実行し、発行したクエリがログに出力されているかどうかチェックしたか。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.