8.2.21 设置帐户资源限制
限制客户端使用 MySQL 服务器资源的一种方法是将全局max_user_connections
系统变量设置为非零值。这将限制任何给定帐户可以建立的同时连接数,但对客户端连接后执行的操作没有限制。此外,设置max_user_connections
不启用对个体帐户的管理。两种类型的控制都对 MySQL 管理员有趣。
为了解决这些关切,MySQL 允许对个体帐户设置服务器资源的限制:
-
一个帐户可以在一小时内发出多少个查询
-
一个帐户可以在一小时内发出多少个更新
-
一个帐户可以在一小时内多少次连接到服务器
-
一个帐户可以同时连接到服务器的次数
任何客户端可以发出的事务都将计入查询限制。只有修改数据库或表的事务才会计入更新限制。
在这里,““帐户””对应于 mysql.user
系统表的一行。这意味着连接将根据 User
和 Host
值在 user
表行中评估。例如,帐户 'usera'@'%.example.com'
对应于 user
表的一行,该行具有 User
和 Host
值为 usera
和 %.example.com
,以允许 usera
从 example.com
域中的任何主机连接。在这种情况下,服务器将对来自 example.com
域中的所有连接应用资源限制,因为所有这些连接都使用相同的帐户。
要在帐户创建时为帐户设置资源限制,请使用CREATE USER
语句。要修改现有帐户的限制,请使用ALTER USER
语句。提供一个 WITH
take that names each resource to be limited。每个限制的默认值都是零(无限制)。例如,要创建一个新的帐户,该帐户可以访问 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
由于其MAX_USER_CONNECTIONS
限制为零,因此连接限制为10(全球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节,“Grant Tables”。)
资源使用计数在每个账户使用资源时进行。
服务器在运行时,对每个账户的资源使用进行计数。如果账户在最后一个小时内达到连接限制,服务器将拒绝该账户的进一步连接。类似地,如果账户达到查询或更新限制,服务器将拒绝进一步的查询或更新。在所有这些情况下,服务器将发出适当的错误消息。
资源计数是按账户进行的,而不是按客户端。例如,如果您的账户的查询限制为50,您不能通过在服务器上同时打开两个客户端连接来增加限制到100。服务器上的查询在两个连接上进行计数。
当前每小时资源使用计数可以对所有帐户进行全局重置,也可以对特定帐户进行单独重置:
-
要将当前计数重置为零对所有帐户,执行一个
FLUSH USER_RESOURCES
语句。计数也可以通过重新加载授权表(例如,使用FLUSH PRIVILEGES
语句或mysqladmin reload命令)。 -
对个别帐户的计数可以通过将其任何限制重新设置为零来重置。指定一个与当前帐户分配的值相同的限制值。
每小时计数重置不影响MAX_USER_CONNECTIONS
限制。
所有计数在服务器启动时都从零开始。计数不在服务器重启时保留。
对于MAX_USER_CONNECTIONS
限制,如果帐户当前已经打开了允许的最大连接数:断开连接后快速连接可能会导致错误(ER_TOO_MANY_USER_CONNECTIONS
或ER_USER_LIMIT_REACHED
),如果服务器还没有完全处理断开连接时连接发生时。服务器完成断开处理后,另一个连接将再次被允许。