資料庫連線數過多,頁面打不開

2021-08-27 17:35:41 字數 2799 閱讀 6695

當使用者收到鏈結數告警時,意味著連線數即將達到該例項的上限。如果例項的連線數超過了例項規定的連線數,將無法建立新的連線,這個時候會影響使用者的業務;

mysql 的連線通常是乙個請求占用乙個連線,如果該請求(update,insert,delete,select)長時間沒有執行完畢,則會造成連線的堆積,迅速的消耗完資料庫的連線數,這個時候技術支援人員就要登入資料庫進行排序,看看到底是那些sql 占用了連線;

問題排查步驟:

1 、檢視例項配置:

可登入rds控制台「詳情與配置」檢視例項額定鏈結數,我們假設最高支援1500個鏈結

2、 檢視當前的連線數:

1)可登入rds控制台「效能監控」檢視例項當前鏈結數。

2)或者登入資料庫查詢當前連線,可以使用同步帳號或者使用者的業務帳號登入資料庫,執行show processlist;

# mysql -uroot -h127.0.0.1 -p3020 -e "show processlist"|wc -l

1262

可以看到該例項已經有1262 個連線

3、排查是什麼動作占用了這些連線:

# myql -uroot -h127.0.0.1 -p3018 -e "show full processlist">/tmp/1.log

[email protected] # 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控制台檢視連線數。

Sybase資料庫連線數過多問題

我們的開發團隊增加到10多人後,由於共享乙個資料庫,導致先連線上的能連上,後連線上的就連線不上了,經過上網搜尋相關資料,由於 sybase 預設的連線數只有 20個,需要設定多一些連線數,在 sybase 資料庫設定中選擇 number of remote connections 和 number ...

連線資料庫

2 documents 目錄就是我們可以用來寫入並儲存檔案得地方,一般可通過 nsarray paths nssearchpathfordirectoriesindomains nsdocumentdirectory,nsuserdomainmask,yes nsstring documentsdi...

連線資料庫

1 oracle8 8i 9i資料庫 thin模式 class.forname oracle.jdbc.driver.oracledriver newinstance string url jdbc oracle thin localhost 1521 orcl orcl為資料庫的sid strin...