MySQL服务器最大链接数怎么设置才合理[转]

若是mysql 链接数据设置不合理可能会致使很小的流量mysql就提示MySQL: ERROR 1040: Too many connections错误了,那么要如何才算是合理设置mysql最大链接数呢,下面我来给你们介绍介绍。
 

MySQL服务器的链接数并非要达到最大的100%为好,仍是要具体问题具体分析,下面就对MySQL服务器最大链接数的合理设置进行了详尽的分析,供您参考。mysql

咱们常常会碰见“MySQL: ERROR 1040: Too many connections”的状况,一般,mysql的最大链接数默认是100, 最大能够达到16384。sql

一种是访问量确实很高,MySQL服务器抗不住,这个时候就要考虑增长从服务器分散读压力,另一种状况是MySQL配置文件中max_connections值太小:数据库

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 256 |
+-----------------+-------+windows

这台MySQL服务器最大链接数是256,而后查询一下服务器响应的最大链接数:服务器

mysql> show global status like 'Max_used_connections';session

MySQL服务器过去的最大链接数是245,没有达到服务器链接数上限256,应该没有出现1040错误,比较理想的设置是:多线程

Max_used_connections / max_connections * 100% ≈ 85%并发

最大链接数占上限链接数的85%左右,若是发现比例在10%如下,MySQL服务器链接上线就设置得太高了操作系统


 在Windows下经常使用的有两种方式修改最大链接数。命令行

第一种:命令行修改。

    >mysql -uuser -ppassword(命令行登陆MySQL)

    mysql>show variables like 'max_connections';(查能够看当前的最大链接数)

    msyql>set global max_connections=1000;(设置最大链接数为1000,能够再次查看是否设置成功)

    mysql>exit(推出)

    这种方式有个问题,就是设置的最大链接数只在mysql当前服务进程有效,一旦mysql重启,又会恢复到初始状态。由于mysql启动后的初始化工做是从其配置文件中读取数据的,而这种方式没有对其配置文件作更改。

    第二种:修改配置文件。

   这 种方式说来很简单,只要修改MySQL配置文件my.ini 或 my.cnf的参数max_connections,将其改成max_connections=1000,而后重启MySQL便可。可是有一点最难的就是my.ini这个文件在哪找。一般有两种可能,一个是在安装目录下(这是比较理想的状况),另外一种是在数据文件的目录下,安装的时候若是没有人为改变目录的话,通常就在C:/ProgramData/MySQL往下的目录下。

 与链接数相关的几个参数:

     在修改最大链接数的时候会有这样一个疑问—这个值是否是越大越好,或者设置为多大才合适?这个参数的大小要综合不少因素来考虑,好比使用的平台所支持的线程库数量(windows只能支持到2048)、服务器的配置(特别是内存大小)、每一个链接占用资源(内存和负载)的多少、系统须要的响应时间等。能够在global或session范围内修改这个参数。链接数的增长会带来不少连锁反应,须要在实际中避免由此引起的负面影响。

    首先看一下MySQL的状态:

mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.5.15, for Win32 (x86)

Connection id:          1
Current database:
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.5.15 MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    gbk
Conn.  characterset:    gbk
TCP port:               3306
Uptime:                 1 hour 3 min 27 sec

Threads: 12  Questions: 18  Slow queries: 10  Opens: 33  Flush tables: 5  Open tab
les: 34  Queries per second avg: 6.256
--------------

Open tables:34,即当前数据库打开表的数量是34个,注意这个34并非实际的34个表,由于MySQL是多线程的系统,几个不一样的并发链接可能打开同一个表,这就须要为不一样的链接session分配独立的内存空间来存储这些信息以免冲突。所以链接数的增长会致使MySQL须要的文件描述符数目的增长。另外对于MyISAM表,还会创建一个共享的索引文件描述符。

    在MySQL数据库层面,有几个系统参数决定了可同时打开的表的数量和要使用的文件描述符,那就是table_open_cache、max_tmp_tables和open_files_limit。

mysql> show variables like 'table_open%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| table_open_cache | 256   |
+------------------+-------+
1 row in set (0.00 sec)

table_open_cache:256,这就是说全部的MySQL线程一共能同时打开256个表,咱们能够搜集系统的打开表的数量的历史记录和这个参数来对比,决定是否要增长这个参数的大小。查看当前的打开表的数目(Open tables)可用上边提到过的status命令,另外能够直接查询这个系统变量的值:

mysql> show status like 'open_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables   | 3     |
+---------------+-------+
1 row in set (0.00 sec)

Open_tables就是当前打开表的数目,经过flush tables命令能够关闭当前打开的表。 这个值若是过大,而且若是没有常常的执行flush tables命令,能够考虑增长table_open_cache参数的大小。
 
接下来看max_tmp_tables:
mysql> show variables like 'max_tmp%';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| max_tmp_tables | 32    |
+----------------+-------+
1 row in set (0.00 sec)
max_tmp_tables:32即单个客户端链接能打开的临时表数目。查看当前已打开的临时表的信息:
mysql> show global status like '%tmp%table%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0     |
| Created_tmp_tables      | 11    |
+-------------------------+-------+
2 rows in set (0.00 sec)
根据这两个值能够判断临时表的建立位置,通常选取BLOB和TEXT列、Group by 和 Distinct语句的数据量超过512 bytes,或者union的时候select某列的数据超过512 bytes的时候,就直接在磁盘上建立临时表了,另外内存中的临时表变大的时候,也可能被MySQL自动转移到磁盘上(由tmp_table_size和max_heap_table_size参数决定)。
 
增长table_open_cache或max_tmp_tables 参数的大小后,从操做系统的角度看,mysqld进程须要使用的文件描述符的个数就要相应的增长,这个是由open_files_limit参数控制的。
mysql> show variables like 'open_files%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 2670  |
+------------------+-------+
1 row in set (0.00 sec)
可是这个参数是OS限制的,因此咱们设定的值并不必定老是生效。若是OS限制MySQL不能修改这个值,那么置为0。若是是专用的MySQL服务器上,这个值通常要设置的尽可能大,就是设为没有报Too many open files错误的最大值,这样就能一劳永逸了。当操做系统没法分配足够的文件描述符的时候,mysqld进程会在错误日志里记录警告信息。
相应的,有两个状态变量记录了当前和历史的文件打开信息:
mysql> show global status like '%open%file%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_files    | 0     |
| Opened_files  | 76    |
+---------------+-------+
2 rows in set (0.00 sec)
MySQL为每一个链接分配线程来处理,能够经过threads_connected参数查看当前分配的线程数量:
mysql> show status like '%thread%';
+------------------------------------------+-------+
| Variable_name                            | Value |
+------------------------------------------+-------+
| Delayed_insert_threads                   | 0     |
| Performance_schema_thread_classes_lost   | 0     |
| Performance_schema_thread_instances_lost | 0     |
| Slow_launch_threads                      | 0     |
| Threads_cached                           | 0     |
| Threads_connected                        | 1     |
| Threads_created                          | 1     |
| Threads_running                          | 1     |
+------------------------------------------+-------+
8 rows in set (0.00 sec)
比较threads_connected参数和前面提到的max_connections参数,也能够做为目前的系统负载的参照,决定是否须要修改链接数。

查看每一个线程的详细信息:mysql>show processlist;对影响系统运行的线程:kill connection|query threadid的命令杀死。

相关文章
相关标签/搜索