只迁移一个 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.