Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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

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 域中的任何主机连接。在这种情况下,服务器将对该行中的所有连接应用资源限制,因为所有这些连接都使用相同的账户。

要在账户创建时建立资源限制,使用 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)如果服务器尚未完全处理断开连接时连接发生。服务器完成断开处理后,另一个连接将再次被允许。