エラー2006(HY000):MySQLサーバーが廃止されました


309

大きな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

2
これはどれだけ大きなファイルですか?max_allowed_pa​​cket設定を超えている可能性がありますか?
マルクB

1
わかりました、それではありません。ファイルから個々のクエリを引き出して、モニターで自分で実行してみてください。何かがクラッシュ/切断の原因となっています。
マークB

ファイルからランダムに取得したクエリは正常に機能します。SQLをプログラムで生成し、すべてを適切にエスケープしました。そのため、エラーが発生する原因が何かはわかりません。
bgcode

1
私も同じ問題を抱えています...
maaz

回答:


561
max_allowed_packet=64M

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

これは、列の値が大きく、問題が発生する場合に役立ちますここで説明を見つけることができます。

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

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


3
この解決策は私にとって述べられた問題を解決しました。クライアント側のみの構成/オプションでは何もできず、PHPやその他のプログラムによるソリューションを実行するつもりはありませんでした。
Richard Sitze

154
root(またはSUPER権限)としてデータベースにログインして実行することもできますset global max_allowed_packet=64*1024*1024;
-MySQLの

3
これで解決しました。my.cnfは/ etcフォルダーにあります。
Sam Vloeberghs 2013年

8
これをコマンドラインに置くことができるはずです。これにより、システムファイルの一時的な編集を回避できます。<code> mysql --max_allowed_pa​​cket = 1GM </ code>
Jan Steinman

6
my.cnfファイルの場所を探している人は、この回答を確認できます。またsudo service mysql restart、my.cnfファイルへの変更を有効にするには、次のように入力してmysqlを再起動することを忘れないでください。
consuela

148

最大許可パケットを増やすことができます

SET GLOBAL max_allowed_packet=1073741824;

http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_pa​​cket


3
これは私にとってはうまくいきましたが、受け入れられた答えはうまくいきませんでした。この答えのより高い値が私にとっての解決策の根源だと思います。
ジョンブブリスキー

my.cnfにmax_allowed_pa​​cket = 1024Mを設定しました
Csaba Toth

1
それはサーバーです。「mysql --max_allowed_pa​​cket = 1073741824」のように、クライアントでもそれを行う必要があります。
Jan Steinman 2016

これでうまくいきました。一つの質問は、バイト単位で「1073741824」である
user2478236

66

グローバル更新とmy.cnf設定が何らかの理由で機能しませんでした。max_allowed_packet値を直接クライアントに渡すことはここで機能しました:

mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql

4
MySQL Webサイトによると、マークされた回答とこれの両方を使用する必要があります。
Zenexer 2014年

2
これらの設定を変更した後は、構成ファイルをリロードするかサーバーを再起動することを忘れないでください
Csaba Toth

2
--max_allowed_packetのみを使用すると、クライアントに影響することに注意してください。ファイルを編集max_allowed_packetしてmysqlサーバー(mysqld)を変更し、mysqlサーバー/etc/my.cnfを再起動することを検討してください。
Fleuv

「50M」または「1G」の人にやさしい値は、cliとmy.cnfで機能することに注意してください。dev.mysql.com/doc/refman/8.0/en/using-system-variables.html
txyoji

36

一般的にエラー:

エラー: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


一般的な理由

一般に、このエラーは次のようないくつかのことを意味する可能性があります。

  • サーバーへのクエリが正しくないか大きすぎる

    解決策:変数を増やし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接続からタイムアウトが発生しました。

    解決策:変数を増やしwait_timeoutます

  • サーバーへの接続が閉じられた後にクエリを実行しようとしました。

    解決策:アプリケーションの論理エラーを修正する必要があります。

  • ホスト名の検索に失敗した(DNSサーバーの問題など)、またはサーバーが--skip-networkingオプションで起動された。

    別の可能性として、ファイアウォールがMySQLポート(たとえば、デフォルトで3306)をブロックしている可能性があります。

  • 実行中のスレッドが強制終了されたため、再試行してください。

  • クエリの実行中にサーバーが停止するバグが発生しました。

  • 別のホストで実行されているクライアントには、接続に必要な特権がありません。

  • さらに多くの情報が含まれるため、B.5.2.9 MySQLサーバーが廃止されました


デバッグ中

以下は、エキスパートレベルのデバッグのアイデアです。

  • ログを確認してください。

    sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
  • 経由して接続をテストmysqltelnetまたはpingの機能(例えばmysql_pingPHPで)。

  • tcpdumpMySQL通信を傍受するために使用します(ソケット接続では機能しません)。例:

    sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings
  • Linuxでは、を使用しますstrace。BSD / Macではdtrace/を使用しますdtruss。例:

    sudo dtruss -a -fn mysqld 2>&1

    参照:MySQLのDTracing入門

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;
}

--quickは機能しませんでしたが、-skip-extended-insertは機能しました。
chiliNUT

20

念のため、変数をチェックするには

$> mysqladmin variables -u user -p 

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

mysql> SET GLOBAL max_allowed_packet=1072731894

私の場合、cnfファイルは考慮に入れられず、理由もわかりません。そのため、SET GLOBALコードが本当に役立ちました。


すべての構成設定を一度に確認できるのは素晴らしいことです。ありがとう!
DrB 2015

20

エラーを解決し、ERROR 2006 (HY000) at line 97: MySQL server has gone away次の2つの手順を順番に実行して、5 GBを超えるSQLファイルを正常に移行しました。

  1. 他の人が推奨するように/etc/my.cnfを作成し、次の内容を含めます。

    [mysql]
    connect_timeout = 43200
    max_allowed_packet = 2048M
    net_buffer_length = 512M
    debug-info = TRUE
  2. --force --wait --reconnectコマンドにフラグを追加しmysql -u root -p -h localhost my_db < file.sql --verbose --force --wait --reconnectます(つまり)。

重要な注意:/etc/my.cnfファイルに変更を加えたり、これらのフラグを追加したりしないと、インポート後に一部のテーブルが失われるため、両方の手順を実行する必要がありました。

使用システム:OSX El Capitan 10.11.5; mysql Ver 14.14 Distrib 5.5.51 for osx10.8(i386)


2
すべての指示に従ってもエラーが発生します。
Santosh Hegde 2017

共有ホストでこの問題を実行している人は、設定ファイルを変更できないため、このソリューションは非常にうまく機能します。
フェリペコスタ

@SantoshHegde手遅れになるかもしれませんが、を変更した後my.cnf、mysqlサービスを再起動する必要があります。
Jason Liu

11

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

行を追加

max_allowed_packet=500M

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


@babonkはい、しかしこの答えは、どのセクションの下に行く必要があるかを言うので、より有用です
Jason Wheeler

11

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';

コマンドラインを使用することもできますが、その場合はシステムのアップデートやパッチに対応できないstart / stopスクリプトを更新する必要があります。

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


9

解決策は、オプションファイルのタグの下にあるパラメータwait_timeoutconnect_timeout指定された値を増やすことです[mysqld]

400MBのmysqlバックアップを復元する必要があり、これでうまくいきました(以下で使用した値は少し誇張されていますが、要点はわかります)。

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE
connect_timeout = 1000000
net_write_timeout = 1000000
wait_timeout = 1000000
max_allowed_packet = 1024M
interactive_timeout = 1000000
net_buffer_length = 200M
net_read_timeout = 1000000
set GLOBAL delayed_insert_timeout=100000

ブロッククォート


1
すごい。これは私が解決できる別のエラーを取得するのに役立ちます:)
jrosell

6

ここでいくつかのことが起こります。

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

$ mysql db_name <source.sql

  • もう1つは、コマンドをphp他の言語で実行することです。実行時間の長いステートメントを実行するたびに、接続を閉じて再度開くことができます。これにより、各クエリの開始時に確実に接続されます。

もう一つの言及する価値は、私はほとんどすぐ後にエラーが出るということですsourceコマンド
bgcode

ソースコマンドの直後にエラーが発生する場合は、MySQLがクエリについて何か気に入らない可能性があります。一般的なログを確認しましたか?
Chris Henry

一般的なログを確認する方法を理解する必要があります。MAMPのImと、デフォルトで書き込むかどうかはわかりません。
bgcode

私はそれをPHPのクエリとスライスで解決することにしました。
bgcode


2

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

ndb_mgm -e 'ALL REPORT MEMORYUSAGE'

また、mysqldも正しく機能するため、最初は何が問題なのか理解できません。そして約5分後、ndb_mgmの結果は、データノードが機能していないことを示しています。その後、私は問題を実現します。そのため、すべてのデータノードを再起動してみてください。その後、mysqlサーバーが復旧し、すべてが正常です。

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


1

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


Amazon RDSを使用している場合、これは機能します。SebaGraが示すように、RDSでグローバル値を設定することはできません。DBのカスタムパラメータグループに移動して変更した場合、を見つけmax_allowed_packet parameterて適切なサイズに設定してください(または、本当に大きなBLOBがある場合は、最大値1073741824に設定してください) )動作するはずです。
G_Style

同じデータセットまたは完全にランダムなデータをロードするときに一貫したエラーが発生しましたか?私は同じ問題を抱えていますが、完全にランダムなので、5回失敗してから5日に機能するため、また、自分のローカルマシンに移動してVisual Studioから実行することも役立つようですが、それでも時々エラーが発生します。
BilliD

0

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

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

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


0

これはよりまれな問題ですが、DBを別のサーバーに移行する方法として、誰かが/ var / lib / mysqlディレクトリ全体をコピーした場合にこの問題が発生しました。これが機能しない理由は、データベースが実行中でログファイルを使用していたためです。/ var / log / mysqlにログがある場合、動作しないことがあります。解決策は、/ var / log / mysqlファイルもコピーすることです。


0

Drupal 8ユーザーがDBインポートエラーの解決策を探している場合:

SQLダンプファイルの最後に、「webprofiler」テーブルにデータを挿入するコマンドがあります。これは、デバッグログファイルの一部だと思いますが、サイトが機能するためにそれほど重要ではないため、これらすべてを削除できます。LOCK TABLESとUNLOCK TABLES(およびその間のすべて)を含むすべての挿入を削除しました。これはsqlファイルの一番下にあります。問題はここに記述されています:

https://www.drupal.org/project/devel/issues/2723437

しかし、そのテーブルを切り捨てること以外に解決策はありません。

ところで私は上記の答えからすべての解決策を試しましたが、それ以外には何も役に立ちませんでした。


0

上記のソリューションをすべて試しましたが、すべて失敗しました。

私は-h 127.0.0.1デフォルトを使用する代わりに使用してしまいましたvar/run/mysqld/mysqld.sock


0

このエラーメッセージは、ダンプで使用されているものとは異なるコレクションでスキーマを作成した場合にも発生します。したがって、ダンプに

CREATE TABLE `mytab` (
..
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

これをSCHEMA照合にも反映する必要があります。

CREATE SCHEMA myschema COLLATE utf8_unicode_ci;

スキーマでutf8mb4_general_ciを使用していたため、スクリプトはV8の新規インストールから取得されたため、古い5.7でDBをロードするとクラッシュし、ほぼ夢中になりました。

だから、多分これはあなたがいくつかのイライラする時間を節約するのに役立ちます... :-)

(MacOS 10.3、mysql 5.7)


-1

この回答で問題が解決しない場合は、テーブルを削除して次のように自動的に再作成することで解決しました。

when creating the backup, first backup structure and be sure of add:
DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT
CREATE PROCEDURE / FUNCTION / EVENT
IF NOT EXISTS
AUTO_INCREMENT

次に、このバックアップをdbで使用すると、必要なテーブルが削除および再作成されます。

次に、データのみをバックアップし、同じことを行います。


-3

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

mysql -h <hostname> -u username -p <databasename> < file.sql

SQLファイルが大きすぎる場合、これは機能しません...それが問題です。
lesolorzanov 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.