1. 程式人生 > >mongodb進階三之mongodb管理

mongodb進階三之mongodb管理

平時的開發環境win比較多啊,但生產環境要放到unix環境上

一:命令

安裝就不少了,網上有很多資料下面列一些引數
quiet 安靜輸出
port arg 指定服務埠號,預設埠27017
bind_ip arg 繫結服務IP,繫結127.0.0.1,只本機訪問,預設本地所有IP
logpath arg 指定MongoDB日誌檔案,注意是指定檔案不是目錄
logappend 使用追加的方式寫日誌
pidfilepath arg PID File 的完整路徑,如果沒有設定,則沒有PID檔案
keyFile arg 叢集的私鑰的完整路徑,只對於Replica Set 架構有效
unixSocketPrefix arg UNIX域套接字替代目錄,(預設為 /tmp)
fork 以守護程序的方式執行MongoDB,建立伺服器程序
auth 啟用驗證
cpu 定期顯示CPU的CPU利用率和iowait
dbpath arg 指定資料庫路徑
diaglog arg diaglog選項 0=off 1=W 2=R 3=both 7=W+some reads
directoryperdb 設定每個資料庫將被儲存在一個單獨的目錄
journal 啟用日誌選項,的資料操作將會寫到journal資料夾檔案裡
journalOptions arg 啟用日誌診斷選項
ipv6 啟用IPv6選項
jsonp 允許JSONP形式通過HTTP訪問(有安全影響)
maxConns arg 最大同時連線數 預設2000
noauth 不啟用驗證
nohttpinterface 關閉http介面,預設關閉27018埠訪問
noprealloc 禁用資料檔案預分配(往往影響效能)
noscripting 禁用指令碼引擎
notablescan 不允許表掃描
nounixsocket 禁用Unix套接字監聽
nssize arg (=16) 設定信資料庫.ns檔案大小(MB)
objcheck 在收到客戶資料,檢查的有效性。
profile arg 檔案引數 0=off 1=slow, 2=all
quota 限制每個資料庫的檔案數,設定預設為8
quotaFiles arg number of files allower per db, requires quota
rest 開啟簡單的rest API
repair 修復所有資料庫run repair on all dbs
repairpath arg 修復庫生成的檔案的目錄,預設為目錄名稱dbpath
slowms arg (=100) value of slow for profile and console log
smallfiles 使用較小的預設檔案
syncdelay arg (=60) 資料寫入磁碟的時間秒數(0=never,不推薦)
sysinfo 列印一些診斷系統資訊
upgrade 如果需要升級資料庫 * Replicaton 引數
fastsync 啟用從庫複製服務,該資料庫是主庫快照,可快速啟用同步
autoresync 如果從庫與主庫同步資料差得多,自動重新同步,
oplogSize arg 設定oplog的大小(MB) * 主/從引數
master 主庫模式
slave 從庫模式
source arg 從庫 埠號
only arg 指定單一的資料庫複製
slavedelay arg 設定從庫同步主庫的延遲時間 * Replica set(副本集)選項:
replSet arg 設定副本集名稱 * Sharding(分片)選項
configsvr 宣告這是一個叢集的config服務,預設埠27019,預設目錄/data/configdb
shardsvr 宣告這是一個叢集的分片,預設埠27018
noMoveParanoia 關閉偏執為moveChunk資料儲存

命令:

mongodb幫助命令  help

資料庫級幫助命令  db.help()

集合級幫助命令 db.users.help()

檢視哪些資料庫 show dbs

建立和切換資料庫  use  aaa

查當前資料庫狀態  db.stats()

獲取當前資料庫集合 db.getCollectionNames()

獲取當前資料庫名字  db.getName()

刪除資料庫  db.dropDatebase()

新增使用者 db.addUser("使用者名稱","密碼“)

刪除使用者名稱 db.dropUser("使用者名稱")

終止資料庫服務程序 db.shutdownServer()

二:使用者角色管理

2.1:建立管理員

使用者管理員用來建立的使用者,也用來建立和分配角色。使用者管理員可以擁有資料庫中的任何特權,可以建立新的使用者或者管理員。正常情況下在一個MongoDB的部署中,應該建立使用者管理員作為第一個使用者,然後使用這個使用者建立的所有其他使用者。 為了能夠建立第一個使用者管理員,MongoDB提供userAdmin和userAdminAnyDatabase角色,兩個角色支援使用者和角色管理操作的各種訪問。使用最小許可權userAdmin或者使用userAdminAnyDatabase賦予所有有關的特權。 擁有這兩個角色的使用者可以授予自己無限的特權。具體地,擁有userAdmin角色的使用者可以授予本身資料庫中的任何特權。一個使用者擁有userAdminAnyDatabase角色的使用者管理員可以授予本身在系統中的任何特權。 使用以下步驟建立使用者管理員,首先連線admin資料庫:

mongo --port 27017 --authenticationDatabase admin
然後建立系統使用者:

db.createUser({user: "siteUserAdmin",pwd: "password",roles:
    [{role: "userAdminAnyDatabase",db: "admin"}]}
最後可以驗證一下:

db.runCommand({usersInfo:"manager",showPrivileges:true})

2.2:將使用者新增到資料庫

使用createUser命令將使用者新增到你希望這個使用者擁有相應許可權的資料庫中。下面的例子是賦予testUser資料庫test的讀許可權,密碼是12345678。

use test
db.createUser({
      user: "testUser",
      pwd: "12345678",
      roles: [
         { role: "read", db: "test" },
      ]
    }
)

2.3:設定超級使用者

建立一個超級使用者需要有何建立使用者管理員一樣的許可權。

use admin
db.createUser(
    {
      user: "superuser",
      pwd: "12345678",
      roles: [ "root" ]
    }
)

2.4:建立角色

建立一個使用者角色使用createRole這個命令。每一個角色可以通過privileges授予一些系統特權,通過roles來授予一些資料庫管理許可權。writeConcern引數是保障寫操作的可靠性。

use admin
db.createRole(
  {
    role: "myClusterwideAdmin",
    privileges:
    [
      { resource: { cluster: true }, actions: [ "addShard" ] },
      { resource: { db: "config", collection: "" }, actions: [ "find", "update", "insert" ] },
      { resource: { db: "users", collection: "usersCollection" }, actions: [ "update" ] },
      { resource: { db: "", collection: "" }, actions: [ "find" ] }
    ],
    roles:
    [
      { role: "read", db: "admin" }
    ],
    writeConcern: { w: "majority" , wtimeout: 5000 }
  }
)
)

2.5:分配角色

使用者分配角色使用grantRolesToUser命令。可以給使用者分配各個資料庫的各種管理許可權。

use admin
db.grantRolesToUser(
  "accountAdmin01",
  [
    {
      role: "readWrite", db: "products"
    },
    {
      role: "readAnyDatabase", db:"admin"
    }
  ]
)

2.6:驗證使用者許可權

驗證使用者的角色使用getRole命令。

use admin
db.getUser("accountUser01")
db.getRole( "siteRole01", { showPrivileges: true } )

2.7:修改使用者訪問許可權

修改使用者的訪問許可權revokeRolesFromUser命令。

use admin
db.grantRolesToUser(
    "accountUser01",
    [
      { role: "read", db: "records" }
    ]
)
db.revokeRolesFromUser(
    "accountUser01",
    [
      { role: "readWrite", db: "accounts" }
    ]
)

2.8:更改使用者名稱密碼

修改使用者的密碼changeUserPassword命令。

db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")

三:訪問控制安全

3.1:mongodb為每個資料庫提供了授權和認證。Mongodb認證,授權使用者,是在資料庫級別上,Mongodb把使用者的憑據放在system.users collection中,認證預設是關閉的,可以通過auth,keyFile配置選項設定。對於Mongodb企業版可以使用kerberos來認證。

在一個數據庫上,你只能認證一個使用者,如果認證了第二個,第一個就會被放棄。

Mongodb規定授權是以role為基礎的。每個授權的使用者都儲存在system.users中,要給使用者分配角色,必須要有一個管理角色的使用者在資料庫中,如果沒有就必須建立一個。

預設的,MongoDB會認為所執行的環境是安全的,沒有進行資料庫的安全性和身份驗證。在這樣的配置環境下,唯一要確保的是隻有信任的機器才能連線到MongoDB埠。如果使用資料庫專用伺服器,最簡單的方法是讓它完全的無法從外部訪問,將MongDB服務繫結--bind_ip到指定ip上。更進一步的可以在指定一個埠--port。

如果在一個不信任的環境中使用MongoDB就涉及到如何讓MongoDB執行在安全模式上。MongoDB通過--auth和--keyfile引數的使用來啟動安全模式用以支援身份驗證和簡單的粗粒度訪問控制。

3.2:使用金鑰檔案
如果要使用key檔案,那麼在mongod啟動的時候指定keyfile選項。 一般使用openssl生成keyfile檔案:

openssl rand -base64 741 -out /var/lib/mongodb/keyfile0
chmod 600  /var/lib/mongodb/keyfile0
特別說明:如果指定keyfile內容的話,MongoDB會跳過keyfile裡面的空格。 如:echo "test sets" > /var/lib/mongodb/keyfile0

mongod --keyfile /var/lib/mongodb/keyfile0 --fork      

3.3:如何使用管理員認證
採用管理員認證的方式認證,首先要建立一個管理員使用者,上節我們講過如何建立管理員以及如何管理許可權和密碼。有了管理員使用者或者啟動使用者,即可通過--auth引數來啟動MongoDB。

mongod --auth                      
如果通過配置檔案啟用管理員認證,只需要把auth的設定改為true即可。

mongod /etc/mongod.conf --fork   

四:複製資料檔案

如何進行復制
通過複製資料檔案即可完成資料庫的備份和恢復,這種方式簡單明瞭。


一般經過以下步驟:

1.鎖定資料庫或關閉資料庫。

2.複製資料檔案到相應的目錄。

3.解鎖資料庫或重啟資料庫。


特別說明:如果只需要複製名為test的資料庫,則可以複製全部的test.*來完成。

4.1:如何鎖定資料庫
進行備份時為了防止資料檔案發生變化引起問題,可以使用以下命令將資料庫鎖定:

db.fsyncLock()
這個命令禁止所有寫入,並將髒頁寫入磁碟保證資料不再變化。這個時候的寫操作都會在記憶體中排隊等待了,直到資料庫解鎖。

4.2:複製資料檔案
新建一個複製資料檔案的目標目錄:

mkdir /usr/backup
完成資料檔案複製的命令使我們很熟悉的cp命令,必須輸入以下命令才能進行到下一節:

cp -R /var/lib/mongodb/*  /usr/backup  #你需要做備份的目錄,確保目錄已經存在。
確保備份目錄容量夠大,漏掉檔案可能備份會失效。如果是備份到其他介質,可以直接指定目錄。linux下/mnt目錄一般是裝置目錄,外接裝置一般在該目錄下。

4.3:如何解鎖資料庫
完成資料檔案的複製後,就可以使用以下命令將資料庫解鎖,恢復資料庫的正常執行狀態:

db.fsyncUnlock()
呼叫db.fsyncUnlock()和db.fsyncLock()命令是不要關閉shell,因為如果你啟用了身份驗證或者斷開了連結,可能連不上,需要重新啟動mongod,這些命令就都失效了。

4.4:如何恢復資料庫
資料庫發生問題時需要進行恢復,使用複製的檔案進行恢復時可以使用以下命令:

cp -R /usr/backup/* /var/lib/mongodb/
注意:恢復前應該確保mongod沒有執行,且/var/lib/mongodb/為空。linux使用rm -rf刪除目錄。刪除前一定確認cp命令成功執行。恢復完成後,再啟動mongod。啟動mongod使用一下命令:

mongod -f /etc/mongod.conf --fork --nojournal

五:工具方式

5.1:mongodump的基本操作
通過mongodump進行備份可以使用以下選項:
–help 檢視幫助資訊。
-v [ --verbose ] 顯示更多除錯資訊。
–version 顯示該命令版本。
-h [ --host ] arg mongodb資料庫所在主機IP地址。
–port arg mongodb啟動時所使用的埠。也可以使用 –host:port格式直接指定主機和埠。
–ipv6 是否支援ipv6 。
-u [ --username ] arg 指定登陸使用者名稱。
-p [ --password ] arg 指定登陸密碼。
–dbpath arg 越過mongod伺服器,直接訪問給定路徑的mongod資料庫檔案。使用該引數需要鎖定給定的資料目錄,所以需要先關閉使用該目錄的mongod服務。
–directoryperdb 如果指定了dbpath目錄,那麼每個db都會儲存到一個單獨的資料夾中。
–journal enable journaling
-d [ --db ] arg 準備備份的資料庫。
-c [ --collection ] arg 準備備份的集合。
-o [ --out ] arg 匯出資料將要儲存在的目錄,如引數為“-”,則直接在控制檯顯示。
-q [ --query ] arg json query
–oplog Use oplog for point-in-time snapshotting
–repair 嘗試修復損壞的資料庫。
–forceTableScan 強制表掃描。

5.2:mongorestore的基本操作
與mongodump相對應通過mongorestore進行恢復使用以下選項:
–help 檢視幫助資訊。
-v [ --verbose ] 顯示更多除錯資訊。
–version 顯示該命令版本。
-h [ --host ] arg mongodb資料庫所在主機IP地址。
–port arg mongodb啟動時所使用的埠。也可以使用 –host hostname:port格式直接指定主機和埠。
–ipv6 是否支援ipv6 。
-u [ --username ] arg 指定登陸使用者名稱。
-p [ --password ] arg 指定登陸密碼。
–dbpath arg 越過mongod伺服器,直接訪問給定路徑的mongod資料庫檔案。使用該引數需要鎖定給定的資料目錄,所以無法使用當前mongod服務正在使用的目錄。
–directoryperdb 如果指定了dbpath目錄,那麼每個db都會在一個單獨的資料夾中。
–journal enable journaling
-d [ --db ] arg 準備恢復的資料庫。
-c [ --collection ] arg 準備恢復的集合。
-objcheck 恢復前驗證一下資料物件。
-filter arg 有選擇的進行恢復。
–oplogReplay replay oplog for point-in-time restore。
–drop 修復前刪除所有集合。
–keepIndexVersion 強制表掃描。
這裡我們需要了解兩個命令,首先是驗證寫入是否成功的命令:

db.runCommand({"getLastError":1,"j":true})
這個命令主要用來解決一些重要資料需要了解是否已經寫入磁碟中。

另外一個是設定資料庫提交資料到日誌的時間間隔命令:

db.adminCommand({"setParameter":1,"journalCommitInterval":30})
其中setParameter可以設定的間隔為2毫秒到500毫秒,時間間隔月底系統開銷越大。

5.3:資料庫未執行時的備份
資料庫未執行時對資料庫進行備份,通過使用mongodump十分方便。例如使用以下命令:

mongodump --dbpath /var/lib/mongodb/ --out /usr/backup

5.4:資料庫未執行時的恢復
資料庫未執行時的恢復也很簡單,通過使用mongorestore進行恢復。不僅可以進行整體恢復,還可以進行某一個數據庫的恢復,例如使用以下命令恢復test資料庫到執行系統中。

mongorestore --dbpath /usr/backup/ --journal /var/lib/mongodb/test

5.5:如何通過遠端連結進行備份
網路允許的情況下,mongodump工具可以進行遠端連結資料庫,進行備份。例如以下備份就是通過指定主機地址、埠、使用者名稱、密碼和備份目錄而進行的備份操作。

mongodump --host www.***.com --port 3017 --username user --password pass --out /usr/backup/mongodump-2013-10-24

5.6:如何通過遠端連結進行恢復
對應的通過mongodump工具進行遠端連結備份的資料庫,也可以通過mongorestore來進行恢復。例如以下恢復就是通過指定主機地址、埠、使用者名稱、密碼和備份目錄而進行的恢復操作。

mongorestore --host www.***.com --port 3017 --username user --password pass /usr/backup/mongodump-2013-10-24

5.7:如何使用oplog進行備份
通過設定操作日誌oplog的實時備份點,可以完成快照式的資料庫備份。這樣做的好處就是如果我們在使用mongodump進行備份的操作時,如有操作正進行資料庫刪除之類的操作時,我們的mongodump備份已經將這個資料庫備份完,那麼我們獲得的備份就會和實際的資料庫不同,而且這個資料庫在事實上未成存在過。

mongodump不是快照備份,備份過程中系統可能會繼續進行操作。oplog的設定就是避免這種情況發生的,不過使用oplog的前提是mongod啟動時使用了--replSet選項。本質是使用了複製的功能,以後講到複製大家就更清楚了。

5.8:如何使用oplog恢復
與mongodump使用oplog進行備份對應,mongorestore也可以使用oplog對資料庫進行恢復。

六:意外關機修復

6.1:一般的處理程式
MongoDB意外關機後,通常有兩種選擇進行恢復:

1.直接在原始檔上進行恢復。
2.保留關機前的原始檔案,檢查以後再進行恢復。
按照第二種情況的恢復流程是:

1.修復資料庫
2.確認資料庫情況
3.刪除鎖檔案
4.修復資料庫
5.正常啟動執行
如果按照第一種方式那麼就忽略以上1、2兩個步驟。

6.2:修復並保留原始資料庫
通過下面的命令,我們來對資料庫進行修復,並將原始資料庫備份到修復目錄/usr/backup下。 這樣做的目的是不破壞原始的資料庫檔案。

mongod --dbpath /var/lib/mongodb --repair --repairpath /usr/backup

6.3:如何確認資料庫情況
通過執行下面的命令我們可以將進行修復以後的資料庫執行起來。然後通過檢查資料庫的狀態,意外發生前進行的操作執行情況,例如插入資料是否完成,目前表內資料情況等,來判斷資料庫是否已經完全修復了。

mongod --dbpath /usr/backup

6.4:刪除鎖檔案
根據修復資料庫執行的情況,判斷如果資料庫基本是正常的,我們就可以刪除鎖檔案了。如果資料庫不正常,那麼就需要做相應的處理。如使用了日誌,根據日誌進行恢復,如使用了複製那麼進行恢復等等情況,具體問題需要具體分析。

rm /var/lib/mongodb/mongod.lock

6.5:修復資料庫
修復資料庫使用以下的命令,這時修復資料庫會使用新檔案代替原有的舊檔案。

mongod --dbpath /usr/backup --repair

6.6:正常啟動資料庫
通過以上的幾個步驟以後,我們就可以正常啟動資料庫了。

mongod --dbpath /var/lib/mongodb