phpMyAdmin を使用して大きな SQL ファイルをインポートしようとしましたが、エラーが表示され続けました
「MySql サーバーがなくなりました」
何をすべきか?
phpMyAdmin を使用して大きな SQL ファイルをインポートしようとしましたが、エラーが表示され続けました
「MySql サーバーがなくなりました」
何をすべきか?
ここで述べたように:
MySQL サーバーがなくなった (エラー 2006) の最も一般的な 2 つの理由 (および修正) は次のとおりです。
サーバーがタイムアウトになり、接続が閉じられました。直し方:
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 時間) 程度である可能性があります。サーバーが誤った、または大きすぎるパケットをドロップしました。mysqld が取得したパケットが大きすぎるか正しくない場合、クライアントに問題が発生したと見なし、接続を閉じます。my.cnf ファイルの max_allowed_packet の値を増やすことで、最大パケット サイズの制限を増やすことができます。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;
私にとって、この解決策はうまくいかなかったので、実行しました
SET GLOBAL max_allowed_packet=1073741824;
私のSQLクライアントで。
実行中の MYSql サービスでこれを変更できない場合は、サービスを停止し、「my.ini」ファイルの変数を変更する必要があります。
例えば:
max_allowed_packet=20M
XAMPP を使用している場合は、次の変更で MySQL Server has gone away の問題を修正できます。
my.ini ファイルを開く my.ini の場所は (D:\xampp\mysql\bin\my.ini)
次の変数値を変更します
max_allowed_packet = 64M
innodb_lock_wait_timeout = 500
デフォルト値で実行している場合は、mysql 構成を最適化する余地がたくさんあります。
私が推奨する最初のステップは、max_allowed_packet を 128M に増やすことです。
次に、 MySQL Tuning Primer スクリプトをダウンロードして実行します。パフォーマンスを向上させるために、構成のいくつかの側面に推奨事項を提供します。
また、MySQL と PHP の両方でタイムアウト値を調整することも検討してください。
インポートするファイルのサイズ (ファイル サイズ) はどのくらいですか? また、PHPMyAdmin の代わりに mysql コマンド ライン クライアントを使用してファイルをインポートできますか?
max_allowed_packet
OS X で MAMP を使用している場合は、MySQL のテンプレートの値を変更する必要があります。
ファイル > テンプレートの編集 > MySQL my.cnfで見つけることができます。
次に、 を検索しmax_allowed_packet
、値を変更して保存します。
16 GB の SQL ファイルをインポートしたときに、このエラーとその他の関連するエラーが発生しました。私の場合、[mysqld] セクションで my.ini を編集し、(いくつかの異なる投稿に基づいて) 以下を設定します。
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 を使用している場合は、それを使用してこれらの一部またはすべてを設定することもできます。
これが発生するもう 1 つの理由は、メモリ不足です。/var/log/messages を確認し、my.cnf が設定されていないことを確認してください。これにより、mysqld はマシンのメモリよりも多くのメモリを割り当てます。
mysqld プロセスは実際にはカーネルによって強制終了され、その後、気付かないうちに「safe_mysqld」プロセスによって再起動される可能性があります。
top を使用して実行中のメモリ割り当てを監視し、ヘッドルームを確認します。
変更する前に、my.cnf のバックアップを作成してください。
「max_allowed_packet」を 1024M に更新しましたが、それでも機能しませんでした。デプロイ スクリプトが実行されていたことがわかりました。
mysql --max_allowed_packet=512M --database=mydb -u root < .\db\db.sql
この方法で行う場合は、コマンド ラインからより大きな数値を明示的に指定してください。
失敗するまでに時間がかかる場合は、wait_timeout
変数を大きくします。
すぐに失敗する場合は、max_allowed_packet
変数を大きくしてください。それでも機能しない場合は、コマンドが有効な SQL であることを確認してください。私のものには、すべてを台無しにするエスケープされていない引用符がありました。
また、可能であれば、1 つの SQL コマンドの挿入数を 1000 などに制限することを検討してください。 n 回の挿入ごとに INSERT... 部分を再導入することで、1 つのステートメントから複数のステートメントを作成するスクリプトを作成できます。
systemd などのサービス マネージャーが原因で mysqld プロセスが再起動しないことを確認します。
centos 7のvagrantでこの問題が発生しました。構成の微調整は役に立ちませんでした。systemd がメモリを消費しすぎるたびに mysqld サービスを強制終了していたことが判明しました。
私は、mysql接続が長時間滞在し、大量のデータを伴う大規模な計算を行っています。私はこの「Mysql go away issue」に直面していました。だから私はクエリを最適化しようとしましたが、それは私を助けませんでした。その後、デフォルトでより低い値に設定されているmysql変数の制限を増やしました。
wait_timeout max_allowed_packet
あなたに適した制限まで、それは Any Number * 1024(Bytes) でなければなりません。「 mysql -u username - p 」コマンドを使用して端末にログインし、これらの変数の制限を確認および変更できます。
GoDaddy 共有ホスティング アカウントでは、PHP.ini などのファイルを微調整するのは難しいです。ただし、別の方法があり、それは私にとって完璧に機能しました。(3100 行 145 列を含む 3.8Mb の .sql テキスト ファイルのアップロードに成功しました。phpMyAdmin で IMPORT コマンドを使用すると、恐ろしいMySQL server has gone awayエラーが表示され、それ以上の情報はありません。)
Matt Butcher が正しい答えを持っていることがわかりました。Matt のように、MySQL データベースを一口サイズのチャンクにエクスポートすることから、大きなインポートを小さなインポートに分割するスクリプトを作成することまで、あらゆる種類のトリックを試しました。しかし、ここで何がうまくいきました:
(1) CPANEL ---> FILES (グループ) ---> BACKUP
(2a) 「部分バックアップ」見出し
の下... (2b) 「MySQL データベース バックアップのダウンロード」の下
(2c) データベースを選択し、バックアップをダウンロードします (このステップはオプションですが、賢明です)。
(3a) 2b のすぐ右側、"Restore a MySQL Database Backup" という見出しの下
(3b) ローカル ドライブから .SQL インポート ファイルを選択
(3c) 本当の幸せはあなたのもの (まもなく....) 5秒
この方法を使用して、単一のテーブルをインポートできました。私のデータベースには他に影響はありませんでしたが、それは上記のステップ (2) で保護することを目的としています。
注
: .SQL インポート ファイルの作成方法がわからない場合は、phpMyAdmin を使用してテーブルをエクスポートし、そのファイル構造を変更します。