Pages - Menu

2021年2月24日 星期三

[Mongo]搬家採mongo坑記

 前言

    買了Ivacy ,所以自己在外面租的機房空間就打算撤掉了,也要順便把爬蟲搬回自己的電腦上。
然後就是一路的踩坑、坑、坑。這次最主要的應該是mongoDB的不熟悉,踩超久的。


正文

 1. 先把container的服務,弄起來。這部分能參考之前寫的 [DOCKER]DOCKER IMAGE SCRAPYD & SCRAPYDWEB 搬家紀錄
        這部分沒碰到啥大問題,只是要注意登入的帳號,以及對應的資料夾位置。
        只有scrapyd有匯出,其他都不用匯出了。
        要把遠端機器上的資料搬回自己的電腦上,使用的是scp的指令。
如果有玩linux的人應該會很熟悉,現在在win10也能用了。
前後順序能對掉,但必須有開啟 22 port 

daimom@192.168.31.128 ,登入帳號@位置

scp -r daimom@192.168.31.128:/home/daimom/vultrdb .

2. 然後開始踩mongo的坑

        不知道為什麼,我只要map以前的資料夾對應到mongo,container的服務就會起不來。
起不來的意思,指的是 docker ps 看不到 container,但docker ps -a 卻看的到。
單純查log也只有以前的紀錄。最後只好重建一個新的,再把資料匯入。


首先,先做一個新的mongo container。

docker run -d --net=container:scrapyd --name mongodb -v ~/db:/data/db  mongo

確定container容器能啟動,再來進入容器內,開始新建帳號。
更詳細的說明,可參考 [DOCKER]MONGODB 與 MONGO-EXPRESS 連動

docker exec -it mongodb bash

進入後,先輸入 mongo (Fig.1),進入到mongoDB的命令列內。
再新建帳號(Fig.1)
db.createUser({ user: 'admin', pwd: 'admin', roles: [ { role: 'root', db: 'admin' } ]});

這邊有一個地方與上面的文章不一樣,
這邊直接指定admin為root的角色(mongo使用者權限),這很重要,就是卡這邊導致驗證沒過。
建立好了以後,可以先驗證看看能不能登入。

db.auth("admin","admin");
能夠登入的話,會回傳1


(Fig.1)




現在回到踩坑篇

A. 建立使用者失敗,出現錯誤訊息的話

例如:
uncaught exception: Error: couldn't add user: command createUser requires authentication :

可以先建立一個不需要認證的mongoDB(其實就是我上面的指令),
建立完使用者後,再將本來的容器砍掉,
記得對應的資料夾必須留著,然後再重新對應到資料夾。(ref. docker下mongodb開啟權限認證後無法創建用戶問題)

以下會用圖片來說明,如果圖片又因為我手殘砍掉的話...就直接問吧。

圖片的流程是先建立一個不用驗證的mongo(Fig.2),然後建立使用者帳號,請看(Fig.1)。
然後將本來的容器砍掉(需先停止,才能刪除)(Fig.3),然後建立一個需要驗證的mongo(Fig.3)
最後,去新建立的容器,查看驗證是否會過(Fig.4)。

(Fig.2)
(Fig.3)
(Fig.4)


B. mongo的資料庫備份


這邊使用的方法是 
mongodump 
還原則是
mongorestore

備份的指令很簡單,只有
mongodump -d scrapy_db -o mongo -u admin -p admin 

但偏偏就這一段一直出現錯誤訊息
Failed: can't create session: could not connect to server: connection() : auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-1": (AuthenticationFailed) Authentication failed.


(Fig.5)


說穿了就是權限問題,但只要是權限問題通通都會跑這段出來。
先分析一下指令
-d 是資料庫名稱
-o 是匯出的資料夾名稱
-u 是帳號
-p 是密碼

但要備份的時候,請確認你的帳號密碼是否在該資料庫有權限能夠備份或還原
最懶的方式是直接用root來確保沒問題,再不然就要去看上面提到的權限去做。

最後用的指令是在mongodump後面加上-h 指定ip ,省了還要把資料庫拉回本地。

ref. 

資料庫還原也是同樣的方式,跳錯誤出來90%就是權限問題

mongorestore -h localhost -u admin -p admin -d scrapy_db --directoryperdb ~/vultrdb



上面有提到過,可以用scp把檔案下載下來,但如果在docker內,要將資料拉出至本機,
可使用docker cp  ,作法跟scp差不多,如果是針對整個資料夾的話,記得加上-r 

C. mongoDB查詢資料

在查問題的時候,有先利用一些mongo的指令,去比對  db name跟 collection 是不是我所想的。

show dbs ; 顯示所有資料庫
dbs; 目前使用的資料庫
use <db> ;  切換使用的資料庫
show collections; 顯示該資料庫底下的collection ,這個有點像是table的概念,但他這叫collection


這邊要注意的是,如果出現錯誤 
Warning: unable to run listCollections, attempting to approximate collection names by parsing connectionStatus
表示你沒有權限可以看Collection,此時要做的是『登入』,
但登入有些地方要先做,不然登入就是一直失敗。

    1. 先確認目前所在的資料庫是哪個 (dbs)
    2. 切換到有你的帳號密碼的資料庫(use <db>);
    3. 登入(db.auth("admin","admin")

第二個步驟是關鍵,因為mongoDB,一開始連線的時候不像mysql或mssql,需要帳號密碼。
它都會讓你連進去,但連進去到哪個db,要做哪些事情,就需要驗證了。
一般內建會有test 跟 admin 的資料庫, 就看當初帳號密碼建立在哪個地方了。


謝謝您將文章看到最後。

沒有留言:

張貼留言