FreeBSD 8.3でMyISAMテーブルを含むMySQL 5.6 DBを使用しています。コードの主要部分はPHPにありますが、C++チャットサーバーで自己記述型を起動すると問題が発生します。私はmysql.hをDB接続に使用し、libwebsocketsをHTTPとwebsocketsの両方の相互作用に使用しています。以前のバージョンはCで書かれており、ロックは発生しませんでした。チャットサーバーには、WebSocketレジームと更新レジームがあります。また、ユーザー認証や設定の読み込み/保存にデータベースを使用します。
このサーバーを実行すると、一定の時間が経過すると、データベースにさまざまなクエリの接続が殺到し、すべてのステータスが「テーブルメタデータロックの待機中」になります。チャットを終了すると、クエリの処理が始まります。
私は100%確信しています。ALTERTABLE、CREATE TABLE、または同様のクエリが常に実行されているわけではないので、それらは理由ではありません。
したがって、この状況でデータベースがハングする理由が何であるか、そしてどのように追跡して解決できるのか理解できません。私は助けやアイデアをいただければ幸いです!今後ともよろしくお願いいたします。
一般的なログの操作についてアドバイスしてくれたjynusに感謝し、問題は解決されました!
ほとんどの場合と同様に、エラーは非常に単純でした。ここに説明があります:
特定の状況で、次の機能を実行する関数が呼び出されました。
DB内のいくつかのテーブルをロックする
クエリを実行する
結果をチャットするメッセージを送信する
テーブルのロックを解除
チャットへのメッセージは、接続タイムアウトが10秒のソケットを介して送信されました。場合によっては、ステップ1の後、ステップ3で、チャットが新しいユーザーのログオンでビジーで、ロックされているテーブルにアクセスしようとしていました。したがって、ループが閉じられました-チャットはロック解除を待っていて、関数は接続要求の処理を待っていました。
他の要求がmax_connections制限に達してデータベースをロックするには、10秒で十分でした。
私を困惑させる唯一のものは、すべてのクエリの状態が「テーブルメタデータロックの待機中」であった理由です。
手順3と4の場所を入れ替えた後、問題はもうありませんでした。
手伝ってくれてありがとう!