最近的一個(gè)物聯(lián)網(wǎng)短連接的項(xiàng)目,用的是twisted+pymysql寫的,在程序運(yùn)行的過程中會(huì)出現(xiàn)如題錯(cuò)誤:too many connections
為此各種百度找到的解決辦法,并且摘錄下來以防丟失。轉(zhuǎn)自:https://blog.csdn.net/qq_31454017/article/details/71108278
1.登錄數(shù)據(jù)庫
mysql -u root -p
回車輸入密碼進(jìn)入mysql
2.查看當(dāng)前連接數(shù)
show processlist;
查看連接數(shù),可以發(fā)現(xiàn)有很多連接處于sleep狀態(tài)
這些其實(shí)是暫時(shí)沒有用的凑队,所以可以kill掉
3.查看最大連接數(shù)
show variables like "max_connections";
查看最大連接數(shù)
應(yīng)該是與上面查詢到的連接數(shù)相同
才會(huì)出現(xiàn)too many connections的情況
4.修改最大連接數(shù)目
set GLOBAL max_connections=1000;
修改最大連接數(shù)昭躺,
但是這不是一勞永逸的方法忌锯,
應(yīng)該要讓它自動(dòng)殺死那些sleep的進(jìn)程。
5.修改空閑超時(shí)時(shí)間
show global variables like 'wait_timeout'
這個(gè)數(shù)值指的是mysql
在關(guān)閉一個(gè)非交互的連接之前要等待的秒數(shù)领炫,
默認(rèn)是28800s
6.修改等待超時(shí)時(shí)間
set global wait_timeout=300;
修改這個(gè)數(shù)值
這里可以隨意
最好控制在幾分鐘內(nèi)
7.修改連接持續(xù)時(shí)間
set global interactive_timeout=500;
修改這個(gè)數(shù)值
表示mysql在關(guān)閉一個(gè)連接之前要等待的秒數(shù)
至此可以讓mysql自動(dòng)關(guān)閉那些沒用的連接
但要注意的是
正在使用的連接到了時(shí)間也會(huì)被關(guān)閉
因此這個(gè)時(shí)間值要合適
8.批量kill之前沒用的sleep連接偶垮,在網(wǎng)上搜索的方法對(duì)我都不奏效,因此只好使用最笨的辦法帝洪,一個(gè)一個(gè)kill
1.select concat('KILL ',id,';') from information_schema.processlist where user='root'; 先把要kill的連接id都查詢出來
2.復(fù)制中間的kill id;內(nèi)容到word文檔
3.替換掉符號(hào)“|”和回車符(在word中查詢^p即可查詢到回車符)
4.把修改過的內(nèi)容復(fù)制回終端似舵,最后按回車執(zhí)行!
9.以上辦法葱峡,雖然可以解決問題砚哗,但是設(shè)備重啟之后,原來設(shè)置的內(nèi)容也會(huì)丟失砰奕。下面介紹一個(gè)永久更改設(shè)置的辦法蛛芥。
1、進(jìn)入目錄 /etc/mysql/mysql.conf.d军援,找到配置文件 mysqld.cnf仅淑;
2、sudo vim mysqld.cnf胸哥,在 [mysqld] 中修改 max_connections 為5000漓糙;
3、重啟服務(wù)器 sudo service mysql restart烘嘱;
但是這樣修改后默認(rèn)最大是214昆禽,所以還要繼續(xù)修改。
4蝇庭、進(jìn)入目錄 /etc/systemd/system/multi-user.target.wants醉鳖,找到文件mysql.service;
5哮内、sudo vim mysql.service盗棵,在 [Service] 最后加入:
LimitNOFILE=65535
LimitNPROC=65535
6、執(zhí)行下面命令使修改生效:
systemctl daemon-reload
systemctl restart mysql.service
7北发、登錄mysql纹因,使用 show variables like "%max_connections%"; 查看最大連接數(shù),這時(shí)發(fā)現(xiàn)已經(jīng)改成5000琳拨。