phpmysql連接數過多(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-tw/n/254759.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-15 12:13
下一篇 2024-12-15 12:13

相關推薦

  • 如何修改mysql的埠號

    本文將介紹如何修改mysql的埠號,方便開發者根據實際需求配置對應埠號。 一、為什麼需要修改mysql埠號 默認情況下,mysql使用的埠號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL資料庫 在使用Python操作MySQL之前,我們需要先連接MySQL資料庫。在Python中,我…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • MySQL左連接索引不生效問題解決

    在MySQL資料庫中,經常會使用左連接查詢操作,但是左連接查詢中索引不生效的情況也比較常見。本文將從多個方面探討MySQL左連接索引不生效問題,並給出相應的解決方法。 一、索引的作…

    編程 2025-04-28
  • 使用Python查找列表中的最大元素

    在Python中,有時候我們需要在一個列表中查找最大的元素。本文將詳細討論如何使用Python查找列表中的最大元素。 1、使用max()函數查找列表中最大元素 Python自帶的m…

    編程 2025-04-27
  • CentOS 7在線安裝MySQL 8

    在本文中,我們將介紹如何在CentOS 7操作系統中在線安裝MySQL 8。我們會從安裝環境的準備開始,到安裝MySQL 8的過程進行詳細的闡述。 一、環境準備 在進行MySQL …

    編程 2025-04-27
  • 最大匹配演算法Python代碼

    本文主要介紹最大匹配演算法Python代碼,該演算法是一種基本的中文分詞方法,適用於處理中文文本中的詞語分割問題。 一、演算法原理 最大匹配演算法是一種基於詞典的中文分詞演算法,其本質是一個…

    編程 2025-04-27
  • 如何使用MySQL欄位去重

    本文將從多個方面為您詳細介紹如何使用MySQL欄位去重並給出相應的代碼示例。 一、SELECT DISTINCT語句去重 MySQL提供了SELECT DISTINCT語句,通過在…

    編程 2025-04-27
  • MySQL正則表達式替換

    MySQL正則表達式替換是指通過正則表達式對MySQL中的字元串進行替換。在文本處理方面,正則表達式是一種強大的工具,可以方便快捷地進行字元串處理和匹配。在MySQL中,可以使用正…

    編程 2025-04-27

發表回復

登錄後才能評論