本文目錄一覽:
- 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連接的時間
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/254759.html