zoukankan      html  css  js  c++  java
  • Mysql最大连接数

    连接数不足报错

    "Can not connect to MySQL server. Too many connections"-mysql 1040

    这是因为访问MySQL且还未释放的连接数目已经达到MySQL的上限。
    MySQL默认的最大连接数为100,MySQL允许的最大连接数16384
    Windows下由于线程数限制MySQL最大连接数为2048

    查看mysql的连接数

    mysql -u User -pPassword
    
    show variables like 'max_connections' G;
    
    *************************** 1. row ***************************
    Variable_name: max_connections
            Value: 100
    

    修改mysql的最大连接数为2000

    临时方案(重启失效)

    msyql > set global max_connections=2000;
    mysql > exit
    

    永久方案

    #!/bin/bash
    myCnf=/etc/my.cnf
    grep -lq max_connections ${myCnf}
    if [ $? -eq 0 ];then
        sed -i "/max_connections/d" ${myCnf}
        sed -i '/[mysqld]/amax_connections = 2000' ${myCnf}
    else
        sed -i '/[mysqld]/amax_connections = 2000' ${myCnf}
    fi
    

    Mysql连接数相关

    在MySQL数据库层面,以下参数决定了可同时打开的表的数量和要使用的文件描述符

    1. table_open_cache(table_cache)
    2. max_tmp_tables
    3. open_files_limit
    show status like 'Open_tables';
    
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | Open_tables    | 19    |
    +---------------+-------+
    

    Open_tables:

    指当前数据库打开的表的数量,但非实际打开的表的数量。
    由于MySQL是多线程的系统,数个不同的并发连接可能打开同一张表,这就需要为不同的连接session分配独立的内存空间来存储这些信息以避免冲突,因此连接数的增加会导致MySQL需要的文件描述符数目的增加。
    另外对于MyISAM表,还会建立一个共享的索引文件描述符。
    通过flush tables命令可以关闭当前打开的表。

    show variables like 'table_cache';
    
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | table_cache   | 64    |
    +---------------+-------+
    

    table_open_cache(table_cache):

    指MySQL所有线程能同时打开多少表。
    我们可以搜集系统打开表的数量的历史记录和这个参数来对比,决定是否要增加这个参数的大小。

    show variables like 'max_tmp_%';
    
    +----------------+-------+
    | Variable_name  | Value |
    +----------------+-------+
    | max_tmp_tables | 32    |
    +----------------+-------+
    

    max_tmp_tables:
    指单个客户端连接能打开的临时表数目

    show global status like '%tmp%table%';
    
    +-------------------------+--------+
    | Variable_name           | Value  |
    +-------------------------+--------+
    | Created_tmp_disk_tables | 0      |
    | Created_tmp_tables      | 118241 |
    +-------------------------+--------+
    

    Created_tmp_disk_tables与Created_tmp_tables:

    根据这两个值可以判断临时表的创建位置,一般选取BLOB和TEXT列、Group by 和 Distinct语句的数据量超过512 bytes,或者union的时候select某列的数据超过512 bytes的时候,就直接在磁盘上创建临时表了
    另外内存中的临时表变大的时候,也可能被MySQL自动转移到磁盘上(由tmp_table_sizemax_heap_table_size参数决定)
    增加table_open_cache(table_cache)max_tmp_tables参数的大小后,从操作系统的角度看,mysqld进程需要使用的文件描述符的个数增加,需要修改open_files_limit

    show variables like 'open_files%';
    
    +------------------+-------+
    | Variable_name    | Value |
    +------------------+-------+
    | open_files_limit | 10000 |
    +------------------+-------+
    

    open_files_limit:

    这个参数受限于OS,非必然生效。
    如果OS限制MySQL不能修改这个值,那么置为0。
    如果是专用的MySQL服务器上,这个值一般要设置的尽量大,就是设为没有报Too many open files错误的最大值。
    当操作系统无法分配足够的文件描述符的时候,mysqld进程会在错误日志里记录警告信息。

    show global status like '%file%';
    
    +-------------------+-------+
    | Variable_name     | Value |
    +-------------------+-------+
    | Created_tmp_files | 5     |
    | Open_files        | 0     |
    +-------------------+-------+
    

    Open_files和Opened_files(Created_tmp_files):

    记录了当前和历史的文件打开信息

    show status like '%thread%';
    
    +------------------------+-------+
    | Variable_name          | Value |
    +------------------------+-------+
    | Delayed_insert_threads | 0     |
    | Slow_launch_threads    | 0     |
    | Threads_cached         | 0     |
    | Threads_connected      | 61    |
    | Threads_created        | 69950 |
    | Threads_running        | 1     |
    +------------------------+-------+
    

    threads_connected:

    MySQL为每个连接分配线程来处理,可以通过threads_connected参数查看当前分配的线程数量。
    比较threads_connected参数和前面提到的max_connections参数,可以作为目前的系统负载的参照,决定是否需要修改连接数

    杀Mysql连接

    # 杀掉所有连接
    out1=$(mysql -B test -uroot -proot --disable-column-names  -e "select concat('KILL ',id,';') from information_schema.processlist where user='root' and time > 200;")
    
    mysql -B test -uroot -proot --disable-column-names  -e "$out1"
    

    参考资料

    怎么查看和修改 MySQL 的最大连接数?

    MySQL最大连接数设置

    How do I kill all the processes in Mysql “show processlist”?

    批量 kill mysql 中运行时间长的sql

  • 相关阅读:
    vim快捷键整理(随时更新)
    值不能为:null 参数名: viewInfo (Microsoft.SqlServer.Management.SqlStudio.Explorer)
    未能从程序集“system.servicemodel,version=3.0.0.0,culture=neutral,publickeytoken=b77a5c561934e089”中加载类型“system.servicemodel.activation.httpmodule”
    linux内存手动释放
    无法获取有关 Windows NT 组/用户 'WIN-***************' 的信息,错误代码 0x534。 [SQLSTATE 42000] (错误 15404)).
    ERROR: child process failed, exited with error number 51
    MongoDB 分片状态recovering
    打不开磁盘“D:vmcentos7.3_3CentOS7.3_3 64 位-000002.vmdk”或它所依赖的某个快照磁盘
    更换内存引发的问题
    AttributeError: 'module' object has no attribute 'random'
  • 原文地址:https://www.cnblogs.com/lewh/p/6340544.html
Copyright © 2011-2022 走看看