小工具      在线工具  汉语词典  css  js  c++  java

Mysql Too Many Connections错误复现实验

python,mysql,mysql 额外说明

收录于:40天前

Mysql有很多变量、状态、查询信息。我们简单看一下这些说法的场景。这里我们尝试使用外部进程来访问mysql。通过查看mysql的各种数据来了解更多关于mysql的知识。

材料:

  • 添加一个大桌子(200W),
  • 连接数据,使用python连接
CREATE TABLE `mtest` ( `ID` int(11) NOT NULL DEFAULT '0', `SCHOOL_NAME` varchar(255) DEFAULT NULL, `MAJOR_NAME` varchar(255) DEFAULT NULL, `YEAR` int(4) DEFAULT NULL, `SCORE_RANKING` int(255) DEFAULT NULL, `SCORE` int(5) DEFAULT NULL, `THE_SAME_SCORE_PERSON` int(255) DEFAULT NULL, `PICI` varchar(32) DEFAULT NULL, ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

给这个表添加了200W多条数据。

测试内容:

Python请求mysql,如何查看

使用以下sql

select * from information_schema.`PROCESSLIST` where db = 'channel';
show status like '%Connections%';

一个进程一条 PROCESS.
如果把这个进程给kill 掉,则process也消失,在未查询等待阶段为sleep


如果使用连接池怎么办?

如果使用连接池,设置为5个连接,那么mysql中会产生5个PROCESS,其中4个是空闲的,1个是运行的。

pool = PooledDB(MySQLdb,5,host=chost,user='root',passwd='game123',db='channel',charset='utf8',port=3306)
import time
def performance(f):   #日志,打印用了多少时间
    def fn(*args,**kw):
        t1 = time.time()
        r =  f(*args,**kw)
        t2 = time.time()
        print '运行时间: %s() in %fs' % (f.__name__, (t2 - t1))
        return r
    return fn
@performance 
def execSql(con):  #查询语句
    sql = "SELECT * FROM mtest where major_name='商务英语'";
    cur = con.cursor()
    cur.execute(sql)
    rows = cur.fetchall()
    print '从数据库返回 数据条数:',len(rows)  #打印了多少数据
    cur.close()
conn = pool.connection()  #从连接池拿连接
for i in range(0,6): # 循环查询
    execSql(conn)

conn.close()

这里写图片描述

这次查看,发现只有221060个进程在执行。如果我们想同时有多个进程,就需要多个进程或者线程。


如果在进程中使用多个线程调用连接池,则可以看到mysql中有多个PROCESS同时运行。

def execSql():  #查询语句
    con = pool.connection()  #从连接池拿连接
    sql = "SELECT * FROM mtest where major_name='商务英语'";
    cur = con.cursor()
    cur.execute(sql)
    rows = cur.fetchall()
    print threading.current_thread().name,'线程从数据库返回 数据条数:',len(rows)  #打印了多少数据
    cur.close()
# 执行多线程
t = threading.Thread(target=execSql, name='Thread1')
t.start()
t = threading.Thread(target=execSql, name='Thread2')
t.start()
for i in range(0,6): # 循环查询
    execSql()

这里写图片描述


我可以在哪里调整这个流程?如果最大打开数设置的很小,并且检索连接池会发生什么情况?

show variables like ‘max_connections’;
设置连接数方法:

  • 1、在my.cnf中找到max_connections=100,修改为max_connections=1000。只需在服务中重新启动MYSQL即可。

  • 2.mysql客户端设置

    -- 查询数据库最大连接数
    show variables like 'max_connections';
    -- 设置最大连接数
    set global max_connections = 3;

我设置为3,调用python程序时会抛出错误:

_mysql_exceptions.OperationalError: (1040, 'Too many connections')

PROCESS 有几种状态?

状态非常多:http://imysql.com/2015/06/10/mysql-faq-processlist-thread-states.shtml


关于copy to tmp table的状态,在哪里可以设置呢?如果最大tmp设置的很小,执行会很慢吗?

group 的处理,99%的时间在 copy to tmp Table 中,如果tmp设置很小,这个时间会长吗?
这里写图片描述

查看tmp表的参数以及设置tmp表的参数

-- 查看tmp_table 的参数 ,
show VARIABLES like '%table_size%' -- 设置tmp_table值 -- set tmp_table_size = 16384000;
-- set max_heap_table_size = 16384000;

-- 查看tmp相关
show VARIABLES like '%tmp%' show status like '%tmp%'

这里写图片描述

100M的tmp_table时,用了34.516s
16K的tmp_table时, ,用了 35.288s
多试了几次,貌似都没啥效果的???。。。。呃?


检查组执行时状态变化。

这里写图片描述


关于锁?

– 会话一
update mtest t set MAJOR_NAME=’iam1_byThread1’ where id = 1
update mtest t set MAJOR_NAME=’iam2_byThread1’ where id = 2

– 会话二
update mtest t set MAJOR_NAME=’iam1_byThread2’ where id = 2
update mtest t set MAJOR_NAME=’iam2_byThread2’ where id = 1

如果两个会话同时进行,则会出现锁定。但是我用python多线程尝试了一下,发现mysql好像可以自己解锁这样的锁。

运行过程中,下面的查询会发生变化

  • Table_locks_immediate 会累加,
    这里写图片描述

  • processlist ,直接看不出锁,如果执行时间很长,会有嫌疑
    这里写图片描述

  • 在表使用过程中,show open tables from 数据库 会有in_user 的状态,但是看不出锁
    这里写图片描述

. . .

相关推荐

额外说明

《MySQL入门教程》第十六章 MySQL常用函数-日期函数

文章目录 16.1 获取当前日期和时间 16.2 构造一个日期时间值 16.3 获取日期时间中的信息 16.4 将日期时间转换为其他类型 16.5 日期时间的加减运算 16.6 时区转换 上一篇介绍了 MySQL 中常用的字符函数,本篇我们继续讨论常用的

额外说明

TP5+商城小程序——数据库访问ORM与模型

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技am

额外说明

Vue —— 进阶脚手架(五)(全局事件总线、消息订阅与发布)

Vue全家桶 系列文章目录 内容 参考链接 Vue2.x - 基础 Vue2.x - 基础 Vue2.x - 进阶(零) 初始化脚手架 Vue2.x - 进阶(一) refs属性、props配置项 Vue2.x - 进阶(二) 混入 mixin、插件 p

额外说明

【开发工具】Android Studio中导入外部jar包

一、前文 Android Studio使用的也不多,很多东西都是参考别人的经验,然后进行测试使用,也会踩到很多坑,然后把测试使用的心得,以及方法总结下来 二、参考文章 Android Studio 简介及导入 jar 包和第三方开源库方【http://b

额外说明

【PHP面试题51】Swoole是什么?有什么特点,主要解决了什么问题

文章目录 一、前言 二、什么是Swoole? 三、如何使用Swoole? 四、Swoole主要解决了什么问题? 4.1 高性能 4.2 高并发 4.3 异步编程 4.4 多协议支持 五、总结 一、前言 本文已收录于PHP全栈系列专栏:PHP面试专区。 计

额外说明

全网详细解决:无法将 “xxx” 项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次

文章目录 1. 复现问题 2. 分析问题 3. 解决问题 1. 复现问题 今天,使用如下命令在Windows PowerShell中执行时: telnet 127.0.0.1 80 却报出如下错误: PS C:\Users\zxy> telnet 12

额外说明

HTML学习笔记:设置文本字体

目录 一、设置字体名 1、演示效果 2、编写源码 二、设置字号 1、使用单位设置字号 (1)常用单位 (2)案例演示 (3)编写代码 2、使用关键字设置字号 (1)绝对关键字 (2)相对关键字 一、设置字体名 1、演示效果 2、编写源码 <!DOCTYP

额外说明

电脑系统丢失dwmcore.dll文件如何解决?

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或者损坏了,这时你只需下载这个dwmcore.dll文件进行安装(前提是找到适合的版本),当

额外说明

ftp批量上传文件_如何使用FTP批量上传WordPress媒体文件

ftp批量上传文件 您想使用 FTP 批量上传 WordPress 媒体文件吗?默认情况下,WordPress 不允许您通过 FTP 上传媒体文件,这对于想要一次性批量上传文件的用户来说可能会很烦人。在本文中,我们将向您展示如何使用 FTP 轻松批量上传

ads via 小工具