PHP で MySQL サーバーが消えた問題 1. 背景以前、Codeigniter でコンソール コマンドラインに似たスクリプトを書いたことがあります。スクリプト内の sleep ステートメントが長時間続いたため、スリープ前の SQL 操作はすべて成功したのに、スリープ後に SQL 操作が実行され、エラー メッセージが報告されるという現象が発生しました。MySQL サーバーが消えました。つまり、MySQL 接続が無効です。後で、MySQL には 2 つの重要な構成パラメータがあることを知りました。
これら 2 つのパラメータの単位は秒 (s) です。デフォルト値は 8 時間 (28800) です。interactive_timeout という単語は、インタラクティブ タイムアウトを指します。mysql の接続方法には一般に 2 種類あり、1 つは「インタラクティブ」、もう 1 つは「非インタラクティブ」と呼ばれます。mysql -u root xxx またはマスター スレーブ レプリケーションを使用する一般的な接続は「インタラクティブ接続」であり、Java の JDBC または PHP の PDO ドライバーを使用する接続方法は一般に「非インタラクティブ接続」です。ただし、interactive_timeout が変更されていない場合、この値は変更されませんが、wait_timeout は異なる接続方法で異なる値を持ちます。 wait_timeout 値は、「対話型接続」における interactive_timeout 値です。「非対話型接続」の場合、wait_timeout 値は mysql.cnf で設定された元の値です。 最終的には、wait_timeout 値のみが機能します。この設定項目は、スリープ状態の接続を制限します (show processlist で現在の接続数を表示します)。この接続のスリープ時間が wait_timeout 値を超えると、接続は切断またはクリアされます。 2. Wait_timeout分析1. まずmysql.confの設定を確認する まず、interactive_timeout=10 wait_timeout=5 を設定します。これで、MySQL クライアント (対話型接続) を介してこれら 2 つの設定項目の値を確認できます。show variables like '%timeout%'; 2. インタラクティブ接続 クライアント上の結果: wait_timeout は、msyql.conf で設定された 10 秒ではなく、5 秒です。 次に、PHP が MySQL (非対話型接続) に接続し、同じステートメントを実行した場合にどのような構造になるかを見てみましょう。 3. 非対話型接続 この時点で、wait_timeout は、mysql.cnf で最初に設定した値になります。 要約すると、wait_timeout 値は「接続モード」によって異なります。 3. 失踪理由の分析上記の状況を組み合わせると、わかります。 最初は、いくつかの SQL ステートメントは正常に実行されますが、後続の SQL ステートメントは実行に失敗し、「gone away」というエラーが報告されます。ほとんどの場合、接続が wait_timeout を超えてアイドル状態になり、MySQL サーバーが一方的に接続を切断することが原因です。ただし、クライアント コードは、接続がまだ正常であると考えてこの接続変数を引き続き使用しているため (実際には MySQL サーバーは切断されていますが、接続がまだ有効であると想定しているだけです)、SQL を実行すると必然的にエラーが報告されます。 では、この状況をどう解決すればよいのでしょうか? 1. wait_timeout 値を適切に調整して増やすことで、簡単には消えてしまう状況が引き起こされないようにすることができます。ただし、スリープ中の長い接続がクリーンアップされず、リソースが無駄になるという欠点があります。 2. try-cach によって MSYQL 接続の問題が解決しない場合は、まず以前のデータベースで close() を呼び出します。次に、データベース接続を再度取得してオープンし、以前のコードを実行します。ただし、コードは非常に面倒です。疑似コード: db を java.util.Db にロードします。 試す { fun1$db); // 最初は実行が成功しています sleep(3600*10) // スリープ時間が10時間であると仮定します fun2($db); // 10時間後、MySQLによって接続が終了し、エラーが解消されます }catch(例外 $e) { // エラーが報告された後、無効な接続を閉じて新しい接続を開きます $db->close(); $db->open(); // 新しい接続を取得して実行 // fun2($db) } 3. swoole や easyswoole などのフレームワークを使用している場合は、mysql pool 接続プールを使用することをお勧めします。また、通常、接続プールにはハートビート チェック ping、接続生存検出間隔、アイドル接続の最大数などの設定があるため、一度設定するだけで済みます。 たとえば、アクティブな接続間隔を短く設定して、接続が msyql サーバーによって切断されないようにすることができます。たとえば、easyswoole 構成は次のようになります。 たとえば、以前は wait_timeout=10 に設定していましたが、easyswoole の mysql 接続プール アクティビティ テストの間隔を短い時間に変更しなかった場合は、同じ問題が発生します。インターフェイスへの最初のアクセスでは SQL 実行結果が正常に返されましたが、10 秒以上経過してからインターフェイスに再度アクセスすると、「mysql が消えました」というエラー メッセージが報告されました。 setIntervalCheckTime() を変更すると、この問題は発生しなくなります。接続数を確認するには、mysql の show processlist を使用します。 これらは、EasySwoole が維持するのに役立つ接続の数です。スリープが 3 秒を超えると、存続するためのチェック時間は 3 秒であるため、接続プールが存続を助け、スリープ時間は再び 0 から始まります。 以下は他のネットユーザーからのコメントですMySQLの登場
MySQL を使用して大きなファイル SQL をインポートすると、MySQL サーバーが停止したというエラー メッセージが表示される場合があります。この問題は、max_allowed_packet のデフォルト値が小さすぎることにあります。この項目の値を増やして再度インポートするだけで、成功します。この項目の機能は、MySQL サーバーが受信するパッケージのサイズを制限することです。したがって、インポートされたファイルが大きすぎると、この項目で設定された値を超え、インポートが失敗する可能性があります。次に、この項目の値を表示および設定する方法を見てみましょう。 max_allowed_packetの値を確認する
このアイテムのデフォルトサイズは4Mしかないことがわかります。次に、値を150M(1024*1024*150)に設定します。
サイズをもう一度確認してください
この値を増やすことで、一般的には、大量のデータを再度 SQL にインポートすると成功するはずです。それでもエラーが発生する場合は、値を増やすだけです。コマンドラインでの設定は、現時点でのみ有効であることに注意してください。MySQL サービスを再起動すると、デフォルト値が復元されます。ただし、構成ファイルを変更して (構成ファイル my.cnf に max_allowed_packet=150M を追加できます)、永続的に有効にすることができます。ただし、大量のデータをインポートすることはあまりないので、個人的には、現在の構成はコマンドラインを通じて有効にすることができ、構成ファイルを変更する必要はないと思います。 以上が今回ご紹介した関連知識の全てです。123WORDPRESS.COM がまとめた内容が皆様のお役に立てれば幸いです。 以下もご興味があるかもしれません:
|
<<: 期間限定フラッシュセール機能を実現するJavaScriptタイマー
>>: VirtualBox での CentOS 8.1 仮想マシンのインストールを最小限に抑える詳細なチュートリアル
ケース1: 最後の提出とプッシュなし次のコマンドを実行します。 git コミット --amend g...
目次概要遅延読み込みとは何ですか?最適化を開始するビジネスモジュールを分割する遅延読み込みルート構成...
目次1. 理論シリアル化可能繰り返し読み取りコミットされた読み取りコミットされていない読み取り2. ...
目次1. コンポーネントでの使用2. オプションのマージ要約する1. コンポーネントでの使用Mixi...
プリミティブ値 -> プリミティブ型Number String Boolean undefin...
達成される効果は次のとおりです。 マウスがボタン内に移動すると、ネオンライトのような効果が生成され、...
Docker 学習https://www.cnblogs.com/poloyy/p/15257059...
Go は、シンプルで信頼性が高く、効率的なソフトウェアを簡単に構築できるオープンソース プログラミン...
目次JDKをダウンロードしてインストールするTomcat 圧縮パッケージをダウンロードTomcatの...
MySQLの重複排除方法【初級】繰り返しのセリフが少ないdistinctive を使用してそれらを見...
同僚から、一時テーブルを使用して変数データを挿入して表示する方法を教わったことがありますが、この方法...
1. MySQLをダウンロードする1.1 ダウンロードアドレスhttps://downloads.m...
1. まず、コンピュータのデスクトップにある VMware アイコンをダブルクリックしてソフトウェア...
1. 要件の説明特定の要素については、背景background-imageを半透明にしたいが、テキス...
バイナリ docker 19.03 バージョンがインストール後に docker0 ブリッジを自動的に...