最近大概每隔一兩週blog就會出現 sql user max_questions 超過上限的錯誤爛掉,blog 架了這麼久最近才開始發生,一時沒想到去 google,就直接 DB 備份一下砍掉再 backup 回去,也就神奇的恢復了。(當時覺得神奇,事實上是應該的) 搞了兩三次以後,在公司又因為連線 port 限制的關係不能連上去 web hosting 修,都要忍耐一天服務中斷回家才能解決,終於乖乖想去找原因。(這麼冷的網站服務中斷一天還好吧orz)沒想到跟字面上差不多,照理說是要大熱門網站才會碰到這種錯誤啊,簡單說 max_questions 就是每小時內每個db user可以 select 的次數上限,由 mysql 管理者所設定。通常只會對 select 做這樣的限制,不過也有聽到討論說他的 web hosting 也限制 insert/update 的。據說現在不少package,例如 phpbb 都喜歡亂操query,使用者稍微多一點就會很容易超過這個上限。我可以想像,自從我看過一個網頁需要列出50筆資料時居然用迴圈 query 50 次的時候,大概就知道這些情形怎麼來的(囧)。而我這麼冷的網站哪來這麼多天殺的 query,大概是 spam block plugin 跟 bots 同心協力的合作結果吧…部落格觀察搞不好也參了一腳 ( ´_ゝ`)
那麼,除了像我之前的暴力解決法 (不良示範),當然也可以聯絡 web hosting 幫你 reset。(看到某論壇竟然有人請 web hosting 幫他每天固定 reset 一次。) 如果你有權限可以修改程式碼的話,以下會是真的能減少辛勞的作法。首先新增兩個都能存取目標 db 的 db user,密碼要設定成跟原來的 db user 一樣。在你使用的軟體的 db 設定的地方,通常是某個 config 檔, 讓程式隨機選一個 user 去連線,大致上就可以把 query 量平均分攤到這三個 user 去。php的寫法範例如下:
$db_user_array[] = "user_name1";
$db_user_array[] = "user_name2";
$db_user_array[] = "user_name3";
$db_user =
$db_user_array[rand(0, (sizeof($db_user_array) -1))];
//define("db_user", "blahblah");
define("db_user", $db_user);
