mysql のエラー: (2006、「MySQL サーバーが消えた」) の問題は、クライアントと MySQL サーバー間のリンクが壊れていることを意味します。
この理由は一般に、SQL 操作に時間がかかりすぎるか、送信されるデータが大きすぎることです (たとえば、insert ...values を使用するステートメントが長すぎます。この状況は解決できます)これを回避するには、max_allowed_packed の構成パラメータを変更して、プログラム内でデータをバッチに挿入することもできます。この問題には多くの理由があります。オンライン分析の概要は次のとおりです。
原因 1. MySQL サービスがダウンしている
これが原因であるかどうかを判断する方法は非常に簡単です。 mysql コンソールで mysql を確認してください。mysql の実行時間> には、「uptime」などのグローバル ステータスが表示されます。
+---------------+---------+
| 変数名 |
+------+-------+
|
+ ------- --------+----------+1 行がセットされているか、MySQL エラー ログを確認して再起動情報があるかどうかを確認します。大きい場合は、mysql サービスが長時間実行されていることを示します。これは、サービスが最近再開されていないことを意味します。
ログに関連する情報がない場合は、mysql サービスが最近再起動されていないことを意味します。引き続き次の項目を確認できます。
原因 2. MySQL 接続タイムアウト
つまり、長い MySQL 接続が長期間新しいリクエストを開始せず、サーバー側でタイムアウトに達し、サーバーによって強制的に閉じられました。 。
この接続を通じて後続のクエリが開始されると、サーバーが消えたというエラーが報告されます
(ほとんどの PHP スクリプトがこのカテゴリに分類されます)
mysql> '% のようなグローバル変数を表示します。タイムアウト';
+----------------------------+----------+
| 変数名 |
+----------------------------+----------+
| 10 |
| innodb_lock_wait_timeout |
|アウト | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 3600 |
| - -----------+----------+
setwait_timeout の 10 行は 28800 秒です。つまり、mysql リンクは 28800 秒後に自動的に閉じられます。操作がありません
原因 3。mysql リクエスト リンク プロセスがアクティブに強制終了されます
この状況は理由 2 と似ていますが、1 つは人間によるもので、もう 1 つは mysql 自身のアクションであるという点が異なります。 'com_kill' のようなステータス;
+--------------+-------+
値 |
+---- ------- ----+------+
|
+------+-- -----+
1 row in set
理由 4. SQL ステートメントが長すぎます
このエラーは、クエリ結果セットが max_allowed_packet を超えている場合にも発生します。 。検索方法は、関連するエラー ステートメントを入力することです。 select * into outfile を使用してファイルにエクスポートし、ファイル サイズが max_allowed_packet を超えているかどうかを確認します。超えている場合は、パラメーターを調整するか、ステートメントを最適化する必要があります。
mysql> 'max_allowed_packet' のようなグローバル変数を表示します;
+---------+--------+
| 値 |
+------ ----------+--------+
| 1048576 |
+---------- - -------+--------+
セット内の 1 行 (0.00 秒)
パラメータの変更: mysql> set global max_allowed_packet=1024*1024*16 ;
mysql> 'max_allowed_packet' のようなグローバル変数を表示します;
+---------+----------+
| 変数名 |
+---------------+----------+
| max_allowed_packet |16777216 |
+----------+----------+
1 行in set (0.00 sec)
以下は補足です:
アプリケーション (PHP など) は、MYSQL ステートメントのバッチを長時間実行します。 SQL を実行しますが、SQL ステートメントが大きすぎるか、ステートメントに BLOB または Longblob フィールドが含まれています。たとえば、画像データの処理です。 MySQL サーバーがなくなってしまうのは簡単です。
今日、私も同様の状況に遭遇しました。MySQL は冷たく言いました。MySQL サーバーが消えました。
簡単に確認してください。次の理由が考えられます。
送信された SQL ステートメントが長すぎて、max_allowed_packet のサイズを超えている可能性があります。この場合は、必要なのは、それだけです。 my.cnf を変更するには、max_allowed_packet の値を増やすだけです。
プログラム内でデータベース接続を取得するためにシングルトン方式を使用しているにもかかわらず、実際には同じ接続が使用されているなど、何らかの理由でタイムアウトが発生する可能性もあります。 、およびプログラム データベースに対する 2 つの操作間の間隔が wait_timeout (この設定は SHOW STATUS で確認できます) を超えると、問題が発生する可能性があります。これに対処する最も簡単な方法は、wait_timeout を増やすことです。もちろん、MySQL が単独で戦っていないことを認識できるように、プログラム内で時々 mysql_ping() を使用することもできます。
MySQL サーバーの解決策がなくなった
1. アプリケーション (PHP など) は、MYSQL ステートメントのバッチを長時間実行します。最も一般的なのは、古いデータと新しいデータの収集または変換です。
解決策:
my.cnf ファイルに次の 2 つの変数を追加または変更します:
wait_timeout=2880000
interactive_timeout = 2880000
2 つの変数の具体的な手順については、Google で検索するか、公式サイトのマニュアル。 my.cnf を変更できない場合は、データベースに接続するときに CLIENT_INTERACTIVE を設定できます。例:
sql = "set interaction_timeout=24*3600";
mysql_real_query(...)
2. SQL を実行しますが、SQL ステートメントが大きすぎるか、ステートメントに BLOB または Longblob フィールドが含まれています。たとえば、画像データ処理
解決策:
my.cnf ファイルに次の変数を追加または変更します:
max_allowed_packet = 10M (必要なサイズを設定することもできます)
の役割max_allowed_packet パラメータは、通信バッファの最大長を制御するために使用されます。
最近、Web サイトで WEB ページ コレクター機能を使用する必要がある場合、PHP スクリプトが URL を要求すると、要求された Web ページが非常に遅くなり、mysql の待機タイムアウト時間を超えてしまうことがあります。 Web ページのコンテンツがキャプチャされ、MySQL に挿入される準備ができましたが、MySQL 接続がタイムアウトして閉じられたことが判明したため、「MySQL サーバーが消えました」のようなエラー メッセージが表示されました。この問題を解決するには、私の経験があります。以下の 2 つの点は役に立つかもしれません:
最初の方法:
もちろん、このパラメータは my.cnf (Windows では my.ini) 設定、データベース負荷にあります。の方が若干大きいため、値を 10 に設定します (この値の単位は秒です。つまり、データベース接続が 10 秒以内に操作がない場合、データベース接続は強制的に閉じられます。これは永続的なものではありません)。リンク (mysql_pconnect) ですが、この待機タイムアウトの影響は MySQL プロセス リスト (show processlist) で確認できます)。待機タイムアウトを 300 秒など、より大きな値に設定することもできます。実際、MySQL のデフォルトを 8 時間に設定する必要はありません。状況はサーバーとサイトによって異なります。
2 番目の方法:
これも私の個人的な意見では最良の方法であり、MySQL のリンク状態を確認して再リンクすることです。
多くの資料では、mysql_ping のような関数があることをご存知かと思いますが、この mysql_ping API はデータベースが接続されていない場合は再接続を試みます。これは条件付きであり、MYSQL に自動接続を切断するオプションがあるようにする必要があります (MySQL のデフォルトでは自動接続しません)。 PHP の MySQL API には自動接続がないことがわかりました。この機能がなければ、MySQL を再編集できます(笑)。しかし、最終的に mysql_ping 関数を使用できるようになりますが、少し操作スキルが必要です:
これはデータベース操作クラスの途中にある関数です
次のようにコードをコピーします:
function ping(){ <br />if(!mysql_ping($this->link)){ <br />mysql_close($this->link); //注意:一定要先执行数据库关闭,这是关键 <br />$this->connect(); <br />} <br />}
我需要调用这个函数的代码可能是这样子的
复制代码代码如下:
$str = file_get_contents('http://www.scutephp.com'); <br />$db->ping();//经过前面的网页抓取后,或者会导致数据库连接关闭,检查并重新连接 <br />$db->query('select * from table');
ping()这个函数先检测数据连接是否正常,如果被关闭,整个把当前脚本的MYSQL实例关闭,再重新连接。
经 过这样处理后,可以非常有效的解决MySQL server has gone away这样的问题,而且不会对系统造成额外的开销。