限制用戶端使用 MySQL 伺服器資源的一種方法是將全域 max_user_connections
系統變數設定為非零值。這會限制任何指定帳戶可以建立的同時連線數,但不會對用戶端連線後可以執行的操作設定任何限制。此外,設定 max_user_connections
也無法管理個別帳戶。這兩種控制類型都是 MySQL 管理員感興趣的。
為了處理這些問題,MySQL 允許對個別帳戶使用這些伺服器資源設定限制
帳戶每小時可以發出的查詢數量
帳戶每小時可以發出的更新數量
帳戶每小時可以連線至伺服器的次數
帳戶同時連線至伺服器的次數
用戶端可以發出的任何陳述式都會計入查詢限制。只有修改資料庫或資料表的陳述式才會計入更新限制。
在此上下文中,「“帳戶”」對應於 mysql.user
系統表格中的一列。也就是說,會根據 user
表格列中適用於連線的 User
和 Host
值來評估連線。例如,帳戶 'usera'@'%.example.com'
對應於 user
表格中的一列,該列的 User
和 Host
值分別為 usera
和 %.example.com
,允許 usera
從 example.com
網域中的任何主機連線。在這種情況下,伺服器會將此列中的資源限制集體應用於來自 example.com
網域中任何主機的所有 usera
連線,因為所有這類連線都使用相同的帳戶。
若要在建立帳戶時為帳戶設定資源限制,請使用 CREATE USER
陳述式。若要修改現有帳戶的限制,請使用 ALTER USER
。提供一個 WITH
子句,其中命名要限制的每個資源。每個限制的預設值為零(無限制)。例如,若要建立一個可以存取 customer
資料庫的新帳戶,但只能以有限的方式存取,請發出下列陳述式
mysql> CREATE USER '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
子句中命名,但已命名的類型可以以任何順序出現。每個每小時限制的值應該是一個表示每小時計數的整數。對於 MAX_USER_CONNECTIONS
,限制是一個表示帳戶同時連線數上限的整數。如果此限制設定為零,則全域 max_user_connections
系統變數值會決定同時連線的數量。如果 max_user_connections
也為零,則該帳戶沒有限制。
若要修改現有帳戶的限制,請使用 ALTER USER
陳述式。以下陳述式將 francis
的查詢限制變更為 100
mysql> ALTER USER 'francis'@'localhost' WITH MAX_QUERIES_PER_HOUR 100;
該陳述式僅修改指定的限制值,且帳戶的其他部分保持不變。
若要移除限制,請將其值設定為零。例如,若要移除對 francis
每小時可以連線次數的限制,請使用此陳述式
mysql> ALTER USER 'francis'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0;
如先前所述,帳戶的同時連線限制由 MAX_USER_CONNECTIONS
限制和 max_user_connections
系統變數決定。假設全域 max_user_connections
值為 10,且三個帳戶的個別資源限制指定如下
ALTER USER 'user1'@'localhost' WITH MAX_USER_CONNECTIONS 0;
ALTER USER 'user2'@'localhost' WITH MAX_USER_CONNECTIONS 5;
ALTER USER 'user3'@'localhost' WITH MAX_USER_CONNECTIONS 20;
user1
的連線限制為 10(全域 max_user_connections
值),因為其 MAX_USER_CONNECTIONS
限制為零。user2
和 user3
的連線限制分別為 5 和 20,因為它們的 MAX_USER_CONNECTIONS
限制不為零。
伺服器會將帳戶的資源限制儲存在對應於該帳戶的 user
表格列中。max_questions
、max_updates
和 max_connections
欄位會儲存每小時的限制,而 max_user_connections
欄位會儲存 MAX_USER_CONNECTIONS
限制。(請參閱 第 8.2.3 節,「授與表格」。)
當任何帳戶的任何資源使用都設定了非零限制時,便會進行資源使用計數。
當伺服器執行時,它會計算每個帳戶使用資源的次數。如果帳戶在上一小時內達到連線數量的限制,伺服器會拒絕該帳戶的進一步連線,直到該小時結束。同樣地,如果帳戶達到查詢或更新次數的限制,伺服器會拒絕進一步的查詢或更新,直到該小時結束。在所有這些情況下,伺服器都會發出適當的錯誤訊息。
資源計數是按帳戶進行,而不是按用戶端進行。例如,如果您的帳戶的查詢限制為 50,您無法透過同時建立兩個用戶端連線到伺服器來將限制增加到 100。在兩個連線上發出的查詢會一起計算。
可以為所有帳戶全域重設,或為指定帳戶個別重設目前的每小時資源使用計數。
若要將所有帳戶的目前計數重設為零,請發出
FLUSH USER_RESOURCES
陳述式。也可以透過重新載入授與表格來重設計數(例如,使用FLUSH PRIVILEGES
陳述式或 mysqladmin reload 命令)。可以將個別帳戶的計數重設為零,方法是再次設定其任何限制。指定一個等於目前指派給該帳戶的值的限制值。
每小時計數器重設不會影響 MAX_USER_CONNECTIONS
限制。
當伺服器啟動時,所有計數都從零開始。計數不會在伺服器重新啟動時保留。
對於 MAX_USER_CONNECTIONS
限制,如果帳戶目前已開啟允許其開啟的最大連線數,可能會發生邊緣情況:如果伺服器在連線發生時尚未完全處理中斷連線,則快速進行中斷連線然後連線可能會導致錯誤(ER_TOO_MANY_USER_CONNECTIONS
或 ER_USER_LIMIT_REACHED
)。當伺服器完成中斷連線處理時,便會再次允許另一個連線。