Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Setting Account Resource Limits

8.2.21 设置帐户资源限制

限制客户端使用 MySQL 服务器资源的一种方法是将全局max_user_connections系统变量设置为非零值。这将限制任何给定帐户可以建立的同时连接数,但对客户端连接后执行的操作没有限制。此外,设置max_user_connections不启用对个体帐户的管理。两种类型的控制都对 MySQL 管理员有趣。

为了解决这些关切,MySQL 允许对个体帐户设置服务器资源的限制:

  • 一个帐户可以在一小时内发出多少个查询

  • 一个帐户可以在一小时内发出多少个更新

  • 一个帐户可以在一小时内多少次连接到服务器

  • 一个帐户可以同时连接到服务器的次数

任何客户端可以发出的事务都将计入查询限制。只有修改数据库或表的事务才会计入更新限制。

在这里,““帐户””对应于 mysql.user 系统表的一行。这意味着连接将根据 UserHost 值在 user 表行中评估。例如,帐户 'usera'@'%.example.com' 对应于 user 表的一行,该行具有 UserHost 值为 usera%.example.com,以允许 useraexample.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值)。user2user3的连接限制为5和20,因为它们的MAX_USER_CONNECTIONS限制不为零。

服务器将账户的资源限制存储在对应账户的user表行中。max_questionsmax_updatesmax_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_CONNECTIONSER_USER_LIMIT_REACHED),如果服务器还没有完全处理断开连接时连接发生时。服务器完成断开处理后,另一个连接将再次被允许。