本文目录一览:
- 1、PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
- 2、如何修改mysql的最大连接数
- 3、如何解决MySQL超过最大连接数问题
- 4、phpstuyd 如何设置mysql最大连接数
- 5、mysql连接客户超过几个就出现停止运行
- 6、php mysql一直连接跟每次连接都断开有区别吗
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
背景:把mysql换成mysqli时出现,连接数过多,其实际上并不是,原因是我挪动了一下php的sock文件位置导致,因这几个socket修改没有修改完全,于是出现了too
many
connections
,从mysql里show
processlist并没有发现真的有连接,其实用tshark抓下包估计能看到(),并没有发出请求,而估计是mysqli的客户端自己报出来的,别看这个问题小,搞了老半天,都想重新安装Php了,发现原来是路径写错了同时mysqli的客户端提示连接数过多的误提示导致方向走错了。如下:
[root@iZ25z0ugwgtZ
etc]#
grep
-r
"mysql.sock"
./
./php.ini:pdo_mysql.default_socket=/data/runsock/mysqlsock/mysql.sock
./php.ini:;mysql.default_socket
=
/tmp/mysql.sock
./php.ini:mysql.default_socket
=
/data/runsock/mysqlsock/mysql.sock
./php.ini:mysqli.default_socket
=
/data/runsock/mysql.sock
//这个位置被挪动到,/data/runsock/mysqlsock/mysql.sock导致。
修改后记得重启动php-fpm:
[root@iZ25z0ugwgtZ
etc]#
service
php-fpm
restart
Gracefully
shutting
down
php-fpm
.
done
Starting
php-fpm
done
______________________排查要点如下_______________________________
warning:
mysqli::real_connect():
(hy000/1040):
too
many
connections
in:
出现场景
:手动编译安装mysql,并制定安装位置,php以localhost方式连接mysql
原因分析
:手动编译安装制定位置后所有的mysql文件都在制定的目录或者data目录下面,php默认只会寻找/temp/mysql.sock找这个sock文件,所以会导致sock文件无法找到。
解决方法
:
1.给sock文件做个软链
ln
-s
/data/mysqldb/mysql.sock
/tmp/mysql.sock;
或者
2.修改php的默认mysql.sock连接地址
mysql.default_socket=/data/mysqldb/mysql.sock
3.使用tcp
socket的方式进行连接
mysql('127.0.0.1','username','passwod');
下面给大家介绍PHP
mysql_connect()
函数
定义和用法
mysql_connect()
函数打开非持久的
MySQL
连接。
语法
mysql_connect(server,user,pwd,newlink,clientflag)
参数
描述
server
可选。规定要连接的服务器。
可以包括端口号,例如
"hostname:port",或者到本地套接字的路径,例如对于
localhost
的
":/path/to/socket"。
如果
PHP
指令
mysql.default_host
未定义(默认情况),则默认值是
'localhost:3306'。
user
可选。用户名。默认值是服务器进程所有者的用户名。
pwd
可选。密码。默认值是空密码。
newlink
可选。如果用同样的参数第二次调用
mysql_connect(),将不会建立新连接,而将返回已经打开的连接标识。参数
new_link
改变此行为并使
mysql_connect()
总是打开新的连接,甚至当
mysql_connect()
曾在前面被用同样的参数调用过。
clientflag
可选。client_flags
参数可以是以下常量的组合:
MYSQL_CLIENT_SSL
-
使用
SSL
加密
MYSQL_CLIENT_COMPRESS
-
使用压缩协议
MYSQL_CLIENT_IGNORE_SPACE
-
允许函数名后的间隔
MYSQL_CLIENT_INTERACTIVE
-
允许关闭连接之前的交互超时非活动时间
返回值
如果成功,则返回一个
MySQL
连接标识,失败则返回
FALSE。
提示和注释
注释:脚本一结束,到服务器的连接就被关闭,除非之前已经明确调用
mysql_close()
关闭了。
提示:要创建一个持久连接,请使用
mysql_pconnect()
函数。
例子
?php
$con
=
mysql_connect("localhost","mysql_user","mysql_pwd");
if
(!$con)
{
die('Could
not
connect:
'
.
mysql_error());
}
//
一些代码...
mysql_close($con);
?
如何修改mysql的最大连接数
1、查看最大连接数的代码:
show variables like '%max_connections%';
2、修改最大连接数的代码:
set GLOBAL max_connections = 200;
在命令行中查看和修改 MySQL 的最大连接数,具体代码如下:
mysql -uuser -ppassword(命令行登录MySQL)
mysqlshow variables like 'max_connections';(查可以看当前的最大连接数)
msyqlset global max_connections=1000;(设置最大连接数为1000,可以再次查看是否设置成功)
mysqlexit
扩展资料
MySQL的系统特性:
1、使用 C和 C++编写,并使用了多种编译器进行测试,保证了源代码的可移植性。
2、支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。
3、为多种编程语言提供了 API。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby,.NET和 Tcl 等。
4、支持多线程,充分利用 CPU 资源。
5、优化的 SQL查询算法,有效地提高查询速度。
6、既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。
7、提供多语言支持,常见的编码如中文的 GB 2312、BIG5,日文的 Shift_JIS等都可以用作数据表名和数据列名。
8、提供 TCP/IP、ODBC 和 JDBC等多种数据库连接途径。
9、提供用于管理、检查、优化数据库操作的管理工具。
10、支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
11、支持多种存储引擎。
12、MySQL 是开源的,所以你不需要支付额外的费用。
13、MySQL 使用标准的 SQL数据语言形式。
14、MySQL 对 PHP 有很好的支持,PHP是比较流行的 Web 开发语言。
15、MySQL是可以定制的,采用了 GPL协议,你可以修改源码来开发自己的 MySQL 系统。
参考资料:百度百科-mySQL
如何解决MySQL超过最大连接数问题
遇到mysql超出最大连接数,相信不少人第一反应就是查看mysql进程,看有没有慢查询,当然这个做法是完全正确的!
但是很多时候真正的问题不在这里。
今天有遇到同样的问题,一味查看mysql进程和慢查询日志,无果。
后来老大提点了一下,查看一下nginx日志,发现有一两个访问执行时候比较长,然后使用top命令查看了一下服务器负载,惊了,居然超高!
最后发现原来有一台web分流主机挂了,导致另外几台web主机负载增高,从而导致了php-fpm的执行效率降低。
那么这跟mysql有什么关系呢?原因很简单,因为php执行时间过长,mysql连接迟迟未释放,就会导致连接数过多出现。
最后总结:其实很多时候,一个问题的根本原因并不是那么直接的呈现出来,需要自己去跟踪。
老大有一句很实用的话:遇到问题先查日志(mysql、php、nginx等)
===============================================================
排查连接数过多的方法
当用户收到链接数告警时,意味着连接数即将达到该实例的上限。如果实例的连接数超过了实例规定的连接数,将无法创建新的连接,这个时候会影响用户的业务;
Mysql 的连接通常是一个请求占用一个连接,如果该请求(update,insert,delete,select)长时间没有执行完毕,则会造成连接的堆积,迅速的消耗完数据库的连接数,这个时候技术支持人员就要登录数据库进行排序,看看到底是那些sql 占用了连接;
问题排查步骤:
1 、查看实例配置:
可登录RDS控制台“详情与配置”查看实例额定链接数,我们假设最高支持1500个链接
2、 查看当前的连接数:
1)可登录RDS控制台“性能监控”查看实例当前链接数。
2)或者登录数据库查询当前连接,可以使用同步账号或者用户的业务账号登录数据库,执行show processlist;
[root@r41d05036.xy2.aliyun.com ~]# mysql -uroot -h127.0.0.1 -P3020 -e “show processlist”|wc -l
1262
可以看到该实例已经有1262 个连接
3、排查是什么动作占用了这些连接:
[root@r41d05036.xy2.aliyun.com ~]# myql -uroot -h127.0.0.1 -P3018 -e “show full processlist”/tmp/1.log
root@r14d11038.dg.aliyun.com # more /tmp/1.log
615083 my_db 223.4.49.212:54115 my_db Query 100 Sending data
INSERT INTO tmp_orders_modify (oid, tid, seller_id, status, gmt_create, gmt_modified)
SELECT oid, tid, seller_id, status, gmt_create, gmt_modified
FROM sys_info.orders WHERE
gmt_modified NAME_CONST(‘v_last’,_binary’2012-12-24 10:33:00’ COLLATE ‘binary’) AN
D gmt_modified = NAME_CONST(‘v_curr’,_binary’2012-12-24 10:32:00’ COLLATE ‘binary’)
621564 my_db 223.4.49.212:46596 my_db Query 3890 sorting result
insert into tmp_trades(sid, d, h, tc, tm, tp, ic, new_tp, old_tp)
select a.seller_id as sid,
…………..
from orders_1 as a where seller_id =1 and is_detail = ‘1’
and created date_format(‘2012-12-24 10:35:00’, ‘%Y-%m-%d %H:00:00’)
and gmt_create date_format(‘2012-12-24 10:40:00’, ‘%Y-%m-%d %H:%i:00’)
and gmt_create = date_format(‘2012-12-24 10:35:00’, ‘%Y-%m-%d%H:%i:00’)
group by d, h
order by d
……………….此处省略其他sql
4、分析连接占用的原因:
可以看到数据库中有长时间没有执行完成的sql,一直占用着连接没有释放,而应用的请求一直持续不断的涌入数据库,这个时候数据库的连接很快就被使用完;所以这个时候需要排查为什么这些sql 为什么长时间没有执行完毕,是索引没有创建好,还是sql执行耗时严重。
第一条sql:
INSERT INTO tmp_orders_modify (oid, tid, seller_id, status, gmt_create, gmt_modified)
SELECT oid, tid, seller_id, status, gmt_create, gmt_modified
FROM sys_info.orders WHERE
gmt_modified NAME_CONST(‘v_last’,_binary’2012-12-24 10:33:00’ COLLATE ‘binary’) AN
D gmt_modified = NAME_CONST(‘v_curr’,_binary’2012-12-24 10:32:00’ COLLATE ‘binary’)
是用户从sys_info 数据库中拉取订单到自己的业务库中那个,但是在orders 表上没有gmt_modified 的索引,导致了全表扫描;(更加详尽的排查方法可以参考:为什么我的RDS慢了);
第二条sql:
看到这条sql 正在进行sorting 排序,为什么导致sql 长时间sorting,通常情况下为排序的结果集太大导致排序不能在内存中完成,需要到磁盘上排序,进而导致了性能的下降;解决的办法就是降低排序的结果集,常用的手段是利用索引的有序性,消除排序,或者建立适当的索引减小结果集;我们可以看到第二条sql 的排序字段非常的复杂,但是我们可以看到查询的时间范围是很短,只有5 分钟的时间间隔,这个时候就可以在gmt_create上创建一个索引,过滤掉大部分的记录:
Alter tale order_1 add index ind_order_gmt_create(gmt_create);
(该用户对orders 进行了分表,大概有50 多张分表需要添加gmt_create 字段的索引);
5、经过上面两步的优化后,用户实例恢复正常:io 情况和connection 情况,可再次登录RDS控制台查看连接数。
phpstuyd 如何设置mysql最大连接数
手动修改配置,windows中找到my.ini文件,linux中找到my.cnf文件,找到max_connections并修改保存,然后重启mysql服务。
windows上还可以在phpstudy的主界面,其他选项菜单-mysql工具-参数配置-max_connections-输入你想要的值,然后点击确定,会自动重启mysql服务的。
mysql连接客户超过几个就出现停止运行
一、mysqld 进程没有正常运行遇到这种情况首先到服务器上看看 mysqld 进程是否活着,采用的命令:
二、客户端不能和进程 mysqld 通信如果 MySQL 服务器上的 mysqld 进程运行正常,我们再看看客户端能不能和 mysqld 进行通信,使用下面的命令进行网络连通的测试:telnet localhost 3306
如果本地能通,再到客户端的机器上把 localhost 换成 MySQL 服务器的 ip 地址进行测试。如果不能通,通常有两种原因,一种原因是 OS 或网络的问题,或者是防火墙;另一种原因是 mysqld 自身根本没有侦听客户端的连接请求, mysqld 启动后对于客户端的侦听是分三种情况。
第一种情况
是使用参数 --skip-networking 跳过侦听客户端的网络连接,用下面的命令我们可以看到 MySQL 根本没有侦听 3306 端口。
第二种情况
使用参数 --bind-address 后面增加对客户端访问 IP 地址的限制,例如只侦听本地的连接
三、账户密码的问题最后一种情况是账户密码的问题,应付这种情况我们有个有力的工具就是查看 MySQL 的 error log, error log 记载信息的详细程度上由参数 --log-error-verbosity 进行控制的
php mysql一直连接跟每次连接都断开有区别吗
一直连接属于长连接,网站加入并发请求数会很多,如果是一个长连接的话,你的网站加入并发请求数很多,也就是说同时有很多人来访问你的网站,并且每个访问者都需要查询一次mysql数据库的话,会很快把你的系统资源消耗完了。
每次连接都属于短链接,短链接就没有这个问题,每次查询完就马上关闭了,这样不容易消耗过多的系统资源。但是长连接也有个好处就是,频繁查询的时候,可以节省了多次建立TCP连接的时间