2019年11月6日水曜日

mongodb架設筆記

mongodb架設筆記

作業環境是linux...windows的話應該只差在預設檔案的路徑吧?

一些預設值:
service script路徑: /etc/init.d/mongod
config file預設路徑: /etc/init/mongodb.conf

手動操作流程:
  1. 安裝mongodb
  2. 以無認證模式啟動    「mongod --dbpath <自行指定資料庫路徑>  --bind_ip=127.0.0.1 --logpath <logpath>」
    (「--bind_ip=127.0.0.1」:只允許自機連線,比較安全)
  3. 進入mongo db終端   「mongo --host localhost --port 27017」
  4. 進入admin database : mongodb指令「use admin」
  5. 在admin db裡面新增可以管理user的較高權限帳號。(沒有的話,之後要管理db就得把mongo切回無認證模式,比較麻煩)(指令請參考下面的「mongo基本操作指令」)
  6. 在admin db裡面新增其他一般權限的帳號,記得要指定db名稱。(指令請參考下面的「mongo基本操作指令」)
  7. optional:進入特定db,新增其他一般權限的帳號。(此時的roles不需指定db名稱,指定了似乎也沒有影響)
  8. 修改預設的config檔: /etc/init/mongodb.conf
    全手動裝的話可以到這裡取檔案
  9. 登出mongo終端,以認證模式重啟mongodb(加上參數--auth) 「mongod  --auth --config /etc/init/mongodb.conf」

注意事項:
  • mongodb有3個預設db: admin / local / config。 其中local跟config是不能建立帳號的。三個都不能拿來做一般的資料存取使用。
  • mongodb的帳號權限設計,是以每個db為分別。admin裡面建立的帳號的權限可以橫跨不同db。但是admin的帳號要分別對db指定權限的話,需要指定db名稱。
  • admin跟其他db裡面同時存在同一個帳號,不同密碼的話?  就看登入的時候指定的db是哪個。密碼也要用那一組才會登入成功。也就是說想要跨db存取,必須登入admin db。
  • 要是在其他db裡面建立的帳號的權限設定錯誤(role所指定的db不是當前的db)? 登入會成功,但是在做讀寫的時候會出錯。
  • 若是以admin db的帳號做mongodump / mongorestore, 必須加上參數「--authenticationDatabase admin」

mongod啟動之後過約7秒就會回到shell, 直接執行mongod的話不需用「&」強制回shell。
可以在發現不會回到shell之後再加「&」。


mongo基本操作指令

  • mongo終端啟動:mongo --host localhost --port 27017
  • list database :    db.adminCommand( { listDatabases: 1 } ) (只有admin帳號可以list database)
  • use database:   use <database name>
    不存在的db也可以切換。mongodb會在有資料更動(像是新增一個table的一筆資料,或是新增使用者)的時候,開始建立新db的資料。
  • list collections:  db.getCollectionInfos()
  • 建立/更新 user: 一定要使用use <dbname> 切換到某一個db裡面(一開始只有admin)才能建立和更新user,要不然會出錯。在admin裡面的話可以操作某位user在各個db裡面的權限。
建立user的指令:
db.runCommand(
{
    createUser: "username",
    pwd: "password",
    roles: [{role:"userAdmin",db:"admin"}]
})

更新user的指令:
db.runCommand(
{
    updateUser: "username",
    pwd: "password",
    roles: [{role:"userAdmin",db:"admin"}]
})
  • 進入mongo 終端之後的登入指令:
    db.auth("username","password")
  • 一般db使用者的權限,給到dbAdmin即可。給到userAdmin的話,帳號就可以自我加大權限,比較不建議。
  • admin使用者的特殊權限:
    readAnyDatabase > 讀取所有資料庫
    readWriteAnyDatabase > 讀寫所有資料庫
    userAdminAnyDatabase > 管理所有資料庫使用者
    dbAdminAnyDatabase > 所有資料庫的管理者
    root > 最高權限


Troubleshooting:

  • mongod啟動遇到 ERROR: child process failed, exited with error number 1
    原因:log path檔案或是pid path檔案權限不足。像是預設的mongod.conf是寫到/var/log,pid是寫到/var/run,不會自動建立目錄,要手動建好並設定好存取權限。

  • ERROR: child process failed, exited with error number 14:
    原因:這時應該可以看log了(強烈建議一定要在mongod.conf或是執行的參數裡面指定log的暫存檔)。請注意log。
    例如此狀況:
    2019-10-01T23:35:20.298+0800 E NETWORK  [initandlisten] Failed to unlink socket file /tmp/mongodb-27017.sock errno:1 Operation not permitted

    所以把 /tmp/mongodb-27017.sock 檔案刪除之後即可


mongo db備份

/usr/bin/mongodump -h 127.0.0.1 -u <username> -p <password> -o <自訂的備份目錄>
  • 可以加參數  「-d <database name>」  限制只備份一個db。
  • 備份目錄下面會自動產生各個db的目錄,不用擔心db的備份會互蓋。


mongo db回復

指令: mongorestore -h 127.0.0.1 -d <database name> <備份的路徑>
  • 有指定db的話,路徑需要指到備份目錄的下一層。
  • 加上「--drop」 可以把原有的資料清掉。實際上機請務必再三確認是否要做。因為mongo的資料回復,做多次也不會成為加倍的資料(_id已經是固定值)。但是同一個id的資料,db內比備份新的話,db內的會被restore成舊資料)



0 件のコメント:

コメントを投稿