限制客户端使用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域中的任何主机进行连接 。在这种情况下,服务器通过域中的usera任何主机 将此行中的资源限制集中应用于所有连接,example.com因为所有此类连接都使用相同的帐户。
在MySQL 5.0之前,“ 帐户 ”是根据用户连接的实际主机进行评估的。可以通过使用--old-style-user-limits选项启动服务器来选择这种较旧的记帐方法 。在这种情况下,如果usera同时从host1.example.com和 连接host2.example.com,则服务器会将帐户资源限制分别应用于每个连接。如果 usera再次从连接 host1.example.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限制为零。user2和user3连接限制分别为5和20,因为它们具有非零MAX_USER_CONNECTIONS限制。
服务器将帐户的资源限制存储在user与该帐户相对应的 表行中。的max_questions, max_updates和 max_connections列存储每小时限制和max_user_connections列存储的MAX_USER_CONNECTIONS限制。(请参见 第6.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)。连接发生的时间。服务器完成断开连接处理后,将再次允许另一个连接。