MySQLサーバーが消えたエラーの解決策

MySQLサーバーが消えたエラーの解決策

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 -u ユーザー名 -p パスワード

MySQL を使用して大きなファイル SQL をインポートすると、MySQL サーバーが停止したというエラー メッセージが表示される場合があります。この問題は、max_allowed_pa​​cket のデフォルト値が小さすぎることにあります。この項目の値を増やして再度インポートするだけで、成功します。この項目の機能は、MySQL サーバーが受信するパッケージのサイズを制限することです。したがって、インポートされたファイルが大きすぎると、この項目で設定された値を超え、インポートが失敗する可能性があります。次に、この項目の値を表示および設定する方法を見てみましょう。

max_allowed_pa​​cketの値を確認する

「max_allowed_pa​​cket」のようなグローバル変数を表示します。
+--------------------+---------+
| 変数名 | 値 |
+--------------------+---------+
| 最大許容パケット | 4194304 |
+--------------------+---------+

このアイテムのデフォルトサイズは4Mしかないことがわかります。次に、値を150M(1024*1024*150)に設定します。

グローバルmax_allowed_pa​​cketを157286400に設定します。

サイズをもう一度確認してください

「max_allowed_pa​​cket」のようなグローバル変数を表示します。

この値を増やすことで、一般的には、大量のデータを再度 SQL にインポートすると成功するはずです。それでもエラーが発生する場合は、値を増やすだけです。コマンドラインでの設定は、現時点でのみ有効であることに注意してください。MySQL サービスを再起動すると、デフォルト値が復元されます。ただし、構成ファイルを変更して (構成ファイル my.cnf に max_allowed_pa​​cket=150M を追加できます)、永続的に有効にすることができます。ただし、大量のデータをインポートすることはあまりないので、個人的には、現在の構成はコマンドラインを通じて有効にすることができ、構成ファイルを変更する必要はないと思います。

以上が今回ご紹介した関連知識の全てです。123WORDPRESS.COM がまとめた内容が皆様のお役に立てれば幸いです。

以下もご興味があるかもしれません:
  • Mysql マスタースレーブ同期 Last_IO_Errno:1236 エラー解決
  • MySQLデーモンの起動に失敗したエラーの解決方法
  • MySQL「すべての派生テーブルには独自のエイリアスが必要です」エラーの解決方法
  • MySQL 起動エラーの解決方法

<<:  期間限定フラッシュセール機能を実現するJavaScriptタイマー

>>:  VirtualBox での CentOS 8.1 仮想マシンのインストールを最小限に抑える詳細なチュートリアル

推薦する

CentOS 7.2 に SuPHP をインストールするための詳細な手順

デフォルトでは、CentOS 7 上の PHP は apache または nobody として実行さ...

Vue3 コンポジション API の紹介

目次概要例なぜそれが必要なのでしょうか?設定参照、反応的計算して見るライフサイクルVue3.0 は ...

MySQL におけるユニーク制約と NULL の詳細な説明

序文説明を簡略化するために以前に設定した要件は、他のグループから MQ メッセージを受信し、データベ...

JSのアンカーリンクをクリックするとスムーズにスクロールし、自由にトップ位置に調整できます。

アンカーリンクをクリックするとスムーズにスクロールし、自由にトップ位置に調整できます。 1. アンカ...

MySQLの重複排除操作を極限まで最適化する方法

目次1. インデックスと変数の賢い使用1. インデックスなしの比較テスト2. created_tim...

Linux で完全な Samba サーバーを構築する方法 (CentOS バージョン)

序文smb は、クライアントとサーバー間の Web 接続および情報通信に使用できるプロトコルの名前で...

Tomcatにデプロイされたアプリケーションがフロントエンドページにアクセスできない問題について

最近、実践的なトレーニング プロジェクトを実行する際に ssm フレームワークを使用しました。プロジ...

設計仕様に準拠した設計は良い設計でしょうか?

これまでの数年間、私はいわゆる「設計仕様」についてかなりの数の執筆やコンサルティングを行ってきました...

MySQL でのログインを取り消す

コンセプト紹介: MySQL の redo ログにはトランザクションの動作が記録されることはご存じの...

Nodeイベントループの包括的な理解

目次ノードイベントループイベントループ図メインスレッドイベントループタイマーキューの仕組み投票キュー...

MySQL空間関数を使用してロケーションパンチインを実装するための完全な手順

序文プロジェクトの要件は、ユーザーの現在の位置が特定の地理的位置範囲内にあるかどうかを判断することで...

SASSで変数のデフォルト値を使用する方法

SASS で定義された変数では、後で設定された値によって古い値が上書きされます。 $色: 赤; $色...

js QRコードスキャンログインの原理についての簡単な説明

目次QRコードログインの真髄QRコードを理解するシステム認証メカニズムQRコードをスキャンしてログイ...

Linux 論理ボリューム管理 (LVM) の使用法の概要

ディスク領域の管理は、システム管理者にとって重要な日常的なタスクです。ディスク領域が使い果たされると...

JavaScript で文字列内の最長の単語を見つける 3 つの方法 (推奨)

この記事は、Free Code Camp の基本アルゴリズム スクリプト「文字列内の最長の単語を見つ...