349

大きな SQL ファイル (大きなINSERTクエリ) を取得しようとすると、このエラーが発生します。

mysql>  source file.sql
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    2
Current database: *** NONE ***

ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    3
Current database: *** NONE ***

テーブル内の何も更新されません。テーブル/データベースの削除と削除の取り消し、および MySQL の再起動を試みました。これらのどれも問題を解決しません。

ここに私の最大パケットサイズがあります:

+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+

ファイルサイズは次のとおりです。

$ ls -s file.sql 
79512 file.sql

別の方法を試してみると…

$ ./mysql -u root -p my_db < file.sql
Enter password: 
ERROR 2006 (HY000) at line 1: MySQL server has gone away
4

24 に答える 24

637
max_allowed_packet=64M

この行をファイルに追加my.cnfすると、問題が解決します。

これは、問題の原因となる大きな値が列に含まれている場合に役立ちます。説明はこちらで確認できます。

Windows では、このファイルは "C:\ProgramData\MySQL\MySQL Server 5.6" にあります。

Linux (Ubuntu) の場合: /etc/mysql

于 2012-10-09T04:48:37.440 に答える
71

グローバル アップデートと my.cnf 設定が何らかの理由で機能しませんでした。max_allowed_packet値をクライアントに直接渡すと、次のように機能しました。

mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql
于 2013-12-19T22:14:23.623 に答える
41

一般的にエラー:

エラー: 2006 ( CR_SERVER_GONE_ERROR) - MySQL サーバーがなくなりました

クライアントがサーバーに質問を送信できなかったことを意味します。


mysql輸入

を介してデータベース ファイルをインポートしている特定のケースmysqlでは、SQL ファイル内のクエリの一部が大きすぎてインポートできず、サーバーで実行できなかったため、最初に発生したエラーでクライアントが失敗した可能性があります。

したがって、次の可能性があります。

  • 続行して残りのクエリを実行するには、強制オプション ( -f) を追加します。mysql

    これは、キャッシュに関連する大規模なクエリがデータベースに含まれている場合に便利です。

  • max_allowed_packetwait_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 など)を使用して接続をテストしますmysqltelnetmysql_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;
}
于 2016-06-07T14:32:38.170 に答える
21

念のため、使用できる変数を確認するには

$> mysqladmin variables -u user -p 

これにより、現在の変数、この場合は max_allowed_pa​​cket が表示されます。別の回答で誰かが言ったように、一時的に設定することができます

mysql> SET GLOBAL max_allowed_packet=1072731894

私の場合、cnf ファイルが考慮されておらず、その理由がわからないため、SET GLOBAL コードが非常に役立ちました。

于 2014-08-03T03:53:43.443 に答える
13

root (または SUPER 権限) としてデータベースにログインして、次のことを行うこともできます。

set global max_allowed_packet=64*1024*1024;

MySQL の再起動も必要ありません。my.cnf他の解決策で概説されているように、ファイルを修正する必要があることに注意してください。

[mysqld]
max_allowed_packet=64M

MySQL を再起動した後、変更を確認します。

show variables like 'max_allowed_packet';

コマンドラインも使用できますが、システムの更新やパッチに耐えられない可能性がある起動/停止スクリプトの更新が必要になる場合があります。

リクエストに応じて、ここに独自の回答を追加しています。それが機能するのを見てうれしいです!

于 2016-05-27T12:44:37.980 に答える
10

私は同じ問題を抱えていましたが、[mysqld] の下の my.ini/my.cnf ファイルで max_allowed_pa​​cket を変更するとうまくいきました。

行を追加

max_allowed_packet=500M

完了したら、MySQL サービスを再起動します。

于 2013-10-18T14:15:47.373 に答える
6

ここでいくつかのことが起こっている可能性があります。

  • あなたINSERTは長時間実行されており、クライアントは切断しています。再接続すると、データベースが選択されないため、エラーが発生します。ここでのオプションの 1 つは、コマンド ラインからバッチ ファイルを実行し、次のように引数でデータベースを選択することです。

$ mysql db_name < source.sql

  • もう1つは、phpまたは他の言語を介してコマンドを実行することです。長時間実行される各ステートメントの後、接続を閉じてから再度開くことができ、各クエリの開始時に接続されていることを確認できます。
于 2012-05-06T23:13:22.313 に答える
5

Mac を使用していて、私のように brew で mysql をインストールした場合は、次のように動作します。

  1. cp $(brew --prefix mysql)/support-files/my-default.cnf /usr/local/etc/my.cnf

ソース:自作の mysql インストールの場合、my.cnf はどこにありますか?

  1. max_allowed_packet=1073741824に追加/usr/local/etc/my.cnf

  2. mysql.server restart

于 2016-04-05T06:12:25.110 に答える
2

Mysql Cluster を使用しているときにこのエラーが発生しました。この質問がクラスターの使用によるものかどうかはわかりません。エラーはまったく同じなので、ここで私の解決策を教えてください。データ ノードが突然クラッシュするため、このエラーが発生します。ただし、ノードがクラッシュした場合でも、cmd を使用して正しい結果を得ることができます。

ndb_mgm -e 'ALL REPORT MEMORYUSAGE'

そして、mysqldも正常に動作するので、最初は何が悪いのか理解できません。そして約 5 分後、ndb_mgm の結果はデー​​タノードが機能していないことを示しています。それから私は問題に気づきます。そのため、すべてのデータ ノードを再起動してみてください。その後、mysql サーバーが戻ってきて、すべて問題ありません。

しかし、いくつかのクエリで mysql サーバーを失った後、 のような cmd を使用するとshow tables、 のような戻り情報を取得できます33 rows in set (5.57 sec)が、テーブル情報は表示されません。

于 2013-01-29T11:07:56.860 に答える
1

再接続して接続 ID 2 を取得している場合、サーバーはほぼ確実にクラッシュしています。

サーバー管理者に連絡して、問題を診断してもらいます。悪意のない SQL によってサーバーがクラッシュすることはなく、mysqldump の出力もクラッシュしないはずです。

おそらく、サーバー管理者が、アーキテクチャのアドレス空間の制限を超える、または仮想メモリ容量を超えるバッファ サイズを割り当てるなど、大きな操作エラーを起こした可能性があります。MySQL エラー ログには、関連する情報が含まれている可能性があります。とにかく有能であれば、彼らはこれを監視します。

于 2012-05-07T01:37:05.297 に答える
1

Amazon RDS の場合 (私の場合です)、max_allowed_packetパラメーター値を、挿入する可能性のある最大のデータに適したバイト単位の任意の数値に変更できます (例: 挿入に 50 MB の blob 値がある場合は、max_allowed_packet64M = 67108864)、新規または既存のparameter-group. 次に、そのパラメータ グループを MySQL インスタンスに適用します (インスタンスの再起動が必要になる場合があります)。

于 2018-01-26T15:17:43.173 に答える
0

上記の解決策をすべて試しましたが、すべて失敗しました。

defaultを使用する-h 127.0.0.1代わりに使用することになりましたvar/run/mysqld/mysqld.sock

于 2019-11-27T10:17:32.997 に答える
0

max_allowed_packet=64Mに追加[mysqld]

[mysqld] 
max_allowed_packet=64M

MySQL サーバーを再起動します。

于 2021-12-03T08:11:34.120 に答える
-3

次のようにmysqlクライアントを使用するのはどうですか:

mysql -h <hostname> -u username -p <databasename> < file.sql
于 2012-05-06T23:11:42.187 に答える