限制客户端使用MySQL服务器资源的一种方法是设置全局max_user_connections
系统变量为非零值。这限制了任何给定帐户可以同时进行的连接数量,但对客户端连接后可以做的事情没有限制。此外,设置max_user_connections
不能对个人帐户进行管理。这两种类型的控件都是MySQL管理员感兴趣的。
为了解决这些问题,MySQL允许对个人帐户使用这些服务器资源进行限制:
一个帐户每小时可以发出的查询数量
一个帐户每小时可以发布的更新数
一个帐户每小时可以连接到服务器的次数
一个帐户同时连接到服务器的数量
客户端可以发出的任何语句都将计入查询限制,除非其结果由查询缓存提供。只有修改数据库或表的语句才计入更新限制。
一个”账户”中的一行mysql.user
系统表。也就是说,连接是根据用户
而且宿主
中的值用户
应用于连接的表行。例如,一个帐户' usera ' @ ' % .example.com '
中的一行用户
表。用户
而且宿主
的值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
,服务器将该连接与来自该主机的现有连接一起应用限制。
若要在创建帐户时为帐户设置资源限制,请使用创建用户
声明。若要修改现有帐户的限制,请使用改变用户
.提供一个与
子句,用于命名要限制的每个资源。每个限制的默认值为零(没有限制)。例如,要创建一个可以访问客户
数据库,但仅以有限的方式,发出以下语句:
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;
中的限制类型不需要全部命名与
子句,但是被命名的子句可以以任何顺序出现。每小时限制的值应该是表示每小时计数的整数。为MAX_USER_CONNECTIONS
时,该限制为表示该帐户同时连接的最大数的整数。如果此限制设置为零,则全局max_user_connections
系统变量值决定同时连接数。如果max_user_connections
也是零,对账户没有限制。
要修改现有帐户的限制,请使用改变用户
声明。下面的语句更改的查询限制弗朗西斯
100年:
mysql> ALTER USER 'francis'@'localhost' WITH MAX_QUERIES_PER_HOUR 100
该语句只修改指定的限制值,帐户在其他方面保持不变。
若要删除限制,请将其值设置为零。例如,删除每小时的次数限制弗朗西斯
可以连接,使用这个语句:
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_CONNECTIONSALTER USER 'user3'@'localhost' WITH MAX_USER_CONNECTIONS 20
user1
连接限制为10(全局max_user_connections
Value),因为它有一个MAX_USER_CONNECTIONS
0的极限。user2
而且user3
连接限制分别为5和20,因为它们是非零的MAX_USER_CONNECTIONS
限制。
中存储帐户的资源限制用户
表中行对应的帐户。的max_questions
,max_updates
,max_connections
列存储每小时限制,而max_user_connections
列存储MAX_USER_CONNECTIONS
极限。(见第6.2.3节“拨款表”.)
当任何帐户对任何资源的使用有非零限制时,就会发生资源使用计数。
当服务器运行时,它会计算每个帐户使用资源的次数。如果一个帐户在最后一个小时内达到了其连接数的限制,服务器将拒绝该帐户的进一步连接,直到该小时结束。类似地,如果帐户达到了查询或更新数量的限制,服务器将拒绝进一步的查询或更新,直到该小时结束。在所有这些情况下,服务器都会发出适当的错误消息。
资源计数按帐户进行,而不是按客户端进行。例如,如果您的帐户的查询限制为50,则不能通过同时建立两个客户端连接到服务器来将查询限制增加到100。在两个连接上发出的查询一起计算。
当前每小时资源使用计数可以为所有帐户全局重置,也可以为特定帐户单独重置:
要将所有帐户的当前计数重置为零,请发出命令
冲洗USER_RESOURCES
声明。也可以通过重新加载授权表来重置计数(例如,使用冲洗的特权
语句或mysqladmin重载命令)。个人帐户的计数可以通过再次设置其任何限制重置为零。指定与当前分配给帐户的值相等的限制值。
每小时计数器重置不影响MAX_USER_CONNECTIONS
极限。
当服务器启动时,所有计数都从零开始。计数不会在服务器重新启动时进行。
为MAX_USER_CONNECTIONS
限制,如果帐户当前打开了允许的最大连接数,则可能会发生边缘情况:断开连接后快速连接可能会导致错误(ER_TOO_MANY_USER_CONNECTIONS
或ER_USER_LIMIT_REACHED
)如果服务器在连接发生时还没有完全处理断开连接。当服务器完成断开连接处理后,再次允许另一个连接。