mongodb數據管理
數據的導出、數據導入
數據導出 mongoexport [使用mongoexport -h查看參數]
數據導入 mongoimport [使用mongoimport -h查看參數]
導入導出json數據實例
mongoexport -d mydb -c user -o d:/mongdbback/user.dat --mydb是要導出的表所屬的數據庫 --user是要導出的集合名c表示collection --user.dat是導出後的文件名 mongoimport -d mydb -c user d:/mongdbback/user.dat --mydb 數據導入的目標數據庫 --user 數據導入的目標集合 --d:/mongdbback/user.dat 待導入的數據文件存放路徑
導入導出csv數據
CSV格式良好,主流數據庫都支持導出爲csv的格式,所以這種格式非常利於異構數據遷移.
mongoexport -d mydb -c user --csv -f id,name,age -o d:/mongodbback/user_csv.data --導出csv格式 --f 指定要導出的列的名字 mongoimport -d mydb -c user --type csv --headerline --file d:/mongodbback/user_csv.data; --mydb 數據導入的目標數據庫 --user 數據導入的目標集合 --type表示導入的文件格式 --headerline 表明不導入第一行,因爲第一行是列名 --d:/mongodbback/user_cvs.data 待導入的數據文件存放路徑
數據備份、數據恢復
數據備份mongodump
數據恢復mongorestore
備份實例 mongodump -d mydb //備份mydb數據庫 此時會在當前目錄下默認創建一個dump目錄,用於存放備份出來的文件,也可以指定備份存放的目錄使用-o mongodump -d mydb -o d:/databack/ 恢復實例 mongorestore -d mydb d:/databack/mydb/ 數據備份是爲了發生災難事件後可以恢復數據,但是不幸總是存在的,即沒有數據備份,好在MongoDB內建了修復功能.可以嘗試修復受損文件,如果Mongdb不正常關閉,啓動服務時會看到一堆警告信息. 修復所有數據最簡單的方法就是在mongod啓動時加上--repaire參數. 修復單個數據庫可以再mongodb的shell裏邊執行repaireDatabase命令,如 >use test switched to db test >db.repaireDatabase(); {“ok” : 1}
克隆collection
克隆collection是將一組數據從一個數據源拷貝到多個數據源的技術,是將一份數據發佈到多個存儲站點上的有效方式.
遠程克隆 例如,將192.168.1.32上test下的user集合克隆到本地 db.runCommand({cloneCollection:”test.user”, from:”192.168.1.32:27017”}); 本地克隆 由於mongoDB沒有提供本地克隆collection的命令或方法,所以需要寫一個循環插入的方案來完成這項工作. 例如,將user集合中的數據克隆一份到taruser中. > db.user.find().forEach( function(x){ db.taruser.insert(x); } ); > db.taruser.find();
複製數據庫
使用copyDatabase(fromdb,todb,fromhost)命令來實現複製數據庫
遠程複製數據庫 > db.copyDatabase("from_db1","to_db2","192.163.1.167"); 本地複製數據庫 > db.copyDatabase("to_db1","to_db2","localhost");
刷新磁盤
在mongoDB中使用”db.runCommand({fsync:1})”命令將內存中尚未寫入磁盤的信息寫入磁盤,並鎖住對數據庫更新的操作,但讀擦做可以繼續.
數據壓縮
repairDatabase命令是MongoDB內置的一個方法,調用這個方法MongoDB會掃描數據庫中的所有數據,並將通過導入/導出來重新整理數據,整理磁盤碎片
mongoDB中可以使用db.collection.storageSize()和db.collection.totalSize()命令來蒐集壓縮命令執行前後集合所佔用磁盤空間情況
> db.user.storageSize(); > db.user.totalSize(); > db.repairDatabase(); { "ok" : 1 } > db.user.storageSize(); > db.user.totalSize();
捕獲異常
MongoDB的寫是異步的,返回給客戶端成功但寫不一定成功,db.getLastError命令有2個功能,即當MongoDB在寫操作時,默認不會等數據寫完後才返回,這是可以通過這個命令來保證寫入是否是成功的.
查看活動進程
> db.currentOp(); 字段說明: opid:操作進程號,可以使用db.killop(opid) op:操作類型(查詢、更新等) ns:命名空間,指操作的是哪個對象 query:如果操作類型是查詢的話,將顯示具體的查詢內容 inLock:指名鎖定的類型.-1代表讀鎖,0代表無鎖.1代表寫鎖.
用戶安全和認證
限制特定IP地址訪問
這樣可以避免來自公網上的惡意***.
MongDB可以指定對外服務的綁定,默認設置爲空,即綁定在本機所有可用IP上,對於商業系統,出於安全考慮,可以綁定內網,減少外網訪問避免***. 只需要啓動時加bind_ip即可. >mongod --bind_ip 169.254.180.132 //啓動mongodb時綁定ip169.254.180.132 此時客戶端想訪問169.254.180.132上的服務器,就需要顯示地指定連接的IP地址是169.254.180.132. eg. >mongo 169.254.180.132
設置監聽端口
MongoDB默認的監聽端口是27017,爲了安全,一般都會修改這個監聽端口.
eg. >mongod --bind_ip 169.254.180.132 --port 9888 //啓動mongodb時綁定ip 並修改端口 同理.客戶端連接時需要指定ip跟端口 eg. >mongo 169.254.180.132:9888
設置登錄用戶名和口令
mongodb默認是沒有用戶名和口令的,啓動後,可以直接用mongoDB連接,並且對所有的庫具有root權限,爲了安全,必須給其設置用戶名和口令.
只需要再啓動的時候,指定auth參數.就可以阻止客戶端的訪問和連接,如下
eg.>mongod -auth --dbpath=../data --logpath=../logs/mongodb.logs
想要登錄驗證模塊生效,必須在admin庫中添加一個用戶,同時要指定auth參數.
D:\program files\mongo\bin>mongo MongoDB shell version: 1.8.1 connecting to: test > use admin switched to db admin > db.addUser("root","root123"); { "user" : "root", "readOnly" : false, "pwd" : "81c5bca573e01b632d18a459c6cec418" } > db.auth("root","root123"); > 此時建立了系統root用戶.
也可以對某個特定的數據庫設置用戶,這樣權限的細粒度劃分,也方便進行用戶管理.
注意:建立指定權限的用戶只能用系統用戶來操作.
爲mydb創建一個用戶名爲mydbusr口令爲123的用戶
D:\program files\mongo\bin>mongo -uroot -proot123 localhost:27017/admin MongoDB shell version: 1.8.1 connecting to: localhost:27017/admin > show dbs; admin 0.03125GB local (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"); >
MongoDB權限驗證
在MongoDB中,服務啓動默認是沒有權限驗證的,就安全性方面來說,這肯定是不行的,所以需要加上權限驗證。
既然是要進行權限驗證,那肯定是得有用戶的吧,所以權限驗證的第一步就是給MongoDB庫添加用戶。
啓動MongoDB服務端,然後啓動MongoDB客戶端,在客戶端使用命令給MongoDB庫添加用戶,看代碼:
> db.addUser( "jiangzhichao" , "jzc19880316" ); {
"user" : "jiangzhichao" ,
"readOnly" : false ,
"pwd" : "f7559cfe0bc0a305f82c0d83664538fd" } |
小知識:在admin庫裏面添加用戶是全局的,也就是說在admin中添加用戶,在其他庫裏面也是適用的。
要給MongoDB的服務器端添加權限驗證,需要在啓動MongoDB的服務的時候添加--auth參數,代碼如下:
d:\mongodb\bin>mongod --dbpath d:\mongodb\data --logpath d:\mongodb\log\mongodb.log --logappend --serviceName MongoDB --auth --install all output going to: d:\mongodb\log\mongodb.log Creating service MongoDB. Service creation successful. Service can be started from the command line via 'net start "MongoDB"' . d:\mongodb\bin>net start "MongoDB" Mongo DB 服務正在啓動 . Mongo DB 服務已經啓動成功。 |
在這裏我是以服務的方式啓動MongoDB服務,第一條命令是安裝服務,第二條就是啓動服務了。
服務都已經啓動了,那就剩下打開客戶端了,這個就簡單了,看代碼:
d:\mongodb\bin>mongo MongoDB shell version: 1.8.2 connecting to: test > show dbs; Mon Oct 24 21:54:13 uncaught exception: listDatabases failed:{
"assertion" : "unauthorized db:admin lock type:-1 client:127.0.0.1" ,
"assertionCode" : 10057,
"errmsg" : "db assertion failure" ,
"ok" : 0 } |
看到了吧,show dbs命令報異常了,再看異常的具體信息,unauthorized db:admin lock,權限驗證不通過啊!
那好,下面就進行權限驗證,這裏嘮叨一下,在進行權限驗證的時候,先退出客戶端,或者另起一個客戶端,代碼如下:
d:\mongodb\bin>mongo admin -u jiangzhichao -p jzc19880316 MongoDB shell version: 1.8.2 connecting to: admin > show dbs; admin 0.078125GB local (empty) test (empty) |
命令格式:mongo [數據庫名] -u [用戶名] -p [密碼]
上面的show dbs可以執行並看到結果了。
到此,權限驗證的過程就算完成了。