2017-08-25 14 views
0

私は10,000レコードのテーブルを持っていますprecommit_tags_change_lists、これに対する選択クエリは永遠にかかります'10 .52.244.189 '((1040、'多くの接続 ')))) ")

私は続いて...またハングそれを下回るとインデックスを追加する

ALTER TABLE `precommit_tags_change_lists` ADD INDEX `change_list_id` (`change_list_id`) 

を試してみましたが、テーブルの構造、これをデバッグする方法上の任意の指導とは何か、この問題を引き起こしているだろうか?

enter image description here

一つの観察は、かなりの数のプロセスが状態があるため、データベース接続上記のエラーで断続的に失敗し続けているのテーブルprecommit_tags_changelists

enter image description here

の「テーブルのメタデータロックの待機」で立ち往生しているされてCan't connect to MySQL server on '10.xx.xxx.xxx' ((1040, u'Too many connections'))")

+0

これらのクエリのいくつかはどのように見えますか?あなたが追加したインデックスを正確に選択しているかどうかによって、役に立つかもしれません。 – VoteyDisciple

答えて

0

このエラーは、接続が設定ファイルで定義されている最大限度に達すると発生します。この値を保持する変数はmax_connectionsです この変数の現在の値を確認するには、rootユーザーとしてログインし、次のコマンドを実行します。 max_connectionsのようなグローバル変数を表示します。

rootユーザーを使用してMySQLにログインし、max_connections変数を高い値に増やします。 SET GLOBAL max_connections = 100;

max_connection値を永続化するには、設定ファイルの値を変更します。

永久

Stop the MySQL server: 
Service mysql stop 
Edit the configuration file my.cnf. 
vi /etc/my.cnf 
Find the variable max_connections under mysqld section. 
[mysql] 
max_connections = 100 
Set into higher value and save the file. 
Start the server. 
Service mysqld start 
+0

@ nitin.sharma0810 - 現在の接続数を確認するコマンドがありますか? – user3508811

+0

SELECT @@ threads_connectedが役立ちます。 SELECT @@ max_used_connectionsは起動後にハイウォーターマークを表示します。 ほとんどのクエリはすばやく完了しているため、Web接続は最初のSELECTではほとんどアクティブではありません。 –

1

10Kレコードのテーブルが非常に大きくない変更を永続化します。 ALTER TABLEは、数秒以内に完了する必要があります。あなたのALTER TABLEがテーブルのロックを待っている可能性が高いと思います。これらの他のSELECTクエリもすべて、ALTER TABLEの後ろにキューイングされているため、待機しています。

ALTER TABLEには、テーブルへの排他アクセスが必要です。 ALTER TABLEが動作している間は、他のクエリは実行できません(MySQL 5.6以降では特定のタイプの変更を "オンライン"できますが、一般的にはnoです)。この排他的アクセスは、メタデータロックを使用して実装されています。多くのSELECTクエリはメタデータロックを共有できますが、ALTER TABLEは共有できません。

だから私はあなたの本当の問題は、あなたがALTER TABLEを妨害している長時間実行中のクエリを持っていることだと思います。この長期実行クエリは表示されていません。

小さなテーブルでも長期実行クエリを作成することは可能です。これは、クエリのロジックと関係しています。プロセスリストでprecommit_tags_change_listsを参照しているクエリを調べる必要がありますが、ではなく、メタデータロックを待機しています。それは他の状態(「データ送信」や「一時表への書き込み」など)になり、他のクエリより長く実行されています。

このクエリを見つけたら、kill it。何時間も稼働されていれば、結果を待っている人はいないでしょう。その問合せを終了すると、ログ・ジャムが破棄され、ALTER TABLEおよび他のすべての問合せが完了します。

これは私の経験に基づいた推測です。しかし、すべての関連情報を提供していないため、あなたの状況に関するいくつかの仮定をしなければなりません。

関連する問題