2009-07-29 182 views
19

我對由GoDaddy(linux)託管的站點使用MySQL 5.0。MySQL錯誤「連接太多」

我在我的網絡應用程序上做了一些測試,突然間我發現網頁真的很慢。最後,經過漫長的等待,我進入了一個頁面,上面寫着「MySQL錯誤,連接太多......」的字樣,它指向我的config.php文件,它連接到數據庫。

它剛剛連接到數據庫,沒有其他用戶。在我的每個頁面上,我都在頂部包含config.php文件,並關閉頁面末尾的mysql連接。它們之間可能有幾個查詢。我擔心我沒有足夠關閉mysql連接(mysql_close())。

但是,當我嘗試在運行查詢後關閉它們時,我在頁面上收到連接錯誤。我的網頁是PHP和HTML。當我嘗試關閉查詢時,看起來下一個不會連接。爲了連接,我需要在關閉後再次包含config.php嗎?

這個錯誤讓我害怕,因爲在2周內,約有84人開始使用這個網絡應用程序。

謝謝。

編輯:

這裏是我的網頁的一些僞代碼:

require_once('../scripts/config.php'); 

<?php 
    mysql_query.. 

    if(this button is pressed){ 
     mysql_query... 
    } 
    if(this button is pressed){ 
     mysql_query... 
    } 
    if(this button is pressed){ 
     mysql_query... 
    } 
?> 
some html.. 
.. 
.. 
.. 
.. 
<?php 
    another mysql_query... 
?> 
some more html.. 
.. 
.. 
<?php mysql_close(); ?> 

我計算過,這樣,每個頁面打開時間,打開連接,然後將連接關閉時頁面已完成加載。然後,連接再次打開時,有人點擊頁面上的按鈕,等等...

編輯:

好了,所以我剛打完電話與GoDaddy。顯然,用我的經濟套餐,我一次只限制50個連接。雖然今天我的問題發生在只有我訪問該網站的時候,但他們表示他們之前有一些服務器問題。然而,看到我將如何爲我的網絡應用程序提供84個用戶,我應該升級到「豪華」,一次允許100個連接。在某一天,每次可能有大約30個用戶訪問我的網站,所以我認爲100是更安全的選擇。你們同意嗎?

+0

粘貼一些代碼,請。 – Dirk 2009-07-29 19:02:03

+4

看起來似乎很瘋狂,但試着在你的連接方法上加上某種計數器,看它是否真的只在每頁加載時被調用一次。我有一個類似的問題,我實際上在沒有意識到的情況下爲每個查詢創建一個新的連接。可能值得一試。 – 2009-07-29 19:06:29

+0

@Mike B偉大的建議,我一定會嘗試這個。 – littleK 2009-07-29 19:14:44

回答

28

共享託管服務提供商通常允許爲同一用戶提供相當少量的同時連接。

你的代碼所做的是:

  • 打開MySQL服務器
  • 的連接做它的東西(生成頁面)
  • 收於頁面端的連接。

最後一步,當在頁面的末尾完成不是強制性:(引用mysql_close的手冊):

使用mysql_close()通常不是 必要的,因爲非持久性打開 鏈接將在腳本執行的末尾 處自動關閉。

但要注意,你可能不應該反正使用永久連接...

兩個小技巧:

  • 使用mysql_connect INSEAD的mysql_pconnect(已經確定你)
  • 套裝mysql_connect的第四個參數爲false (已經可以,因爲它是默認值) :(引用手冊):

如果再次調用 mysql_connect()函數具有相同 論點提出,沒有新的鏈接將被 建立,而是已經打開的鏈接 的鏈接 標識將被退回。

的new_link 參數改變此行爲 並使mysql_connect()總是打開新 鏈接,即使mysql_connect()函數是 具有相同 參數之前調用。



什麼會導致這個問題呢?

也許你試圖訪問多個頁面並行(例如在你的瀏覽器中使用多個標籤),這將模擬多個用戶在同一時間使用網站?

如果您有許多用戶同時使用該站點,並且mysql_connect與關閉連接之間的代碼需要大量時間,這將意味着同時打開多個連接......並且您將達到極限:-(

儘管如此,由於您是該應用程序的唯一用戶,考慮到您允許多達200個同時連接,所以出現了一些奇怪的事情......



嗯,想着 「太多的連接」 和 「max_connections」 ......

如果我沒有記錯,max_connections不限制連接數可以打開到MySQL服務器,但連接總數可以打開到該服務器,由任何人連接到它

引用MySQL的上Too many connections文檔:

如果你得到一個連接太多 錯誤,當您嘗試連接到 mysqld服務器,這意味着所有 可用的連接都在使用由其他 客戶。

允許的連接數是 ,由max_connections 系統變量控制。其默認值爲 100.如果您需要支持更多連接,則應爲此變量設置較大的 值。

所以,實際上,這個問題可能不是來自於你和你的代碼(這看起來不錯,實際上):它可能「僅僅」是,你是不是唯一一個試圖連接到MySQL服務器(記住,「共享主機」),而且有太多的人在使用它的同時...

...而如果我是對的,那就是,還有什麼可以要解決這個問題:只要該服務器上的數據庫/用戶過多,並且max_connection設置爲200,則您將繼續遭受...


一點題外話:在去之前GoDaddy的問他們有關,這將是很好,如果有人可以驗證我剛纔說的^^

2

確保您沒有使用持續連接。這通常是一個壞主意..

如果你有這個..在最多你需要支持儘可能多的連接,你有apache進程。你能改變max_connections設置嗎?

+0

我沒有使用持續連接。根據GoDaddy的說法,我無法修改max_connections設置: 「我們允許每個MySQL用戶多達200個併發連接。「 – littleK 2009-07-29 19:07:38

2

你完全確定數據庫服務器是完全獻給你的嗎?

以根用戶身份登錄到數據庫,然後使用「SHOW PROCESSLIST」查看誰已連接。理想情況下,將其掛接到您的監控系統中,以查看隨着時間的推移有多少個連接,並在有太多連接時發出警報。

可以在my.cnf中配置最大數據庫連接,但請注意內存或地址空間不足。

2

如果你有shell訪問,用netstat看看有多少套接字將打開到您的數據庫以及它們來自哪裏。

在Linux上,鍵入:

netstat -n -a |grep 3306 

在Windows上,鍵入:

netstat -n -a |findstr 3306 
3

我有大約18個月處理這個(http://ianchanning.wordpress.com/2010/08/25/18-months-of-dealing-with-a-mysql-too-many-connections-error/

我的解決方案(即將適用於你)最後是:

  1. 根據MySQLTuner調整數據庫。
  2. 整理每週在此基礎上post

碎片整理bash腳本從交表:

#!/bin/bash 

# Get a list of all fragmented tables 
FRAGMENTED_TABLES="$(mysql -e `use information_schema; SELECT TABLE_SCHEMA,TABLE_NAME 
FROM TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql') AND 
Data_free > 0` | grep -v '^+' | sed 's,t,.,')" 

for fragment in $FRAGMENTED_TABLES; do 
    database="$(echo $fragment | cut -d. -f1)" 
    table="$(echo $fragment | cut -d. -f2)" 
    [ $fragment != "TABLE_SCHEMA.TABLE_NAME" ] && mysql -e "USE $database; 
    OPTIMIZE TABLE $table;" > /dev/null 2>&1 
done 
1

的解決方案可能其中之一,我在MCQA測試碰到這個,連我自己不明白哪一個是對的!

在my.cnf 「設定變量= MAX_CONNECTIONS = 200」

執行命令,以便設置該 「SET GLOBALmax_connections = 200」

使用總是的mysql_connect()函數來連接MySQL服務器

使用,以便始終mysql_pconnect()函數來連接到MySQL服務器

0

以下是可能的解決方案:

1)通過在mysql中設置全局變量來增加最大連接設置。

set global max_connection=200; 

注:這會增加服務器負載。

2)如下空連接池:

​​

3)檢查PROCESSLIST並殺死特定的processlist如果你不希望任何人。


你可以參考這樣的: -

article link