大きなsqlファイルをインポートすると、MySQLサーバーがなくなった


259

phpMyAdminを介して大きなSQLファイルをインポートしようとしましたが、エラーが表示され続けました

「MySqlサーバーがなくなった」

何をすべきか?


3
max_allowed_pa​​cketとwait_timeoutの値は何ですか?
daemonofchaos 2012

1
あなたは倍増しようとすることができますmax_allowed_packet。少し粗雑ですが、それがうまくいけば、正気な値を見つけることができます。
ナンヌ

1
笑ってくれてありがとうCole Johnson。最高でした!笑!:)
mbrinson 2014年

偶然よく目にします。しかし、同じエラーを再現することはできません。そして、それゆえ、それは動的であるかもしれないことに気づきました。場合によっては、クライアントがサーバーに送信するSQLが多すぎると(ループからなど)、これが発生することがあります。このエラーの実際の理由を見つけることは重要です。手がかりを見つけるために、SQLの繰り返しパターンもクエリログで確認してください。
Bimal Poudel 2014

ディスク容量が少ないときにこれが発生することがあります
pramodtech 2014年

回答:


376

ここで述べたように

MySQLサーバーが廃止された(エラー2006)2つの最も一般的な理由(および修正)は、次のとおりです。

サーバーがタイムアウトし、接続を閉じました。直し方:

  1. mysqldのmy.cnf構成ファイルのwait_timeout変数が十分に大きいことを確認します。Debianの場合:秒をsudo nano /etc/mysql/my.cnf設定しwait_timeout = 600(エラー2006がなくなったときにこの値を微調整することができます)、次にsudo /etc/init.d/mysql restart。確認しませんでしたが、wait_timeoutのデフォルト値は約28800秒(8時間)です。

  2. サーバーが誤った、または大きすぎるパケットをドロップしました。mysqldが大きすぎるか正しくないパケットを取得した場合、クライアントで何か問題が発生したと見なし、接続を閉じます。my.cnfファイルのmax_allowed_pa​​cketの値を増やすことにより、最大パケットサイズ制限を増やすことができます。Debianの場合:sudo nano /etc/mysql/my.cnfを設定しmax_allowed_packet = 64M(エラー2006がなくなったときにこの値を微調整することができます)、次にsudo /etc/init.d/mysql restart

編集:

MySQLオプションファイルには、コマンド(たとえば、php.iniなど)がコメントとしてすでに使用可能になっていないことに注意してください。変更/微調整を入力する必要がありますので、my.cnfまたはmy.iniそれらをと場所mysql/dataなどのオプションの適切なグループの下に、ディレクトリまたは他のパスのいずれかで[client][myslqd]たとえば、など:

[mysqld]
wait_timeout = 600
max_allowed_packet = 64M

次に、サーバーを再起動します。それらの値を取得するには、mysqlクライアントを入力します。

> select @@wait_timeout;
> select @@max_allowed_packet;

72
私の場合、それはmax_allowed_pa​​cket変数でした。これはデフォルトの1 MBに設定され(SHOW VARIABLESMySQLクエリを実行すると確認できます)、インポートしたファイルにはいくつかの非常に大きなレコードが含まれていました。my.iniファイルを開き(Windowsを実行していた)、値を次のように設定し、max_allowed_packet = 64MMySQLを再起動してインポートを再実行しました。
ブレントMatzelle

大きな問題をwebissuesとともにデータベースにアップロードしていました。助けてくれてありがとう... :-)
inf3rno

@BrentMatzelleそれは確かに「Mysqlがなくなった」問題を処理しました。ありがとう!
asprin 2013

2
wait_timeout行が見つかりません
沖エリーリナルディ

5
Windows(Xamppを使用)の場合は、my.iniファイルとinnodb_lock_wait_timeout
Ananda

98

私にとってこの解決策はうまくいかなかったので、私は実行しました

SET GLOBAL max_allowed_packet=1073741824;

私のSQLクライアントで。

MYSqlサービスの実行中にこれを変更できない場合は、サービスを停止して、「my.ini」ファイルの変数を変更する必要があります。

例えば:

max_allowed_packet=20M

1
これは、他のより一般的な回答がうまくいかなかったMAMP(OS X)で私にとってはうまくいきました。しかし、それは永続的ですか?
atwixtor 2015

2
@atwixtorいいえ、このような変数の設定は、サーバーが再起動されるまで機能します。その後、デフォルト値にリセットされます。
d.raev

1
Windowsのテスト用XAMPPマシンでは、php.iniファイル(回答の@GBDで提案されている)とMySQL my.ini構成ファイルの両方を変更して機能させる必要がありました。
Gruber

2
現在のサイズを確認できることを追加することをお勧めしますSHOW variables LIKE 'max_allowed_packet'
Arth

これは、サーバーが(最終的に)再起動したときに値がリセットされるという点で永続的ではありませんが、現在のセッションだけのものではありません。max_allowed_packetを1つのクライアントに設定してから.sql、別のセッションで大きなファイルをインポートすると問題なく動作します。
VoteyDisciple

21

XAMPPで作業している場合は、MySQLサーバーが次の変更で問題を解消したことを修正できます。

my.iniファイルを開きます。my.iniの場所は(D:\ xampp \ mysql \ bin \ my.ini)です。

次の変数値を変更する

max_allowed_packet = 64M
innodb_lock_wait_timeout = 500

wampのサンプル、max_allowed_pa​​cket = 64M
Andrew

19

デフォルト値で実行している場合は、mysql設定を最適化する余地がたくさんあります。

私がお勧めする最初のステップは、max_allowed_pa​​cketを128Mに増やすことです。

次に、MySQL Tuning Primerスクリプトをダウンロードします。を実行します。パフォーマンスを向上させるために、構成のいくつかの側面に推奨事項を提供します。

MySQLとPHPの両方でタイムアウト値を調整することも検討してください。

インポートするファイルのサイズ(ファイルサイズ)はどのくらいですか?また、PHPMyAdminではなくmysqlコマンドラインクライアントを使用してファイルをインポートできますか?


ありがとう、私はすでにmax_allowed_pa​​cketを16Mに設定していて、この質問を見つけて、それで十分だと思って32Mに上げましたが、あなたの答えを見て、128Mは確実に機能しました。* .sqlファイル内のSQLステートメント全体が1つのパケットとして扱われることを収集していますか?
Elijah Lynn

8

OS XでMAMPを使用しているmax_allowed_packet場合は、MySQLのテンプレートの値を変更する必要があります。

  1. あなたはでそれを見つけることができます:[ファイル]> [編集テンプレート>のMySQLのmy.cnf

  2. 次に、を検索しmax_allowed_packet、値を変更して保存します。


6

この短い/etc/mysql/my.cnfファイルで問題を解決しました:

[mysqld]
wait_timeout = 600
max_allowed_packet = 100M

1
これはWAMP上のMySQL v5.6.12でも機能することを確認しました。Windowsでは、次の[mysqld]セクションに上記の "wait_timeout"および "max_allowed_pa​​cket"行を追加します。wamp \ bin \ mysql \ mysql_version \ my.ini
dean.huczok

おかげで、@ danは私の1年前の問題を解決しました。セクションの下にこれらの設定を追加したことはありません[mysqld]
shivgre

これはMySQL v5.7で機能します。my-default.iniはデフォルトでは作成されないため、作成する必要があります。
ロドルフォベラスコ

5

これが発生するもう1つの理由は、メモリ不足です。/ var / log / messagesを確認し、myd.cnfが、mysqldがマシンのメモリよりも多くのメモリを割り当てるように設定されていないことを確認します。

mysqldプロセスは実際にはカーネルによって強制終了され、その後、ユーザーが気付かないうちに「safe_mysqld」プロセスによって再起動される可能性があります。

topを使用し、実行中にメモリ割り当てを監視して、ヘッドルームを確認します。

変更する前にmy.cnfのバックアップを作成してください。


これが私の問題の原因でした。1GBのスワップファイルを追加して完全に修正しました。
Pikamander2 2016

5

16 GBのSQLファイルでインポートしたときに、このエラーと他の関連するエラーが発生しました。私にとっては、my.iniを編集し、[mysqld]セクションで(いくつかの異なる投稿に基づいて)以下を設定します。

max_allowed_packet      = 110M
innodb_buffer_pool_size=511M
innodb_log_file_size=500M
innodb_log_buffer_size = 800M
net_read_timeout        = 600
net_write_timeout       = 600

Windowsで実行している場合は、コントロールパネル、サービスに移動し、MySQLの詳細を確認すると、my.iniがどこにあるかがわかります。次に、my.iniを編集して保存した後、mysqlサービスを再起動します(またはコンピューターを再起動します)。

HeidiSQLを使用している場合は、それを使用してこれらの一部またはすべてを設定することもできます。


2

「max_allowed_pa​​cket」を1024Mに更新しましたが、まだ機能していませんでした。私の展開スクリプトが実行されていたことがわかりました:

mysql --max_allowed_packet=512M --database=mydb -u root < .\db\db.sql

このように指定する場合は、コマンドラインからより大きい数値を明示的に指定してください。


2

データにデータが含まれているBLOB場合:

コマンドラインからのデータのインポートがBLOBデータで窒息しているように見えるため、「MySQLサーバーがなくなった」エラーが発生することに注意してください。

これを回避するには、mysqldumpを--hex-blobフラグを付けて再作成します。

http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_hex-blob

他のテキストの中でバイナリではなく16進値でデータファイルを書き出します。

PhpMyAdminには、「16進表記のバイナリ列をダンプする(たとえば、「abc」は0x616263になる)」オプションもあり、うまく機能します。

(2015年12月の時点で)長期にわたるバグがあることに注意してください。これは、GEOM列が変換されないことを意味します 。mysqldumpを使用して、GEOMETRY列を持つテーブルをバックアップしますか? したがって、PhpMyAdminなどのプログラムを使用することが唯一の回避策のようです(上記のオプションはGEOM列を正しく変換します)。


1

失敗するまでに時間がかかる場合は、wait_timeout変数を大きくします。

すぐに失敗する場合は、max_allowed_packet変数を大きくしてください。それでも機能しない場合は、コマンドが有効なSQLであることを確認してください。鉱山は、すべてを台無しにしたエスケープされていない引用を持っていました。

また、可能であれば、単一のSQLコマンドの挿入数を1000などに制限することを検討してください。n個の挿入ごとにINSERT ...部分を再導入することで、単一のSQLコマンドから複数のステートメントを作成するスクリプトを作成できます。


1

私は同様のエラーを受け取りました。これを解決するには、my.iniファイルを開きます。ここで36行目で、許可される最大パケットサイズの値を変更します。max_allowed_pa​​cket = 20M


1

systemdなどのサービスマネージャーのために、mysqldプロセスが再起動しないことを確認します。

Centos 7の迷惑行為でこの問題が発生しました。設定の微調整は役に立ちませんでした。大量のメモリを使用するたびにmysqldサービスを強制終了するのはsystemdであることが判明しました。


0

データベースを複製するときに今日同様のエラーが発生しましたが(MySQLサーバーが削除されました...)、mysql.server restartを再起動しようとするとエラーが発生しました

ERROR! The server quit without updating PID ...

これは私がそれを解決した方法です:私はアプリケーション/ユーティリティ/を開き、アクティビティモニターを実行しました

 quit mysqld

それからエラー問題を解決することができました

mysql.server restart

0

私はmysql接続を含むいくつかの大規模な計算を行っています。これは、長い時間、大量のデータを保持するためです。私はこの「Mysqlの問題」に直面していました。だから私はクエリを最適化しようとしましたが、それは私を助けませんでした、そして私はデフォルトでより低い値に設定されているmysql変数の制限を増やしました。

wait_timeout max_allowed_pa​​cket

これまであなたに合っているものを制限するために、それは任意の数* 1024(バイト)でなければなりません。' mysql -u username-p 'コマンドを使用して端末にログインし、これらの変数の制限を確認して変更できます。


0

GoDaddy共有ホスティングの場合

GoDaddy共有ホスティングアカウントでは、PHP.iniなどのファイルを微調整するのが難しいです。しかし、別の方法があり、それは私にとっては完璧に機能しました。(3100行と145列を含む3.8Mbの.sqlテキストファイルを正常にアップロードしました。phpMyAdminのIMPORTコマンドを使用して、恐ろしいMySQLサーバーがエラーを解消しました。それ以上の情報はありません。)

マットブッチャーの答えは正解でした。Mattと同様に、MySQLデータベースを一口サイズのチャンクでエクスポートすることから、大きなインポートを小さなインポートに分割するスクリプトを書くことまで、あらゆる種類のトリックを試しました。しかし、これがうまくいきました:

(1)CPANEL ---> FILES(グループ)---> BACKUP

(2a)「部分バックアップ」の見出しの
下で... (2b)「MySQLデータベースバックアップのダウンロード」の下で
(2c)データベースを選択してバックアップをダウンロードします(このステップはオプションですが、賢明です)。

(3a)2bのすぐ右側、「MySQLデータベースバックアップの復元」という見出しの下
(3b)ローカルドライブから.SQLインポートファイルを選択
(3c)本当の幸せはあなたのもの(まもなく....) 5秒

この方法を使用して単一のテーブルをインポートすることができました。私のデータベースの他の部分は影響を受けませんでした-しかし、それは上記のステップ(2)が保護することを目的としています。

注:
a。.SQLインポートファイルの作成方法がわからない場合は、phpMyAdminを使用してテーブルをエクスポートし、そのファイル構造を変更します。

出典: Matt Butcher 2010記事


わかりましたので、すぐに反対票を投じますが、その理由についてのコメントはありません。この情報は誰かにとってうまくいきませんでしたか?もしそうなら、共有してください-それは私のために働いたので、私はこの答えを追加しました。上記の他の答えは私にはうまくいきませんでしたが、この解決策はうまくいきました。では、なぜ反対票か。GoDaddyを使用していても問題が解決しない場合は、サポートさせていただきます。ただし、GoDaddy共有ホスティングを使用していない場合この回答が当てはまらないという理由だけで、なぜこの回答に反対票を投じるのですか?
cssyphus 2018

0

増加max_allowed_packetしても効果がない場合。

インポート時に同じエラーが発生しました .sqlSequel Proを使用してデータベースにファイルを。

max_allowed_packettoをアップした後もエラーが解決しない512Mので、代わりにコマンドラインでインポートを実行しました:

mysql --verbose -u root -p DatabaseName < MySQL.sql

次のエラーが発生しました:

ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled

StackOverflowに役立つ質問がいくつか見つかりました。

私の場合、私の.sqlファイルは少し壊れているか何かでした。取得するMySQLダンプは2つのzipファイルで提供されます。これらは一緒に連結してから解凍する必要があります。解凍が最初に中断されたため、ファイルに奇妙な文字とエンコーディングが残っていると思います。新しいMySQLダンプを取得して適切に解凍すると、うまくいきました。

他の人がmax_allowed_packet変数の増加が役に立たないことに気付いた場合に備えて、これをここに追加したかっただけです。



0

同じ問題が発生しました

$image_base64 = base64_encode(file_get_contents($_FILES['file']['tmp_name']) );
$image = 'data:image/jpeg;base64,'.$image_base64;
$query = "insert into images(image) values('".$image."')";
mysqli_query($con,$query);

phpmyadminの\ xampp \ mysql \ bin \ my.iniファイルでは、

[mysqldump]
max_allowed_packet=110M

これはmysqldump -u root -p dbname専用です。上記のコードを次のコードに置き換えることで問題を解決しました

max_allowed_packet=110M
[mysqldump]
max_allowed_packet=110M
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.