一般的にエラー:
エラー: 2006 ( CR_SERVER_GONE_ERROR
) - MySQL サーバーがなくなりました
クライアントがサーバーに質問を送信できなかったことを意味します。
mysql
輸入
を介してデータベース ファイルをインポートしている特定のケースmysql
では、SQL ファイル内のクエリの一部が大きすぎてインポートできず、サーバーで実行できなかったため、最初に発生したエラーでクライアントが失敗した可能性があります。
したがって、次の可能性があります。
続行して残りのクエリを実行するには、強制オプション ( -f
) を追加します。mysql
これは、キャッシュに関連する大規模なクエリがデータベースに含まれている場合に便利です。
max_allowed_packet
wait_timeout
サーバー構成でとを増やし~/.my.cnf
ます (例: )。
オプションを使用してデータベースをダンプ--skip-extended-insert
し、大規模なクエリを分割します。その後、再度インポートします。
--max-allowed-packet
のオプションを適用してみてくださいmysql
。
一般的な理由
一般に、このエラーは次のようないくつかのことを意味する可能性があります。
サーバーへのクエリが正しくないか大きすぎる
解決策: variableを増やしmax_allowed_packet
ます。
変数が[mysqld]
ではなく、セクションの下にあることを確認してください[mysql]
。
テストに大きな数を使用することを恐れないでください ( など1G
)。
MySQL/MariaDB サーバーを再起動することを忘れないでください。
次のようにして、値が正しく設定されていることを再確認します。
mysql -sve "SELECT @@max_allowed_packet" # or:
mysql -sve "SHOW VARIABLES LIKE 'max_allowed_packet'"
クライアント側の TCP/IP 接続からタイムアウトが発生しました。
解決策: variableを増やしwait_timeout
ます。
サーバーへの接続が閉じられた後にクエリを実行しようとしました。
解決策: アプリケーションの論理エラーを修正する必要があります。
ホスト名の検索に失敗したか (DNS サーバーの問題など)、またはサーバーが--skip-networking
オプションで起動されました。
もう 1 つの可能性は、ファイアウォールが MySQL ポートをブロックしていることです (たとえば、デフォルトでは 3306)。
実行中のスレッドが強制終了されたため、再試行してください。
クエリの実行中にサーバーが停止するというバグが発生しました。
別のホストで実行されているクライアントには、接続に必要な権限がありません。
B.5.2.9 MySQL server has gone away .
デバッグ
以下に、専門家レベルのデバッグのアイデアをいくつか示します。
ログを確認します。
sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
または ping 関数 ( PHP など)を使用して接続をテストしますmysql
。telnet
mysql_ping
MySQL 通信を盗聴するために使用tcpdump
します (ソケット接続では機能しません)。例:
sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings
Linux では、 を使用しますstrace
。BSD/Mac ではdtrace
/dtruss
を使用します。
sudo dtruss -a -fn mysqld 2>&1
参照: DTracing MySQL の概要
MySQL サーバーまたはクライアントをデバッグする方法の詳細については、「26.5 MySQL のデバッグと移植」を参照してください。
参考までに、クライアント コマンドsql-common/client.c
のエラーをスローする原因となったファイルのソース コードを確認してください。CR_SERVER_GONE_ERROR
MYSQL_TRACE(SEND_COMMAND, mysql, (command, header_length, arg_length, header, arg));
if (net_write_command(net,(uchar) command, header, header_length,
arg, arg_length))
{
set_mysql_error(mysql, CR_SERVER_GONE_ERROR, unknown_sqlstate);
goto end;
}