只遷移一個 cm庫,目標庫是2.4.8版本,原庫是2.4.6版本,所以採用了熱備的方式來遷移。
官方文檔上寫得非常簡單的說:
代碼如下 |
複製代碼 |
mongodump –host mongodb.example.net –port 27017
|
mongorestore –port但是真做起來各種坑,主要還是使用者權限的問題。
最開始,cm庫裡面只有一個使用者cm, 它的許可權是readWrite和dbAdmin,
所以匯出時,還要指定另外一個參數: –authenticationDatabase cm 表示此使用者在cm庫中,不在admin庫中。。。
此使用者有資料的讀寫權限,但是卻沒有db.system.users表的讀取許可權,所以在匯出users表時提示沒有許可權。
gg了一下,原來需要userAdmin許可權。。這個許可權未免太高了點吧。
於是添加一個dump使用者:
代碼如下 |
複製代碼 |
use cm; db.addUser( { user: “dump”,pwd: “123456″,roles: [ "readWrite", "userAdmin" ]} ) |
用以下命令很快就完成了匯出:
代碼如下 |
複製代碼 |
./bin/mongodump -u dump -p –authenticationDatabase cm –db cm –out /data/dump |
匯入的時候呢?
目標庫只在admin庫中有一個root使用者,許可權是userAdminAnyDatabase,
嘗試用root使用者匯入,失敗。。。
難道也要在cm庫中建立一個具有readWrite和userAdmin的dump使用者?
那在匯入的時候,會不會覆蓋目標庫的system.users表?值得一測。
於是在目標庫建立了使用者dump,密碼是111111,與原庫的dump密碼不同。
匯入:
代碼如下 |
複製代碼 |
./bin/mongorestore -u dump -p –authenticationDatabase cm –db cm /home/zhaokunyao/dump/cm |
會有提示:
Tue Nov 19 20:03:10.213 warning: Restoring to cm.system.users without dropping. Restored data will be inserted without raising errors; check your server log
server log木有和user表有關的資訊…
最終的結果是:
目標庫的users表和源庫的users表合并了。
源庫的使用者都匯入到了users表,除了dump使用者。 目標庫的dump使用者密碼仍舊是111111。
註:db.system.users表上有unique key(user)
最後把二個庫的dump使用者刪除,收工,共7分鐘。
在遷移的過程中還發現一個小問題:
按照正常方式安裝mongdb,串連之後報以下Warning:
Mon Nov 18 17:36:26.641 [initandlisten] ** WARNING: You are running on a NUMA machine.
Mon Nov 18 17:36:26.641 [initandlisten] ** We suggest launching mongod like this to avoid performance problems:
Mon Nov 18 17:36:26.641 [initandlisten] ** numactl –interleave=all mongod [other options]
要求用 numactl –interleave=all mongod的方式來啟動mongod.