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

  • 相关阅读:
    Proj THUDBFuzz Paper Reading: PMFuzz: Test Case Generation for Persistent Memory Programs
    入围 WF 后训练记
    算法竞赛历程
    2021 多校 杭电 第十场
    2021 多校 杭电 第九场
    2021 多校 牛客 第十场
    2021 多校 牛客 第九场
    2021 多校 杭电 第八场
    2021 多校 杭电 第六场
    2021 多校 杭电 第七场
  • 原文地址:https://www.cnblogs.com/lewh/p/6340544.html
Copyright © 2011-2022 走看看