精华内容
下载资源
问答
  • 一、MySQL连接数超标原因分析MySQL的默认最大连接数为100(N),实际给普通用户使用只有N-1个,保留一个连接是留给超级管理员使用的,防止连接占满了不会把管理员也踢出来。很多网站在运行的时候都会出现连接数受限...

    一、MySQL连接数超标原因分析

    MySQL的默认最大连接数为100(N),实际给普通用户使用只有N-1个,保留一个连接是留给超级管理员使用的,防止连接占满了不会把管理员也踢出来。很多网站在运行的时候都会出现连接数受限现象,天缘认为十之八九并非是网站的真实访问量太大导致连接数超标,更多是因为我们在设计网站程序的时候采用了不合理的设计架构或数据结构引起的。非正常连接超限可能原因如下(仅供参考):

    1、类似人数、在线时间、浏览数等统计功能与主程序数据库同属一个数据空间时就很容易出现

    2、复杂的动态页尤其是用户每次浏览都涉及到多数据库或多表操作时候也很容易出现

    3、还有就是程序设计的不合理(比如复杂运算、等待等操作放置在数据库交互行为中间进行),或者程序存在释放BUG。

    4、计算机硬件配置太低确安装太高版、太高配置的MySQL

    5、未采用缓存技术

    6、数据库未经过优化或表格设计及其复杂

    等等一些原因,都会延长数据库的数据交互时间或增加交互次数。所以,如果大家遇到这类问题,受限要考虑程序是否存在BUG导致连接释放失败,再次就是考虑优化软硬件。当然修改MySQL连接数也是软件优化的操作方法之一,希望天缘网友都能够本着学习的态度通过研究一下自身的原因从而解决这一问题。如果实在是找不到原因,那就只好先修改连接数,暂缓定位真实原因了。

    二、怎样修改MySQL的最大连接数

    1、使用内存变量修改法修改MySQL的最大连接数

    步骤如下(同时适用Windows和Linux平台):

    A、客户端登录MySQL,输入用户名和密码

    B、在MYSQL命令提示符下设置新的最大连接数为500:mysql> set GLOBAL

    max_connections=500

    C、显示当前运行的Query:mysql> show processlist

    D、显示当前MYSQL 系统参数状态:mysql> show status

    E、退出客户端:mysql> exit

    查 看当前最大连接数只需要通过在mysqladmin所在目录下执行以下命令:mysqladmin -username

    -password variables |find "max_con"

    即可看到。也可以使用PHPMyadmin里头的MYSQL参数列表查看最大连接数。

    缺点:重启计算机或者MySQL后最大连接数又会复位成初始值,需要重新设定。

    2、修改my.ini或my.cnf文件法(需要重启MySQL),可参考同目录下MySQL的配置模板(小内存、大内存、超大内存)

    Windows系统下:

    打开my.ini文件找到set-variable

    =max_connections=100这一行,改成需要设定的最大连接数,然后重启即可。

    Linux控制台下:

    打开my.cnf文件:vi /etc/my.cnf

    在[mysqld]段下修改max_connections的值为设定值。

    天缘注:可能大家安装的MYSQL来源和版本不同(Windows下MySQL+IIS和PHP+Apache+MySQL套件最终安装结果几乎都不相同),my.ini文件的路径可能有些不同,my.ini可能还会保留一份在C:\Windows目录下需要同时修改。

    三、补充几个常用的MYSQL命令

    Windows 下:

    1、启动MySQL服务:net start mysql

    2、停止MySQL服务:net stop mysql

    3、重启MySQL服务:net restart mysql

    Linux下:

    1、Linux系统下启动MySQL的命令:

    mysqladmin start

    /ect/init.d/mysql start (前面为mysql的安装路径)

    2、inux下重启MySQL的命令:

    mysqladmin restart

    /ect/init.d/mysql restart (前面为mysql的安装路径)

    3、linux下关闭MySQL的命令:

    mysqladmin shutdown

    /ect/init.d/mysql shutdown

    (前面为mysql的安装路径)

    Windows/Linux公用:

    4、手动运行登录MYSQL(如果是超级后台直接输入密码即可)

    mysql -u root -p,然后再输入密码即可。

    5、登录远程MYSQL:mysql -h xxx.xxx.xxx.xxx -u root -p

    password,中间的xxx为IP地址

    6、显示数据库:mysql>show databases;

    7、显示数据表:mysql>show tables;

    8、切换数据表xxx:mysql>use xxx;

    9、退出MySQL:mysql>exit

    10、新建MySQL数据库:mysql>create database 库名;

    11、新建数据表

    mysql>use 库名;

    mysql>create table 表名 (字段设定列表);

    12、删除数据库或数据表

    mysql> drop database 库名;

    mysql>drop table 表名;

    13、将表中记录清空:delete from 表名;

    展开全文
  • 1.查询所有 SELECT * FROM sysprocesses WHERE dbid in( select database_id ...2.查询连接数 SELECT program_name,COUNT(1) FROM sysprocesses WHERE dbid in( select database_id from sys.databases where name..

    1.查询所有

    SELECT * FROM sysprocesses   WHERE dbid in(
    select database_id from sys.databases where name='ECS_DEV'
    )order by program_name;

    2.查询连接数
    SELECT program_name,COUNT(1) FROM sysprocesses   WHERE dbid in(
    select database_id from sys.databases where name='ECS_DEV'
    )group by program_name;

    3.查询服务器运行程序连接数

    SELECT count(*) FROM sysprocesses   WHERE dbid in(
    select database_id from sys.databases where name='ECS_DEV'
    )and hostname='EDSS-SVR' and program_name='Microsoft JDBC Driver for SQL Server';
    select * from 

    4. 查询当前连接数

    select count(distinct(login_time)) from sys.sysprocesses

    5. 设置最大连接数

    exec sp_configure 'show advanced options', 1
    GO

    RECONFIGURE WITH OVERRIDE
    GO

    exec sp_configure 'user connections', 300
    GO

    RECONFIGURE WITH OVERRIDE
    GO

    展开全文
  • 2、问题分析:问题的原因是与数据库的连接没有显示关闭,而等系统自动回收是要时间的.3、相关知识:数据库连接数,也就是一个数据库,最多能够同时接受多少个客户的连接.在没有数据库连接池的情况下, 一个客户,每次...

    一、数据库连接池

    1、报错:

    超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。

    2、问题分析:

    问题的原因是与数据库的连接没有显示关闭,而等系统自动回收是要时间的.

    3、相关知识:

    数据库连接数,也就是一个数据库,最多能够同时接受多少个客户的连接.

    在没有数据库连接池的情况下, 一个客户,每次访问, 就要创建一个数据库连接, 执行SQL, 获取结果,然后关闭、释放掉数据库连接。问题就在于创建一个数据库连接, 是一个很消耗资源,花费很多时间的操作。于是,数据库连接池产生了。

    数据库连接池预先打开一定数量的数据库连接,并维持着连接。当客户要执行SQL语句的时候,从数据库连接池里面获取一个连接,执行SQL, 获取结果,然后把数据库连接交还给数据库连接池。

    假如一个session , 执行10次独立的操作。那么不使用数据库连接池的话,需要创建数据库连接10次,并关闭10次。使用数据库连接池的话,直接使用数据库连接池中已经打开好的,直接使用。

    4、解决方法

    a、在代码里面,把未关闭的数据库连接关闭并释放资源

    b、扩大共享池,配置文件里面,在数据库连接加

    Max Pool Size=512;server=local;uid=;pwd=;database=2004;

    二、IIS并发连接数

    1、报错:

    HTTP 403.9 - 禁止访问:连接的用户过多

    2、相关知识:

    IIS并发连接数是指,首先是向服务器请求XXX.html,然后还会请求这个网页里的CSS、JS、图片等,每次请求算一个IIS并发数。简单来说,就是一个文件被一位网友下载,那么从下载开始到下载结束,这段时间将持续占用1个IIS连接数。

    展开全文
  • 问题背景去年圣诞节当天,突然收到一个我...第一反应是这台服务器运行着自建的 Redis 数据库,但是客户端只有同个内网的一个 Ruby on Rails 的应用,怎么会有连接数爆掉的可能?理论连接数计算老衲掐指一算:side...

    问题背景

    去年圣诞节当天,突然收到一个我经手过的项目的告警邮件,错误消息显示“Redis::CommandError: ERR max number of clients reached”。

    871e42ecd9cf711c480fd7487164157d.png

    什么情况?难道这个项目翻车了?第一反应是这台服务器运行着自建的 Redis 数据库,但是客户端只有同个内网的一个 Ruby on Rails 的应用,怎么会有连接数爆掉的可能?

    理论连接数计算

    老衲掐指一算:

    sidekiq 客户端所需连接数: 对面 Rails 应用有 10 个 Unicorn 工作进程,每个unicorn进程初始化一个 sidekiq 客户端,一个 sidekiq 客户端默认连接池大小是 5,而且是懒惰策略,按需连接的,最大值是 10 x 5 = 50;

    显式 Redis 连接: 程序代码里有一个 $redis 全局变量,初始化了一个 redis 连接,10个工作进程,也就是 10 个连接;

    sidekiq 服务端所需连接数: sidekiq server 端 concurrency 配置是 10,那么按照官方文档,另有加上 2 个连接,也就是12个连接;

    Rails cache 所需连接数: 按照redis-store gem 源码,默认连接池大小应该是 5,10个 unicorn 工作进程,按需连接,最大值是 10 x 5 = 50。

    在不考虑其他可能还用到 Redis 连接的情况下,目前已知的最大 Redis 连接数需求是 122,这个数远小于 Redis 理论最大连接数啊,而且当时显示连接数到达上万!而且这个项目已经很少访问,压力极其小,不大可能会达到理论所需连接数啊!

    一定是有某种神秘力量在主导这一切!!!

    监控与分析

    以上理论最大连接数分析只是定性分析,只能大概说明有一些诡异的东西存在,而想真正确认问题根源,还得做定量分析,只有数据才能说明一切!

    初步观察:Redis 数据库服务器端监控

    事不宜迟,要采集数据,第一步就是加监控,所以当时就紧急写了一个定时采集 Redis 客户端数量(使用 redis 内建 CLIENT LIST 命令)的脚本,结合 crontab 定时运行,将结果写入文件,作为后续分析的基础。

    c0793f3841eb00d9eed34b97af260226.png

    通过监控脚本,发现几个有意思的现象:

    从 Redis 数据库服务端采集的数据看,一直只有来自一台内网机器,也就是我前面说的 Rails 程序所在的服务器的连接,说明这个 Redis 数据库不存在共享给其他应用的可能性;

    经过3天左右的监控,即从12.25到12.28,连续3天,Redis 连接数一直稳步上升,平均每日增加 70-80。在典型的系统资源泄露类(比如内存泄露)问题的场景中,这样的线条看起来特别熟悉,所以,真的是连接数泄露了?

    53c0b56413d11d67ee73d25d2c28e002.png

    进一步分析:Redis 数据库服务器端与客户端连接数对比分析

    在有了上一步的发现之后,我继续用系统命令 sudo netstat -apnt 检查 6379 端口连接数发现,客户端机器也才只有 42 个左右的连接到 redis 服务器端,结合最开始的理论连接数分析,这个数量是比较合理的。

    但是!但是!反过来去服务端机器用同样的命令检查,在服务端视角,却有多达300+个客户端建立的连接,而且都是在 ESTABLISHED 状态!这个数量和上面另一种监控方式得到的数量一致!

    241751e4e95f3e7c7812661e3c388006.png

    到底是什么情况?还能有这种操作?

    f006b7eba1b903b770914eb7c764165d.png

    问题根源

    至此,Redis 连接数泄露是板上钉钉的事情了,可是又是为什么呢?为此,我在网上搜索了很多问答跟文章,后来总算找到了答案,果不其然,还是默认配置的问题。

    Redis 默认配置

    redis 为了避免客户端连接数过多,有一个timeout配置,意思是如果连接的空闲时间超过了timeout的值,则关闭连接。默认配置是0,意思是没有超时限制,永远不关闭连接。生产上显然不会配置0……

    c901912db0bc1c9a7a924b095ce04fef.png

    OMG!赶紧打开我们的 redis 的配置文件验证是否如此,果不其然,redis一直保持着默认配置!

    9e9c66698264e0be676e0174c137ebf1.png

    至此,很好解释为什么连接数会泄露了,因为有很多空闲或者实际上客户端已经断开的连接,在服务器端一侧仍然保持着。那什么情况会导致这样的情况发生呢?

    我猜测:

    网络通信差: 按照 TCP 协议,客户端断开连接时,向服务器端发送 FIN 信号,但是服务端未接收到,客户端超时后放弃等待,直接断开,服务端由于通信故障,保持了 ESTABLISHED 状态,不过由于两端机器在同个内网,网络质量没有理由不行;

    客户端异常: 客户端连接之后,由于代码运行过程中产生异常,导致未正常释放或者关闭连接,sidekiq 的worker很可能就有这类问题。这个的可能性非常大,毕竟我日常写 bug (/ω╲)。

    问题修复

    找到问题根源之后,修复起来就简直太简单了。事实上,开发领域就是如此,绝大部分时间都花在了找 bug 上,而改掉bug,可能只需要一分钟不到。

    首先,修改了下 redis 数据库配置:

    3478d11ffa81e5d116efcc67a349a5eb.png

    成功重启 redis 之后,重新运行前面的监控脚本,以便观察修复后情况,初步可以确认这下服务器端和客户端的连接数一致了:

    79fd935382173319923eef57716c8303.png

    再又经过几天的脚本自动采集数据后分析,系统又恢复平稳运行了,连接数一直稳定在理论最大连接数之下。

    3b469360a781fcfa1ba489a053f434b8.png

    总结

    这个问题的根源其实很小,但是排查过程还是花了挺多时间,主要是需要等待采集到足够的数据后用于分析。其他心得体会:

    保护“案发现场”很重要,要想挖掘问题根源,必须保持环境可重现,这次出现问题的时候虽然第一时间重启了 redis 使服务恢复,但是由于没有修改任何配置,所以使得后来的监控能够发现问题根源;

    使用开源软件,必须对默认配置保持警惕,相信应该有人以前听说过 redis 默认监听0.0.0.0来源请求的安全漏洞;

    这个项目由于开始较早,当时并没有考虑使用 Redis 云数据库,自建数据库有风险,需要慎重对待,尽可能的情况下,专业的事情,交给专业的人去做。

    展开全文
  • 限制MySQL数据库单个用户最大连接数等的方法下面我来说一下方法和原理:1、对于Linux和Uinx操作系统需要找到my.cnf,对于windows操作系统需要找到my.ini2、因为my文件是MySQL的配置文件,我们以前只知道他是对MySQL...
  • 推荐文章修改服务器内核参数,修改如下:##配置内核参数vi /etc/sysctl.conffs.file-max = 6815744kernel.sem = 250 32000 100 128kernel.shmall = 1073741824kernel..../bin/bash#设置Oracle数据库运行账号及or...
  • oracle数据库空闲连接

    2021-01-11 19:41:15
    RMAN-04006: error from auxiliary database: ORA-01034: ORACLE not available在使用rman duplicate复制standby数据库的时候,由于standby数据库实例必须处于非mount状态,所以主数据库直接连接是会报错的,需要在...
  • #当前mysql数据库可以打开的文件数目,打开一个表的动作就是打开一个文件哦,当然,和连接数也有关系,总之,只要有文件读写都算一次的。现在的值为1024+-------------------+-------+| Variable_name ...
  • 此篇通过介绍监控数据库的3306端口连接数来了解如何监控其它端口和配置自定义监控项的过程。添加监控脚本在要监控的客户端上新建脚本:/usr/local/zabbix/alertscripts/check_3306_port_num.sh内容如下:#!/bin/...
  • 大家可能会有这样疑问:连接池类似于线程池或者对象池,就是一个放连接的池子,使用的时候从里面拿一个,用完了再...同时也会介绍唯品会自研数据库连接池产品(代号:Caelus)为什么要有连接池先看一下连接池所处的位...
  • 在这里,假设你使用的数据库是 MS SQL Server 7.0 ,如果 操作系统是 NT ,那么你可以在性能监视器中监测 SQL7 的用户连接数(counter:User Connections);如果操作系统是98的话,可以使用 SQL7 的 Profiler。 下面,...
  • 1. 开篇闲谈基本上来说,大部分项目都需要跟数据库做交互,那么,...的确如此,每次看到application.properties配置数据库连接池的时候,总是想要不再搞大一点连接数。#整它个2000试试spring.datasource.hikari.min...
  • 之前遇到了连接mysql...mysql数据库系统允许的最大可连接数max_connections。这个参数是可以设置的。如果不设置,默认是100。最大是16384。数据库当前的连接线程数threads_connected。这是动态变化的。如果 threa...
  • 第14节 Python操作数据库_哔哩哔哩_bilibili666https://www.bilibili.com/video/BV1q54y147KX?from=search&seid=968950907021994347&spm_id_from=333.337.0.0 模块:pymysql 函数:connect() connect...
  • 自动连接数据库

    2021-01-28 03:24:32
    描述FineReport连接多维数据库,首先要通过数据连接将多维数据库与FineReport连接起来,然后在数据连接的基础上新建多维数据库XMLA数据集,用于模板设计。2.XMLA数据连接2.1描述多维数据库(Multi Dimensional ...
  • 代码实现:/* 建立与mongodb数据库连接,可指定参数,如:MongoClient client = new MongoClient(“localhost”,27017); */MongoClient client = new MongoClient();/* 通过listDatabaseNames()方...
  • 5.红框处输入你要新建数据库名字 6. 7.选择下面这个,密码规定要有大小写字母和数字。 8. 9. 10. 11. 12. 13.点击"完成" 14.点击"确定" 15.等待 16.可能会弹出来以下界面但是不要慌,its ok. 17....
  • Java数据库连接连接Oracle过程详解第一步:导入tomcat\lib 下的一个tomcat-dbcp.jar包第二步:在web\META-INF下新建一个context.xml文件,文件内容如下:type="javax.sql.DataSource"driverClassName="oracle.jdbc...
  • #1、原理 Druid提供了SPI机制的filter,通过添加filter拿到数据库连接池的连接的占用情况。#2、开发 ##2.1 代码import java.sql.SQLException;import java.util.HashMap;import java.util.Map;import ...
  • 上一篇构建的数据库连接池,今天拿来在项目中测试时,发现在处理高并发的问题上有很明显的缺点。现在回过头来看我们上一篇的代码:public class ConnectionPool {/*线程安全数组*/private volatile Vector pool;...
  • 什么是“数据库连接”,真的吗?它是与您的数据库的会话,因此:>存在客户端和服务器端会话状态>存在与该会话相关联的事务现在,由于您的客户端应用程序是多线程的,我怀疑只有极少数情况下您的设置才有意义,即:&...
  • 数据库连接有2种:第一种:古老的方法(较为死板,不利于灵活操作),即用OracleConnection的类来连接stringmysqlstr ="user id = xal;data source = xal;password = xal";OracleConnection mycnn = new Oracle...
  • SpringBoot笔记 —— 数据库连接

    千次阅读 2021-11-12 23:48:48
    首先写一个测试类,来看一下连接池的运行过程 package com.demo.spring.test; import org.apache.commons.dbcp2.BasicDataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java....
  • nodejs数据库连接

    2021-01-25 22:21:02
    当然也可以在新建用户这一整个操作上加锁 全局同时只能有一个用户在新建 不过这样可能效率不高 ######问题1 现实情况就是这样 用户以为他的操作有顺序 但基于连接池 算是并发操作 即时不用池 那也是异步操作 不能...
  • 数据库服务器连接超时 内容精选换一换执行以下步骤创建数据库连接:单击工具栏上的或按“Ctrl+N”连接数据库服务器,弹出“新建/选择数据库连接”对话框。建立连接时,如果首选项文件损坏或首选项值无效,会显示...
  • 两款免费、好用的数据库连接工具

    千次阅读 2021-08-06 12:25:32
    Navicat是一套快速、可靠的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。它的设计符合数据库管理员、开发人员及中小企业的需要。Navicat 是以直觉化的图形用户界面而建的,让你可以以安全并且简单...
  • 前言在写这篇文章之前,看了好几篇实现连接池...一、数据库连接池基本概念所谓的数据库连接池,一般指的就是程序和数据库保持一定数量的数据库连接不断开,并且各请求的连接可以相互复用,减少重复新建数据库连接的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 135,606
精华内容 54,242
关键字:

数据库新建连接数