在mongodb的啟動時,在數據目錄下,會生成一個mongod.lock文件。如果在正常退出時,會清除這個mongod.lock文件,若要是異常退出,在下次啟動的時候,會禁止啟動,從而保留一份干凈的一份副本數據。有人可能會想到刪除這個文件,
建議請不要這么做。如果這么做,我們也不知道數據文件是否會損壞,如果mongod.lock文件阻止mongod的啟動,請對數據文件進行修復,而不是簡單的刪除該文件。而這里的mongod.lock文件存放的是:啟動mongod的進程號.
這里提到了"正常退出",詳細介紹如下:
MongoDB 提供幾種關閉服務的命令,具體為以下:
一 使用 Crtl+C 關閉
[mongo@redhatB data]$ mongod --dbpath=/database/mongodb/data/ --logpath=/var/applog/mongo_log/mongo.log --logappend --port=27017 --journal > start_mongo.log 2>&1 光標:鍵入 Crtl+C 關閉 |
備注:如果以前台方式啟動 MongoDB 服務,使用“Crtl+C” 服務會關閉,這種關閉方式會等待
當前進行中的的操作完成,所以依然是干凈的關閉方式。
二 使用數據庫命令關閉
--2.1 開啟服務
[mongo@redhatB data]$ mongod -f /database/mongodb/data/mongodb_27017.conf forked process: 18155 all output going to: /var/applog/mongo_log/mongo.log child process started successfully, parent exiting |
--2.2 登陸數據庫
[mongo@redhatB data]$ mongo MongoDB shell version: 2.2.1 connecting to: test |
--2.3 關閉 MongoDB 服務
> use admin; switched to db admin > db.shutdownServer(); |
三 使用 mongod 命令關閉
[mongo@redhatB data]$ mongod --shutdown --dbpath /database/mongodb/data/ killing process with pid: 17747 |
備注:mongod 命令的 shutdown 選項能干凈的關閉 MongoDB 服務。
四 使用 kill 命令
--4.1 查看 mongo 相關進程
[mongo@redhatB data]$ ps -ef | grep mongo root 17573 14213 0 05:10 pts/1 00:00:00 su - mongo mongo 17574 17573 0 05:10 pts/1 00:00:00 -bash mongo 18288 1 0 06:12 ? 00:00:00 mongod -f /database/mongodb/data/mongodb_27017.conf mongo 18300 17574 6 06:13 pts/1 00:00:00 ps -ef mongo 18301 17574 0 06:13 pts/1 00:00:00 grep mongo |
--4.2 kill mongo 服務進程
[mongo@redhatB data]$ kill 18288 [mongo@redhatB data]$ ps -ef | grep pmon |
備注:可以使用操作系統的 kill 命令,給 mongod 進程發送 SIGINT 或 SIGTERM 信號,
即 "kill -2 PID," 或者 “kill -15 PID“。
建議不要使用 ”kill -9 pid“,因為如果 MongoDB 運行在沒開啟日志(--journal)的情況下,
可能會造成數據損失。
在mongo庫中,oplog是數據存放和數據主從同步的,而在本地庫local中,$ show collections 下,有個oplog.rs 的collection,解釋下其中的字段:
{ ts : ..., op: ..., ns: ..., o: ... o2: ... }
上面就是一條oplog信息,復制機制就是通過這些信息來進行節點間的數據同步並維護數據一致性的,其中:
這個值很重要,在選舉(如master宕機時)新primary時,會選擇ts最大的那個secondary作為新primary。
op:1字節的操作類型,例如i表示insert,d表示delete。
ns:操作所在的namespace。
o:操作所對應的document,即當前操作的內容(比如更新操作時要更新的的字段和值)
o2: 在執行更新操作時的where條件,僅限於update時才有該屬性
其中op,可以是如下幾種情形之一:
"u": update
"d": delete
"c": db cmd
"db":聲明當前數據庫 (其中ns 被設置成為=>數據庫名稱+ '.')
"n": no op,即空操作,其會定期執行以確保時效性