限制MySQL服務器資源使用的一個方法是將max_user_connections系統變量設置為非零值。但是,該方法嚴格限于全局,不允許管理具體賬戶。并且,它只限制使用單一賬戶同時連接的數量,而不是客戶端連接后的操作。許多MySQL管理員對兩種類型的控制均感興趣,特別是Internet服務提供者。
在MySQL 5.1中,你可以為具體賬戶限制下面的服務器資源:
· 賬戶每小時可以發出的查詢數
· 賬戶每小時可以發出的更新數
· 賬戶每小時可以連接服務器的次數
客戶端可以執行的語句根據查詢限制來記數。只有修改數據庫或表的語句根據更新限制來記數。
還可以限制每個賬戶的同時連接服務器的連接數。
本文中的賬戶為user表中的單個記錄。根據User和Host列值唯一識別每個賬戶。
做為使用該特性的先決條件,mysql數據庫的user表必須包含資源相關的列。資源限制保存在max_questions、max_updates、max_connections和max_user_connections列內。如果user表沒有這些列,必須對它進行升級;參見2.10.2節,“升級授權表”。
要想用GRANT語句設置資源限制,使WITH子句來命名每個要限制的資源和根據每小時記數的限制值。例如,要想只以限制方式創建可以訪問customer數據庫的新賬戶,執行該語句:
mysql> GRANT ALL ON customer.* TO 'francis'@'localhost'
-> IDENTIFIED BY 'frank'
-> WITH MAX_QUERIES_PER_HOUR 20
-> MAX_UPDATES_PER_HOUR 10
-> MAX_CONNECTIONS_PER_HOUR 5
-> MAX_USER_CONNECTIONS 2;
限制類型不需要全部在WITH子句中命名,但已經命名的可以按任何順序。每個每小時限制值均應為整數,代表每小時的記數。如果GRANT語句沒有WITH子句,則每個限制值設置為 默認值零(即沒有限制)。對于MAX_USER_CONNECTIONS,限制為整數,表示賬戶一次可以同時連接的最大連接數。如果限制設置為 默認值零,則根據MAX_USER_CONNECTIONS系統變量確定該賬戶可以同時連接的數量。
要想設置或更改已有賬戶的限制,在全局級別使用GRANT USAGE語句(在*.*)。下面的語句可以將francis的查詢限制更改為100:
mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'
-> WITH MAX_QUERIES_PER_HOUR 100;
該語句沒有改變賬戶的已有權限,只修改了指定的限制值。
要想取消已有限制,將該值設置為零。例如,要想取消francis每小時可以連接的次數的限制,使用該語句:
mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'
-> WITH MAX_CONNECTIONS_PER_HOUR 0;
當賬戶使用資源時如果有非零限制,則對資源使用進行記數。
服務器運行時,它統計每個賬戶使用資源的次數。如果賬戶在最后一個小時的連接次數達到限制,該賬戶的進一步的連接被拒絕。類似地,如果賬戶達到查詢或更新次數的限制,進一步的查詢或更新被拒絕。在這種情況下,會給出相關錯誤消息。
根據每個賬戶進行資源計算,而不是根據每個客戶端。例如,如果你的賬戶的查詢限制為50,你不能通過兩個客戶端同時連接服務器將限制增加到100。兩個連接的查詢被計算到一起。
可以為所有賬戶從全局重設當前的每小時資源使用記數,或單獨重設給定的賬戶:
· 要想將所有賬戶當前的記數重設為零,可以執行FLUSH USER_RESOURCES語句。還可以通過重載授權表來重設記數(例如,使用FLUSH PRIVILEGES語句或mysqladmin reload命令)。
· 將具體賬戶的限制重新授予任何值,可以將它設置為零。要想實現,按照前面所述使用GRANT USAGE,并將限制值指定為該賬戶當前的限制值。
計數器重設不影響MAX_USER_CONNECTIONS限制。
當服務器啟動時所有記數從零開始。