mongodb數(shù)據(jù)管理
數(shù)據(jù)的導(dǎo)出、數(shù)據(jù)導(dǎo)入
數(shù)據(jù)導(dǎo)出 mongoexport [使用mongoexport -h查看參數(shù)]
數(shù)據(jù)導(dǎo)入 mongoimport [使用mongoimport -h查看參數(shù)]
導(dǎo)入導(dǎo)出json數(shù)據(jù)實(shí)例
mongoexport -d mydb -c user -o d:/mongdbback/user.dat--mydb是要導(dǎo)出的表所屬的數(shù)據(jù)庫--user是要導(dǎo)出的集合名c表示collection--user.dat是導(dǎo)出后的文件名mongoimport -d mydb -c user d:/mongdbback/user.dat--mydb 數(shù)據(jù)導(dǎo)入的目標(biāo)數(shù)據(jù)庫--user 數(shù)據(jù)導(dǎo)入的目標(biāo)集合--d:/mongdbback/user.dat 待導(dǎo)入的數(shù)據(jù)文件存放路徑
導(dǎo)入導(dǎo)出csv數(shù)據(jù)
CSV格式良好,主流數(shù)據(jù)庫都支持導(dǎo)出為csv的格式,所以這種格式非常利于異構(gòu)數(shù)據(jù)遷移.
mongoexport -d mydb -c user --csv -f id,name,age -o d:/mongodbback/user_csv.data--導(dǎo)出csv格式--f 指定要導(dǎo)出的列的名字mongoimport -d mydb -c user --type csv --headerline --file d:/mongodbback/user_csv.data;--mydb 數(shù)據(jù)導(dǎo)入的目標(biāo)數(shù)據(jù)庫--user 數(shù)據(jù)導(dǎo)入的目標(biāo)集合--type表示導(dǎo)入的文件格式--headerline 表明不導(dǎo)入第一行,因?yàn)榈谝恍惺橇忻?-d:/mongodbback/user_cvs.data 待導(dǎo)入的數(shù)據(jù)文件存放路徑
數(shù)據(jù)備份、數(shù)據(jù)恢復(fù)
數(shù)據(jù)備份mongodump
數(shù)據(jù)恢復(fù)mongorestore
備份實(shí)例mongodump -d mydb //備份mydb數(shù)據(jù)庫此時會在當(dāng)前目錄下默認(rèn)創(chuàng)建一個dump目錄,用于存放備份出來的文件,也可以指定備份存放的目錄使用-omongodump -d mydb -o d:/databack/恢復(fù)實(shí)例mongorestore -d mydb d:/databack/mydb/數(shù)據(jù)備份是為了發(fā)生災(zāi)難事件后可以恢復(fù)數(shù)據(jù),但是不幸總是存在的,即沒有數(shù)據(jù)備份,好在MongoDB內(nèi)建了修復(fù)功能.可以嘗試修復(fù)受損文件,如果Mongdb不正常關(guān)閉,啟動服務(wù)時會看到一堆警告信息.修復(fù)所有數(shù)據(jù)最簡單的方法就是在mongod啟動時加上--repaire參數(shù).修復(fù)單個數(shù)據(jù)庫可以再mongodb的shell里邊執(zhí)行repaireDatabase命令,如>use testswitched to db test>db.repaireDatabase();{“ok” : 1}
克隆collection
克隆collection是將一組數(shù)據(jù)從一個數(shù)據(jù)源拷貝到多個數(shù)據(jù)源的技術(shù),是將一份數(shù)據(jù)發(fā)布到多個存儲站點(diǎn)上的有效方式.
遠(yuǎn)程克隆例如,將192.168.1.32上test下的user集合克隆到本地db.runCommand({cloneCollection:”test.user”, from:”192.168.1.32:27017”});本地克隆由于mongoDB沒有提供本地克隆collection的命令或方法,所以需要寫一個循環(huán)插入的方案來完成這項工作.例如,將user集合中的數(shù)據(jù)克隆一份到taruser中.> db.user.find().forEach( function(x){ db.taruser.insert(x); } );> db.taruser.find();
復(fù)制數(shù)據(jù)庫
使用copyDatabase(fromdb,todb,fromhost)命令來實(shí)現(xiàn)復(fù)制數(shù)據(jù)庫
遠(yuǎn)程復(fù)制數(shù)據(jù)庫> db.copyDatabase("from_db1","to_db2","192.163.1.167");本地復(fù)制數(shù)據(jù)庫> db.copyDatabase("to_db1","to_db2","localhost");
刷新磁盤
在mongoDB中使用”db.runCommand({fsync:1})”命令將內(nèi)存中尚未寫入磁盤的信息寫入磁盤,并鎖住對數(shù)據(jù)庫更新的操作,但讀擦做可以繼續(xù).
數(shù)據(jù)壓縮
repairDatabase命令是MongoDB內(nèi)置的一個方法,調(diào)用這個方法MongoDB會掃描數(shù)據(jù)庫中的所有數(shù)據(jù),并將通過導(dǎo)入/導(dǎo)出來重新整理數(shù)據(jù),整理磁盤碎片
mongoDB中可以使用db.collection.storageSize()和db.collection.totalSize()命令來搜集壓縮命令執(zhí)行前后集合所占用磁盤空間情況
> db.user.storageSize();8192> db.user.totalSize();16384> db.repairDatabase();{ "ok" : 1 }> db.user.storageSize();8035> db.user.totalSize();9384
捕獲異常
MongoDB的寫是異步的,返回給客戶端成功但寫不一定成功,db.getLastError命令有2個功能,即當(dāng)MongoDB在寫操作時,默認(rèn)不會等數(shù)據(jù)寫完后才返回,這是可以通過這個命令來保證寫入是否是成功的.
查看活動進(jìn)程
> db.currentOp();字段說明:opid:操作進(jìn)程號,可以使用db.killop(opid)op:操作類型(查詢、更新等)ns:命名空間,指操作的是哪個對象query:如果操作類型是查詢的話,將顯示具體的查詢內(nèi)容inLock:指名鎖定的類型.-1代表讀鎖,0代表無鎖.1代表寫鎖.
用戶安全和認(rèn)證
限制特定IP地址訪問
這樣可以避免來自公網(wǎng)上的惡意攻擊.
MongDB可以指定對外服務(wù)的綁定,默認(rèn)設(shè)置為空,即綁定在本機(jī)所有可用IP上,對于商業(yè)系統(tǒng),出于安全考慮,可以綁定內(nèi)網(wǎng),減少外網(wǎng)訪問避免攻擊.只需要啟動時加bind_ip即可. >mongod --bind_ip 169.254.180.132 //啟動mongodb時綁定ip169.254.180.132此時客戶端想訪問169.254.180.132上的服務(wù)器,就需要顯示地指定連接的IP地址是169.254.180.132.eg. >mongo 169.254.180.132
設(shè)置監(jiān)聽端口
MongoDB默認(rèn)的監(jiān)聽端口是27017,為了安全,一般都會修改這個監(jiān)聽端口.
eg. >mongod --bind_ip 169.254.180.132 --port 9888 //啟動mongodb時綁定ip 并修改端口同理.客戶端連接時需要指定ip跟端口eg. >mongo 169.254.180.132:9888
設(shè)置登錄用戶名和口令
mongodb默認(rèn)是沒有用戶名和口令的,啟動后,可以直接用mongoDB連接,并且對所有的庫具有root權(quán)限,為了安全,必須給其設(shè)置用戶名和口令.
只需要再啟動的時候,指定auth參數(shù).就可以阻止客戶端的訪問和連接,如下
eg.>mongod -auth --dbpath=../data --logpath=../logs/mongodb.logs
想要登錄驗(yàn)證模塊生效,必須在admin庫中添加一個用戶,同時要指定auth參數(shù).
D:\program files\mongo\bin>mongoMongoDB shell version: 1.8.1connecting to: test> use adminswitched to db admin> db.addUser("root","root123");{ "user" : "root", "readOnly" : false, "pwd" : "81c5bca573e01b632d18a459c6cec418"}> db.auth("root","root123");1>此時建立了系統(tǒng)root用戶.
也可以對某個特定的數(shù)據(jù)庫設(shè)置用戶,這樣權(quán)限的細(xì)粒度劃分,也方便進(jìn)行用戶管理.
注意:建立指定權(quán)限的用戶只能用系統(tǒng)用戶來操作.
為mydb創(chuàng)建一個用戶名為mydbusr口令為123的用戶
D:\program files\mongo\bin>mongo -uroot -proot123 localhost:27017/adminMongoDB shell version: 1.8.1connecting to: localhost:27017/admin> show dbs;admin 0.03125GBlocal (empty)test (empty)> use mydb;switched to db mydb> db;mydb> db.addUser("mydbusr","123");{ "user" : "mydbusr", "readOnly" : false, "pwd" : "4dbfed60224bbcd7eccbd2da993a8029"}system> show tables;system.indexes.users> db.system.users.find();{ "_id" : ObjectId("50f6acdd22bc514e46426dda"), "user" : "mydbusr", "readOnly" : false,60224bbcd7eccbd2da993a8029" }> db.auth("mydbusr","123");1>