文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  設定帳戶資源限制

8.2.21 設定帳戶資源限制

限制用戶端使用 MySQL 伺服器資源的一種方法是將全域 max_user_connections 系統變數設定為非零值。這會限制任何指定帳戶可以建立的同時連線數,但不會對用戶端連線後可以執行的操作設定任何限制。此外,設定 max_user_connections 也無法管理個別帳戶。這兩種控制類型都是 MySQL 管理員感興趣的。

為了處理這些問題,MySQL 允許對個別帳戶使用這些伺服器資源設定限制

  • 帳戶每小時可以發出的查詢數量

  • 帳戶每小時可以發出的更新數量

  • 帳戶每小時可以連線至伺服器的次數

  • 帳戶同時連線至伺服器的次數

用戶端可以發出的任何陳述式都會計入查詢限制。只有修改資料庫或資料表的陳述式才會計入更新限制。

在此上下文中,「帳戶」對應於 mysql.user 系統表格中的一列。也就是說,會根據 user 表格列中適用於連線的 UserHost 值來評估連線。例如,帳戶 'usera'@'%.example.com' 對應於 user 表格中的一列,該列的 UserHost 值分別為 usera%.example.com,允許 useraexample.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 限制為零。user2user3 的連線限制分別為 5 和 20,因為它們的 MAX_USER_CONNECTIONS 限制不為零。

伺服器會將帳戶的資源限制儲存在對應於該帳戶的 user 表格列中。max_questionsmax_updatesmax_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_CONNECTIONSER_USER_LIMIT_REACHED)。當伺服器完成中斷連線處理時,便會再次允許另一個連線。