2017-08-25 71 views
0

無法連接到MySQL服務器我有一張有10,000條記錄的表格precommit_tags_change_lists,對此的選擇查詢需要永久性處理'10.52.244.189'((1040,u'Too many connections'))「)

我嘗試添加一個索引,如下這也掛...

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將顯示高水位標記。 由於大多數查詢都快速完成,因此第一個SELECT可能很少激活Web連接。 –

1

的10K記錄表是不是非常大。一個ALTER TABLE最多可以在幾秒內完成。我認爲你的ALTER TABLE可能正在等待表上的鎖。所有其他的SELECT查詢也在等待,因爲它們排在ALTER TABLE之後。

ALTER TABLE需要獨佔訪問表。在ALTER TABLE完成它的工作時,沒有其他查詢可以運行(當然,某些類型的更改可以在MySQL 5.6或更高版本中「在線」完成,但一般不會)。這種獨佔訪問是通過使用元數據鎖來實現的。許多SELECT查詢可以共享一個元數據鎖,但ALTER TABLE無法共享。

所以我認爲你真正的問題是你有一些長期運行的查詢阻礙了ALTER TABLE。您尚未顯示此長時間運行的查詢。

即使在一張小桌子上也可以進行長時間運行的查詢。它與查詢的邏輯有關。您應該在您的流程列表中查找引用precommit_tags_change_lists的查詢,但是而不是正在等待元數據鎖定。它將處於其他某種狀態(如「發送數據」或「寫入臨時表」等),並且運行時間比其他查詢長。

當您發現該查詢時,kill it。如果它已經運行了好幾個小時,那麼任何人都不會等待它的結果。一旦你殺死了那個查詢,logjam就會被破壞,並且ALTER TABLE和所有其他查詢將能夠完成。

這是我的猜測,根據經驗。但是我不得不對你的情況做一些假設,因爲你沒有提供所有的相關信息。