mongodb管理與安全認證

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 fromthe 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可以執行並看到結果了。


到此,權限驗證的過程就算完成了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章