之前在网上看到很多关于max_conections & max_user_conenctions变量的解释,但是感觉都有些不太准确,要不就是说的很模糊,因此详读了mysql的官方文档6.3.4 Setting Account Resource Limits章节,并结合实验进行验证。


    仅供参考:如有遗误,望请海涵!


实验步骤如下:

    1. 启动mysql

    2. 创建测试环境所需的用户

    3. 查看及验证max_connections变量的意义

    4. 查看及验证max_user_connections变量的意义


启动mysql,命令如下:

    windows:C:\net start mysql

    linux: #service mysqld start


创建测试环境所需的用户

    [windows | linux] : mysql -uroot -p

    Enter password:******

    mysql> create user keyman@'127.0.0.1' identified by 'keyman';

    mysql> create user harry@'127.0.0.1' identified by 'harry';

    mysql> flush privileges;


查看及验证max_connections变量的含义

    1) 打开4个命令窗口[window1 & window2 & window3 & window4]

    2)window1上执行如下命令

        [windows | linux] : mysql -uroot -p

        Enter password:******

        mysql> select @@max_connections;

        +-------------------+  

        |  max_connections  |

        +-------------------+

        |                0  |

        +-------------------+

        //可以看到此时的值(默认值)是0,即不做限制

        mysql> set @@global.max_connections=2;    

        mysql> select @@max_connections;

        +-------------------+  

        |  max_connections  |

        +-------------------+

        |                2  |

        +-------------------+

        mysql> exit

        [windows | linux] : mysql -uroot -p

        Enter password:******

    3) window2上执行如下命令

        [windows | linux] : mysql -ukeyman -p

        Enter password:******

        mysql>

    4) window3上执行如下命令

        [windows | linux] : mysql -uharry -p

        Enter password:*****

        ERROR 1040(08004):Two many connections

        //由于max_connections的值设置为2,因此此时无法在进行连接,但是此时仍然不明确

        //为什么无法连接,继续测试以进一步验证无法连接的原因。

    5)window3上执行如下命令

        注意:4)步骤无法登陆mysql,此步骤可直接在4)的基础之上执行如下命令,也可以再新打开一个命令窗口。

        [windows | linux] : mysql -ukeyman -p

        Enter password:******

        mysql>

        //奇迹发生了,keyman用户竟然连接上了。

    6)window4上执行如下命令

        [windows | linux] : mysql -ukeyman -p

        Enter password:******

        mysql>

        //奇迹再次发生,keyman用户的第三个连接竟然又连接上了。

        

    综上6步,max_connections变量的意义显而易见。


查看及验证max_user_connections变量的含义

    1) 打开三个命令窗口[window1 & window2 & window3 & window4]

    2)window1上执行如下命令

        [windows | linux] : mysql -uroot -p

        Enter password:******

        mysql> select @@max_user_connections;

        +------------------------+  

        |  max_user_connections  |

        +------------------------+

        |                     0  |

        +------------------------+

        //可以看到此时的值(默认值)是0,即不做限制

        mysql> set @@global.max_user_connections=2;    

        mysql> select @@max_user_connections;

        +------------------------+  

        |  max_user_connections  |

        +------------------------+

        |                     2  |

        +------------------------+

        mysql> exit

        [windows | linux] : mysql -uroot -p

        Enter password:******

    3) window2上执行如下命令

        [windows | linux] : mysql -uroot -p

        Enter password:******

        mysql>

    4) window3上执行如下命令

        [windows | linux] : mysql -uroot -p

        Enter password:******

        ERROR 1203(42000):User root already has more then 'max_user_connections' active connections

        //由于max_connections的值设置为2,因此此时无法在进行连接,但是此时仍然不明确

        //为什么无法连接,继续测试以进一步验证无法连接的原因。

    5)window3上执行如下命令

        注意:4)步骤无法登陆mysql,此步骤可直接在4)的基础之上执行如下命令,也可以再新打开一个命令窗口。

        [windows | linux] : mysql -ukeyman -p

        Enter password:******

        mysql>

        //奇迹发生了,keyman用户竟然连接上了

    6) window4上执行如下命令

        [windows | linux] : mysql -uharry -p

        Enter password:******

        mysql>

        //奇迹再次发生了,harry用户竟然连接上了


    综上6步,max_user_connections变量的意义显而易见。


将max_user_connections变量的值与用户关联

    1) 打开三个命令窗口[window1 & window2 & window3 & window4]

    2)window1上执行如下命令

        [windows | linux] : mysql -uroot -p

        Enter password:******

        mysql> select @@max_user_connections;

        +------------------------+  

        |  max_user_connections  |

        +------------------------+

        |                     0  |

        +------------------------+

        //mysql> show grants;命令也可以查看。

        //可以看到此时的值(默认值)是0,即不做限制

        mysql> grant usage on *.* to keyman@'127.0.0.1' with max_user_connections 2;    

        mysql> select @@max_user_connections;

        +------------------------+  

        |  max_user_connections  |

        +------------------------+

        |                     2  |

        +------------------------+

        mysql> exit

        [windows | linux] : mysql -ukeyman -p

        Enter password:******

    3) window2上执行如下命令

        [windows | linux] : mysql -ukeyman -p

        Enter password:******

        mysql>

    4) window3上执行如下命令

        [windows | linux] : mysql -ukeyman -p

        Enter password:******

        ERROR 1203(42000):User keyman already has more then 'max_user_connections' active connections

        //由于max_connections的值设置为2,因此此时无法在进行连接,但是此时仍然不明确

        //为什么无法连接,继续测试以进一步验证无法连接的原因。

    5)window3上执行如下命令

        注意:4)步骤无法登陆mysql,此步骤可直接在4)的基础之上执行如下命令,也可以再新打开一个命令窗口。

        [windows | linux] : mysql -uroot -p

        Enter password:******

        mysql> select @@max_user_connections;

        +------------------------+  

        |  max_user_connections  |

        +------------------------+

        |                     0  |

        +------------------------+

        //经过验证,在三个窗口中同时登陆root账户,没有任何问题。


    

    如果你坚持看完了这篇文章,那么很荣幸能够和你分享 最终结论。见证奇迹的时刻:

        结论1:max_connections变量的意义是 限制当前mysql server中 允许同时连接的不同用

              户数,并不对相同用户的多次连接进行限制

        结论2:max_user_connections变量的意义是 限制当前mysql server中 允许同时连接的相

              同用户的连接数,不对连接的不同用户数进行限制

        结论3:对max_connections变量的设置,由于是设置的全局变量,因此均是对所有用户生效

        结论4:对max_user_connections的设置,分为以下两种情况;

            1. 针对所有用户有效

                mysql> set @@global.max_user_connections=2;

            2. 针对单个用户有效

                mysql> grant usage on *.* to keyman@127.0.0.1 with max_user_connections 2;

                //此时的设置将仅对keyman用户有效。


        注:与max_user_connections参数类似的还有max_queries_per_hour,max_updates_per_hour

            及max_connections_per_hours,见名知意,用法同上。