限制客户端使用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' MAX_QUERIES_PER_HOUR 100;
该语句只修改指定的限制值,帐户在其他方面保持不变。
若要删除限制,请将其值设置为零。例如,取消每小时的次数限制弗朗西斯
可以连接,用这个语句:
mysql>修改用户francis @ localhost的MAX_CONNECTIONS_PER_HOUR为0;
如前所述,帐户的同时连接限制由MAX_USER_CONNECTIONS
限制和max_user_connections
系统变量。假设全局max_user_connections
取值为10,三个帐户的资源限制如下:
修改用户user1 @ localhost的最大连接数为0;修改用户user2 @ localhost的连接ALTER USER 'user3'@'localhost'
user1
连接限制为10(全局max_user_connections
值),因为它有一个MAX_USER_CONNECTIONS
零的极限。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
),如果在连接发生时服务器还没有完全处理断开。当服务器完成断开处理时,再次允许另一个连接。