主頁 > 網(wǎng)站建設(shè) > 建站知識 > mysql查看最大連接數(shù)和修改mysql數(shù)據(jù)庫最大連接數(shù)

mysql查看最大連接數(shù)和修改mysql數(shù)據(jù)庫最大連接數(shù)

POST TIME:2017-11-13 00:19

怎么查看 MySQL最大連接數(shù)

使用 MySQL 數(shù)據(jù)庫的站點(diǎn),當(dāng)訪問連接數(shù)過多時(shí),就會(huì)出現(xiàn) "Too many connections" 的錯(cuò)誤。出現(xiàn)這種錯(cuò)誤有兩種情況,一種是網(wǎng)站訪問量實(shí)在太大,服務(wù)器已經(jīng)負(fù)擔(dān)不起,此時(shí)就應(yīng)該考慮負(fù)載均衡或者其它減少服務(wù)器壓力的辦法。另一種情況就是 MySQL 的最大連接數(shù)設(shè)置得太小,當(dāng)訪問量稍大就出現(xiàn)連接過多的錯(cuò)誤。win7下配置PHP+Apache+Mysql運(yùn)行環(huán)境

MySQL 默認(rèn)的最大連接數(shù)為 100,可以在 mysql 客戶端使用以下命令查看


mysql> show variables like 'max_connections';

此命令將得到類似以下的輸出結(jié)果:


+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 2000 |
+-----------------+-------+
1 row in set (0.00 sec)

  要對 mysql 的最大連接數(shù)進(jìn)行修改,只需要在 my.cnf 配置文件里面修改 max_connections 的值,然后重啟 mysql 就行。如果 my.ini 文件中沒有找到 max_connections 條目,可自行添加以下條目

max_connections = 200

修改MySQL最大連接數(shù)

方法一:
02
03進(jìn)入MySQL安裝目錄打開MySQL配置文件my.ini或my.cnf查找max_connections=100修改為max_connections=1000服務(wù)里重起MySQL即可
04
05方法二:
06
07MySQL最大連接數(shù)默認(rèn)是100客戶端登錄:
08
09MySQL-uusername-ppassword
10
11設(shè)置新的MySQL最大連接數(shù)為200:
12
13MySQL>setGLOBALmax_connections=200
14
15顯示當(dāng)前運(yùn)行的Query:
16
17MySQL>showprocesslist
18
19顯示當(dāng)前狀態(tài):
20
21MySQL>showstatus
22
23退出客戶端:MySQL>exit
24
25查看當(dāng)前MySQL最大連接數(shù):MySQLadmin-uusername-ppasswordvariables
26
27方法三:
28
29以centos4.4下面的MySQL5.0.33手工編譯版本為例說明:
30
31vi/usr/local/MySQL/bin/MySQLd_safe
32
33找到safe_MySQLd編輯它,找到MySQLd啟動(dòng)的那兩行,在后面加上參數(shù):
34
35-Omax_connections=1500
36
37具體一點(diǎn)就是下面的位置:
38
39用紅字特別說明:
40
41then$NOHUP_NICENESS$ledir/$MySQLD
42$defaults--basedir=$MY_BASEDIR_VERSION
43--datadir=$DATADIR$USER_OPTION
44--pid-file=$pid_file
45--skip-external-locking
46-Omax_connections=1500
47>>$err_log2>&1else
48eval"$NOHUP_NICENESS$ledir/$MySQLD
49$defaults--basedir=$MY_BASEDIR_VERSION
50--datadir=$DATADIR$USER_OPTION
51--pid-file=$pid_file
52--skip-external-locking$args
53-Omax_connections=1500>>
54$err_log2>&1"
55
56保存。
57
58#serviceMySQLdrestart
59#/usr/local/MySQL/bin/MySQLadmin-uroot-pvariables
60
61輸入root數(shù)據(jù)庫賬號的密碼后可看到
62
63max_connections1500即新改動(dòng)已經(jīng)生效。
64
65還有一種方法,
66
67修改原代碼:
68
69解開MySQL的原代碼,進(jìn)入里面的sql目錄修改MySQLd.cc找到下面一行:
70
71{"max_connections",OPT_MAX_CONNECTIONS,
72"Thenumberofsimultaneousclientsallowed.",(gptr*)&max_connections,
73(gptr*)&max_connections,0,GET_ULONG,REQUIRED_ARG,100,1,16384,0,1,
740},
75
76把它改為:
77
78{"max_connections",OPT_MAX_CONNECTIONS,
79"Thenumberofsimultaneousclientsallowed.",(gptr*)&max_connections,
80(gptr*)&max_connections,0,GET_ULONG,REQUIRED_ARG,1500,1,16384,0,1,
810},
82
83存盤退出,然后./configure;make;makeinstall可以獲得同樣的效果。以上的相關(guān)內(nèi)容就是對修改MySQL最大連接數(shù)的3種方法的介紹,望你能有所收獲。

MySQL服務(wù)器最大連接數(shù)相關(guān)知識

最近網(wǎng)站出現(xiàn) User 數(shù)據(jù)庫名稱 has already more than 'max_user_connections' active connections 的報(bào)錯(cuò),網(wǎng)站癱瘓。有必要研究下這個(gè)問題。

max_user_connections 是 MySQL 用戶連接數(shù)的最大值設(shè)置,整段語句的意思是:服務(wù)器的 MySQL 的最大連接數(shù)參數(shù)設(shè)置不足。解決方法:修改 MySQL 安裝目錄下 my.ini 或者 my.cnf 文件內(nèi)的 max_user_connections 參數(shù)的數(shù)值,重啟 MySQL 服務(wù)器。

但是正常來說,MySQL默認(rèn)的100個(gè)連接數(shù)是足夠的。我們需要從程序上去考慮。MySQL的默認(rèn)最大連接數(shù)為100(N),實(shí)際給普通用戶使用只有N-1個(gè),保留一個(gè)連接是留給超級管理員使用的,防止連接占滿了不會(huì)把管理員也踢出來。很多網(wǎng)站在運(yùn)行的時(shí)候都會(huì)出現(xiàn)連接數(shù)受限現(xiàn)象,我認(rèn)為十之八九并非是網(wǎng)站的真實(shí)訪問量太大導(dǎo)致連接數(shù)超標(biāo),更多是因?yàn)槲覀冊谠O(shè)計(jì)網(wǎng)站程序的時(shí)候采用了不合理的設(shè)計(jì)架構(gòu)或數(shù)據(jù)結(jié)構(gòu)引起的。非正常連接超限可能原因如下(天緣即時(shí)歸納未必完整或無錯(cuò)訛僅供參考):

  1. 類似人數(shù)、在線時(shí)間、瀏覽數(shù)等統(tǒng)計(jì)功能與主程序數(shù)據(jù)庫同屬一個(gè)數(shù)據(jù)空間時(shí)就很容易出現(xiàn)。

  2. 復(fù)雜的動(dòng)態(tài)頁尤其是用戶每次瀏覽都涉及到多數(shù)據(jù)庫或多表操作時(shí)候也很容易出現(xiàn)。

  3. 還有就是程序設(shè)計(jì)的不合理(比如復(fù)雜運(yùn)算、等待等操作放置在數(shù)據(jù)庫交互行為中間進(jìn)行),或者程序存在釋放BUG。

  4. 計(jì)算機(jī)硬件配置太低卻安裝太高版、太高配置的MySQL。

  5. 未采用緩存技術(shù)。

  6. 數(shù)據(jù)庫未經(jīng)過優(yōu)化或表格設(shè)計(jì)及其復(fù)雜。

等等一些原因,都會(huì)延長數(shù)據(jù)庫的數(shù)據(jù)交互時(shí)間或增加交互次數(shù)。所以,如果大家遇到這類問題,首先要考慮程序是否存在BUG導(dǎo)致連接釋放失敗,再次就是考慮優(yōu)化軟硬件。當(dāng)然修改MySQL連接數(shù)也是軟件優(yōu)化的操作方法之一,希望大家都能夠本著學(xué)習(xí)的態(tài)度通過研究一下自身的原因從而解決這一問題。如果實(shí)在是找不到原因,那就只好先修改連接數(shù),暫緩定位真實(shí)原因了。

關(guān)于PHP的數(shù)據(jù)庫持久連接 mysql_pconnect

PHP程序員應(yīng)該都知道連接MySQL數(shù)據(jù)庫可以使用mysql_pconnect(永久連接)函數(shù),使用數(shù)據(jù)庫永久連接可以提高效率,但是實(shí)際應(yīng)用中數(shù)據(jù)庫永久連接往往會(huì)導(dǎo)致出現(xiàn)一些問題,通常的表現(xiàn)就是在大訪問量的網(wǎng)站上時(shí)常發(fā)生斷斷續(xù)續(xù)的無法連接數(shù)據(jù)庫的情況,出現(xiàn)類似"Too many connections in ..."的錯(cuò)誤提示信息,重新啟動(dòng)服務(wù)器又正常了,但過不了一會(huì)兒又出現(xiàn)同樣的故障。對于這些問題的成因,恐怕就不是每個(gè)人都能說清楚的了,雖然PHP文檔里有一些相關(guān)資料,但是解釋的并不淺顯易懂,這里我厚著臉皮試圖做一個(gè)簡單的討論,所述觀點(diǎn)不見得全都正確,歡迎大家反饋意見。

首先看看數(shù)據(jù)庫永久連接的定義:永久的數(shù)據(jù)庫連接是指在腳本結(jié)束運(yùn)行時(shí)不關(guān)閉的連接。當(dāng)收到一個(gè)永久連接的請求時(shí)。PHP 將檢查是否已經(jīng)存在一個(gè)(前面已經(jīng)開啟的)相同的永久連接。如果存在,將直接使用這個(gè)連接;如果不存在,則建立一個(gè)新的連接。所謂"相同"的連接是指用相同的用戶名和密碼到相同主機(jī)的連接。

PHP使用永久連接方式操作MySQL是有前提的:就是PHP必須安裝為多線程或多進(jìn)程Web服務(wù)器的插件或模塊。最常見的形式是把PHP用作多進(jìn)程Apache服務(wù)器的一個(gè)模塊。對于一個(gè)多進(jìn)程的服務(wù)器,其典型特征是有一個(gè)父進(jìn)程和一組子進(jìn)程協(xié)調(diào)運(yùn)行,其中實(shí)際生成Web頁面的是子進(jìn)程。每當(dāng)客戶端向父進(jìn)程提出請求時(shí),該請求會(huì)被傳遞給還沒有被其它的客戶端請求占用的子進(jìn)程。這也就是說當(dāng)相同的客戶端第二次向服務(wù)端提出請求時(shí),它將有可能被一個(gè)不同的子進(jìn)程來處理。在開啟了一個(gè)永久連接后,所有不同子進(jìn)程請求SQL服務(wù)的后繼頁面都能夠重新使用這個(gè)已經(jīng)建立的 SQL服務(wù)器連接。它使得每個(gè)子進(jìn)程在其生命周期中只做一次連接操作,而非每次在處理一個(gè)頁面時(shí)都要向 SQL 服務(wù)器提出連接請求。每個(gè)子進(jìn)程將對服務(wù)器建立各自獨(dú)立的永久連接。PHP本身并沒有數(shù)據(jù)庫連接池的概念,但是Apache有進(jìn)程池的概念, 一個(gè)Apache子進(jìn)程結(jié)束后會(huì)被放回進(jìn)程池, 這也就使得用mysql_pconnect打開的的那個(gè)mysql連接資源可以不被釋放,而是依附在相應(yīng)的Apache子進(jìn)程上保存到了進(jìn)程池中。于是在下一個(gè)連接請求時(shí)它就可以被復(fù)用。一切看起來似乎都很正常,但是在Apache并發(fā)訪問量大的時(shí)候,如果使用mysql_pconnect,會(huì)由于之前的Apache子進(jìn)程占用的MySQL連接沒有close, 很快使MySQL達(dá)到最大連接數(shù),使得之后的請求可能得不到響應(yīng)。

上面的部分文字是摘抄自PHP文檔,看起來可能還是有些文縐縐的不好理解,那么我就用大白話再舉一個(gè)例子來說明問題:

假設(shè)Apache配置最大連接數(shù)為1000,MySQL配置最大連接數(shù)為100,當(dāng)Apache服務(wù)器接到200個(gè)并發(fā)訪問的時(shí)候,其中100個(gè)涉及到數(shù)據(jù)庫訪問,剩下的100個(gè)不涉及數(shù)據(jù)庫訪問,因?yàn)檫@個(gè)時(shí)候還不存在可用的數(shù)據(jù)庫連接,所以這里面涉及到數(shù)據(jù)庫訪問的100個(gè)并發(fā)會(huì)同時(shí)產(chǎn)生100個(gè)數(shù)據(jù)庫永久連接,達(dá)到了數(shù)據(jù)庫最大連接數(shù),當(dāng)這些操作沒有結(jié)束的時(shí)候,任何其他的連接都無法再獲得數(shù)據(jù)庫連接,當(dāng)這些操作結(jié)束了,相應(yīng)的連接會(huì)被放入進(jìn)程池,此時(shí)Apache的進(jìn)程池里就有了200個(gè)空閑的子進(jìn)程,其中100個(gè)是帶有數(shù)據(jù)庫連接的,由于Apache會(huì)為訪問請求隨機(jī)的挑選空閑子進(jìn)程,所以你得到的子進(jìn)程很可能是不包含數(shù)據(jù)庫連接的那100個(gè)中的一個(gè),而數(shù)據(jù)庫連接已經(jīng)達(dá)到了最大值,你也不可能成功的建立新的數(shù)據(jù)庫連接,唉,你便只好不停的刷新頁面,哪個(gè)時(shí)候運(yùn)氣好,碰巧分配到了帶有數(shù)據(jù)庫連接的子進(jìn)程,才能正常瀏覽頁面。如果是大訪問量的網(wǎng)站來說,任何時(shí)候都可能存在大量的并發(fā),所以瀏覽者可能就會(huì)不停的發(fā)現(xiàn)無法連接數(shù)據(jù)庫的現(xiàn)象了。

或許你會(huì)說,我們把Apache和MySQL的最大連接數(shù)調(diào)成一樣大不就可以了么?是的,合理的調(diào)整這個(gè)最大連接數(shù)某種程度上會(huì)避免這個(gè)問題的發(fā)生,但是Apache和MySQL的負(fù)載能力是不同的,如果按照Apache的負(fù)載能力來設(shè)置,對于MySQL來說,這個(gè)最大連接數(shù)就偏大,會(huì)產(chǎn)生大量的MySQL數(shù)據(jù)庫永久連接,打個(gè)比方,就好像和平時(shí)代還要養(yǎng)活一個(gè)幾百萬的軍隊(duì)一樣,其開銷得不償失;而如果按照Mysql的負(fù)載能力設(shè)置,對于Apache來說,這個(gè)最大連接數(shù)就偏小,有點(diǎn)殺雞牛刀的感覺,無法發(fā)揮Apache的最大效率。

所以按照PHP手冊上的介紹,只適合在并發(fā)訪問不大的網(wǎng)站上使用數(shù)據(jù)庫永久連接,但對于一個(gè)并發(fā)訪問不大的網(wǎng)站來說,使用數(shù)據(jù)庫永久連接帶來的效率提高似乎沒有太大的意義,從這個(gè)角度上來看,我覺得PHP中的數(shù)據(jù)庫永久連接基本上是一個(gè)雞肋的角色,如果你一定要使用數(shù)據(jù)庫連接池的概念,可以嘗試一下sqlrelay或者Apache本身提供的mod_dbd,說不定會(huì)有驚喜。

關(guān)于mysql_free_result和mysql_close

之前用mysql的時(shí)候一直是在用短鏈接,調(diào)用mysql_store_result獲取一次數(shù)據(jù)之后就直接調(diào)用:

1mysql_free_result(m_result);
2mysql_close(m_Database);

但是有兩個(gè)問題:

  1. 當(dāng)使用長連接時(shí)(即connect之后一直不close),如果最后會(huì)調(diào)用mysql_close,需不需要每次都調(diào)用mysql_free_result呢?

  2. 當(dāng)mysql_close調(diào)用之后,m_result的數(shù)據(jù)是否還可以用。

先說一下結(jié)論:

  1. 必須每次調(diào)用。因?yàn)榻?jīng)過測試,每次mysql_store_result的指針都是不同的,可見并不是共享了同一塊buf。

  2. 還是可以使用。經(jīng)過valgrind掃描,只調(diào)用mysql_close的掃描結(jié)果是:

1==9397== 16,468 (88 direct, 16,380 indirect) bytes in 1 blocks are definitely lost in loss record 4 of 5
2==9397== at 0x40219B3: malloc (vg_replace_malloc.c:195)
3==9397== by 0x8053EA2: my_malloc (in /data/home/dantezhu/appbase/application/platform/openqqcom/share/db_openright/test/test)
4==9397== by 0x806D314: mysql_store_result (in /data/home/dantezhu/appbase/application/platform/openqqcom/share/db_openright/test/test)
5==9397== by 0x804BB04: CMySQLCppClient::Result(st_mysql_res*&) (mysql_cpp_client.cpp:127)
6==9397== by 0x804AB58: CDBOpenRight::GetUinsByApp(unsigned int, std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> >&) (db_openright.cpp:58)
7==9397== by 0x8049F10: main (test.cpp:27)


相關(guān)文章推薦:

1.dedecms搬家遠(yuǎn)程附件 DedeTag Engine Create File False等N多問題

2.php連接mssql的方法 怎樣實(shí)現(xiàn)php連接mssql

3.mysql group by分組取每組前幾條記錄加order by排序

4.php+mysql實(shí)現(xiàn)無限級分類



收縮
  • 微信客服
  • 微信二維碼
  • 電話咨詢

  • 400-1100-266