首頁 > 軟體

mongodb清除連線和紀錄檔的正確方法分享

2021-09-14 13:00:13

前言

最近在做並行,伺服器卡死了。

感覺是pymongo未能完全close掉和mongodb建立的tcp連線,並且在mongo連線未自動釋放前進行高頻連線,導致連線數爆滿造成的。

所以對建立的連線進行清除,以此記錄並做分享。

檢視MongoDB的連線資訊

db.serverStatus().connections

current 當前連線數

available 可用連線數

connection.totalCreated 建立到伺服器的所有傳入連線的計數。此數位包括已關閉的連線。

清除所有當前的currentOp:

var ops = db.currentOp().inprog;
for(i = 0; i < ops.length; i++){
        var opid = ops[i].opid;
        db.killOp(opid);
        print("Stopping op ... #"+opid)
};

上面的命令無法關閉current連線

關閉current的方法一:

檢視所有current的tcp連線:

netstat -nat | grep ‘27017'

檢視指定埠的程序號

netstat -tpna | grep :35522

然後kill掉該程序

kill -9 14335

再到db-shell中檢視,已經關閉一個current了。

這種方式關掉的tcp連線狀態會變成TIME_WAIT,埠依舊被佔用,因為ACK是由我們主動關閉發出的。

不過還好的是一般等一段時間連結自動會被釋放,埠也不再被佔用了。

可以看到35522和35524都已經被釋放。

關閉current的方法二:

如果你知道是由哪個程式連線的mongodb,比如python程式

那麼可以使用命令檢視程式埠佔用情況

ps -aux | grep python

然後kill掉對應的python程式,run.py,也能完成current的清除

批次清除指定程式:

ps -efww|grep -w "run.py" |grep -v grep|cut -c 9-15|xargs kill -9

紀錄檔

檢視紀錄檔位置

cat /etc/mongod.conf

紀錄檔檔案過大,不能通過vim檢視,用tail檢視最後100行

tail -n 100 mongo.log

不需要重啟服務,重新開啟一個新紀錄檔檔案的方法

use admin
db.runCommand({logRotate:1})

執行過程中不能刪除紀錄檔檔案,清空紀錄檔檔案但不刪除檔案的命令(刪除後沒有生成紀錄檔)

: >run.log

也可以使用旋轉紀錄檔 logRotate :對紀錄檔進行切割

去重script

db.getCollection('集合名').aggregate([{$group:{_id:{'去重欄位':'$去重欄位'}, count:{$sum:1}, dups:{$addToSet: '$_id'}}},{$match:{count:{$gt:1}}}] ,{ allowDiskUse: true }).forEach(function(doc){doc.dups.shift();db.getCollection('集合名').remove({_id: {$in: doc.dups}});})

匯出資料

mongoexport -h localhost:27017 -u 使用者名稱 -p 密碼 -d 庫名 -c 集合名 -o 匯出檔案路徑

總結

到此這篇關於mongodb清除連線和紀錄檔的文章就介紹到這了,更多相關mongodb清除連線和紀錄檔內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com