1. 程式人生 > >MongoDB(3)維護操作:連線 & 使用者管理 & 備份

MongoDB(3)維護操作:連線 & 使用者管理 & 備份

MongoDB 入門專欄

啟動/關閉 mongodb 服務

啟動服務mongodb 服務的啟動方式由 2 種,直接通過指定啟動引數啟動,和通過配置檔案啟動,這兩種方式可以混合使用;
# 指定啟動引數啟動 mongodb
$ mongod --dbpath=/usr/bin/mongodb-3.6.2/data --logpath=/usr/bin/mongodb-3.6.2/logs/mongo.log --appendlog   
# 指定配置檔案啟動 mongodb
$ mongod -f /etc/mongod.conf
# 混合方式啟動 mongodb
$ mongod -f /etc/momgod.conf --auth 
配置文類似如下,類似於 properties 檔案的格式,這些配置引數和說明可以通過 mongod --help 獲取:
dbpath=/usr/bin/mongodb-3.6.2/data
journal=true
logpath=/usr/bin/mongodb-3.6.2/logs/mongod.log
logappend=true
bind_ip=127.0.0.1
port=27017
auth=true
關閉服務前臺執行關閉,如果啟動服務時沒有使用 --fork 引數,可以直接在前臺退出終端關閉;如果使用 --fork 指令是服務在後臺執行,需要向伺服器傳送 shutdownServer() 來關閉該資料庫:
> use admin
> db.shutdownServer()

連線 mongodb

在終端連線 mongodb 的指令如下,使用指定使用者密碼連線指定資料庫;mongo -u user_name -p password file_name
# 直接登陸 mongo
$ mongo   
# 使用管理員密碼,以管理員許可權登陸本地預設埠(27017)的 mongodb
$ mongo -u assad -p mongo123 localhost/admin
# 使用使用者密碼(user=vancy,passowrd=mongo2233),登陸指定地址的 mongodb 資料庫(127.233.22.33:2233/article)
$ mongo -u vancy -p mongo2233 127.233.22.33:2233/article
 退出資料庫連線終端和 mysql 一樣都是 exit 指令;
mongo shell 其實使用 JavaScript 作為解釋引擎的,所以在裡面可以執行簡單的 js 程式碼,甚至可以建立方法,定義變數;
> 1 + 1
2
> var num = 2333
> num + 1000
3333

使用者管理

mongodb 預設安裝後並沒有存在管理員使用者,需要自己手動新增,mongodb 的使用者是和資料庫相關聯的,在某一個庫裡授權,就必須在某一個庫裡驗證,除了 admin 庫裡的授權可以用於任何庫之外,其他普通庫之間的授權和驗證是相互獨立的;

建立使用者

使用 db.createUser() 在當前資料庫裡建立使用者,該函式含有以下鍵值對:
  • user:使用者名稱,值為一個 string;
  • pwd:使用者密碼,值為一個 string;
  • roles:使用者許可權規則,值為一個數組,每一個 陣列項含有以下鍵值對:
    • role:許可權規則;
    • db:指定使用許可權規則的資料庫,可以省略,預設 role 用於當前資料庫;
其中 role 的選項如下:
  • 資料庫使用者角色
    • read:只讀許可權;
    • readWrite:讀寫許可權;
  • 資料庫管理角色
    • dbAdmin:資料庫管理許可權(包括執行管理函式(如索引集合建立刪除),檢視統計,訪問 system.profile)
    • userAdmin使用者管理許可權(允許讀寫 system.users 集合,建立、刪除、管理使用者);
    • dbOwner:readWrite,dbAdmin,userAdmin 許可權合集;
  • 所有資料庫角色
    • readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabasem、dbAdminAnyDatabase
  • 叢集管理角色
    • clusterAdmin、clusterManager、clusterMonitor、hostManager;
  • 備份恢復角色
    • backup、restore
  • 超級使用者:
    • root:超級許可權,擁有所有許可權;
其中 readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabasem、dbAdminAnyDatabase、clusterAdmin、root 這幾個許可權只有在 admin 庫中才可以授權;一個簡單的示例如下:
# 連線 test 資料庫
> use test     
# 在 test 庫下建立管理員賬戶,對 test 庫擁有管理許可權
> db.createUser({
...  user:"admin1",
...  pwd:"ad123",
...  roles:[ { role:"dbAdmin", db:"test"} ]   # 此處可以替換為 roles:[ "dbAdmin" ]
})
# 在 test 庫下建立普通使用者,對 test 庫只擁有讀寫許可權
> db.createUser({ 
...    user:"user1", 
...    pwd:"1234",
...    roles:[ { role:"readWrite", db:"test"} ]  # 此處可以替換為 roles:[ "readWrite" ]
... })
想要管理非當前資料庫的使用者,只能在 admin 資料庫中才能做到,但是在 admin 庫中建立的 user 是儲存在 admin 庫的 system.users 集合中的,如下:
> use admin
# 在 admin 庫中建立使用者 user3,擁有 testdb 庫的讀寫許可權,和 testdb2 庫的管理許可權
> db.createUser({
... user:"user3",
... pwd:"123",
... roles:[ { role:"readWrite", db:"testdb"},
            { role:"dbAdmin", db:"testdb2" } ]
... })

使用者驗證

在 mongodb 服務開啟了 --auth 啟動引數(使用驗證模式執行),使用者在訪問某個資料庫,在進行某些操作時需要進行驗證;登陸使用者有 2 種方式,一種是直接使用使用者身份登陸某個資料庫,一種是在使用過程中使用使用者身份驗證;
# 直接使用 ueer3 的身份登陸本地資料庫 testdb
$ mongo -u user3 -p 123 localhost/testdb
> ....
# 在使用過程中進行使用者身份驗證
$ mongo
> use testdb
> show collections
2018-02-13T21:30:11.107+0800 E QUERY    [thread1] Error: listDatabases failed: ....   # 當前身分沒有檢視 testdb 的許可權
> db.auth('user3','123')     # 驗證 user3 使用者的身份
> use testdb
> show collection
.....

檢視使用者資訊

使用db.system.users.find() 函式可以檢視的使用者資訊,注意使用該函式的使用者必須擁有使用者管理的資訊,該函式返回的使用者資訊的壓縮格式的,如果要檢視完整格式可以使用 db.system.users.find().pretty() 
> use test
# 檢視 test 庫的所有使用者資訊
> db.system.users.find().pretty()
....
# 檢視 test 庫中的 assad 使用者資訊
> db.system.users.find({user:'assad'}).pretty()
....

修改使用者資訊

使用者資訊的更新是用通過對 db.systems.users 集合進行 update 操作來實現的,注意使用該函式的使用者必須擁有使用者管理的資訊;
# 更新 test 庫中的 user1 使用者的密碼
> use test
> db.system.users.update({user:'user1'},{$set:{'pwd':'mongo123'}})

刪除使用者

刪除使用者是用通過對 db.systems.users 集合進行 remove 操作來實現的,注意使用該函式的使用者必須擁有使用者管理的資訊;
# 刪除 test 庫中的 user1 使用者
> use test
> db.system.users.remove({user:'user1'})

備份和恢復

資料備份

對於 mongodb 的資料備份可以使用自帶的 mongodump 工具進行,該和工具的呼叫原型如下:
$ mongodump -h dbhost -d dbname -o dbdirectory 
  • -h:mongodb 所在的伺服器地址,可以指定 ip,或者 ip:port ,如:127.0.0.1或 127.0.0.1:27017;
  • -d:需要備份的資料庫名稱,如:test;
  • -o:儲存備份的路徑;
注意 mongodump 工具必須在 mongo 服務啟動後才可以使用,如果 mongo 服務設定了 auth 驗證模式,還需要 -u -p 引數指定擁有相關許可權的使用者;示例:
# 備份 test 資料庫
$ mongodump -h localhost:27017 -d /usr/local/bin/mongodb/data/test/ -o /usr/backup/mongodb/
# 備份所有資料庫
$ mongodump -h localhost:27017 -d /usr/local/bin/mongodb/data/ -o /usr/backup/mongodb/

資料恢復

對於 mongodb 的資料備份可以使用自帶的 mongorestore工具進行,該和工具的呼叫原型如下:
$ mongodump -h dbhost -d dbname [--drop ] [--dir ] backpath 
  • -h,--host:mongodb 所在的伺服器地址,可以指定 ip,或者 ip:port ,如:127.0.0.1或 127.0.0.1:27017;
  • -d, --db:需要備份的資料庫名稱,如:test,這個名稱可以和原來備份時候的命名不一樣;
  • --drop:恢復的時候,先刪除當前資料,然後恢復備份的資料。
  • --dir:備份資料所在位置,如:/user/share/backup/test。可以省略 --dir,不過路徑必須放在命令的最後;
注意 mongodump 工具必須在 mongo 服務啟動後才可以使用,如果 mongo 服務設定了 auth 驗證模式,還需要 -u -p 引數指定擁有相關許可權的使用者;
# 從備份裡恢復 test 資料庫
$ mongorestore -h lcoalhsot:27017 -d /usr/local/bin/mongodb/data/test/ /usr/backup/mongodb/
# 從備份裡恢復所有資料庫
$ mongorestore -h lcoalhsot:27017 -d /usr/local/bin/mongodb/data/ /usr/backup/mongodb/