步骤
本地安装 mongodb
可以使用下载安装包,并添加到 bin 下的方法,也可以参考blog.csdn.net/Dream_Flyin… 这样一键式安装方法。
安装好后,执行 mongod -h 查看是否在环境变量中。
备份数据库
使用 mongodump 命令执行
mongodump -h <host>:<port> -d <dbname> -o <outputpath> -u <user> -p <password> authenticationDataBase=admin
就会在 outputpath 下生成备份的数据库文件,一般情况下按照数据库划分为不同的文件夹。
恢复数据
使用 mongorestore 命令执行
mongorestore -h <host><:port> -d <dbname> -p <user> -p <password> <path>
即使用 path 下备份的数据恢复到 host:port 的 mongodb 数据库下。命令行输出中可以看到xx restore successfully的字样。
docker 安装
目标服务器下安装docker,使用官网的安装方式比较麻烦,可以采用如下命令一键安装:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
并执行 docker --version 查看是否安装成功
拉取并运行 mongodb 镜像
拉取 mongodb 镜像
docker pull mongo:latest
运行容器
docker run -itd --name mongo-test -v yourdb:/data/db -p 3217:27017 mongo --auth
进入容器
docker exec -it mongo-test bash
将数据 copy 到容器内
docker cp ./sourcedir/ mongo-test:/targetdir/
查看 mongodb 服务是否运行
ps -aux | 'mongo'
如图,第一行是执行启动 mongoDB 的命令,--auth 是开启 auth 校验,这是由于我们启动容器时添加了
--auth 的参数;
--bind_ip_all 是绑定所有ip,关于绑定ip 设置会影响是否可以通过远程访问到 docker 容器中 mongodb,具体可以参考:www.mongodb.com/docs/manual… ,但是我们启动的最新版的 mongodb docker 容器时自动添加这个 --bind_ip_all 参数的。
所以整体步骤:
- docker pull mongo:v4.22。注意版本,笔者迁移的版本比较旧,最新的可以用 latest。
- docker run -itd --name mongo-test -v yourdb:/data/db -p 3217:27017 mongo --auth
- docker cp ./dump/ mongo-test:/tmp/dump/
- docker exec -it mongo-test bash
- 输入 mongo 进入mongo shell。执行 use admin,db.createUser( {user: "root",pwd: "xxx",roles: [ { role: "root", db: "admin" } ]})
- 执行 mongoRestore -u root -p xxx --authenticationDatabase=admin /temp/dump/
一个坑:注意第5步,不能设置role 为 userAdminAnyDatabase,否则第6步restore时会报错,详情参考:stackoverflow.com/questions/2…
一些注意点
--auth
当启动 mongodb 时,如果指定 --auth 参数时,在进入到 mongosh 的命令行中时,应该先执行,才能操作数据库。
db.auth('user', 'password')
账号密码
mongoDB 有一个 admin 的权限数据库管理所有的账号,所以在操作数据库时,这个非常关键。
笔者在做迁移时就没搞清楚,导致迁移时踩坑了。后来看到这篇文章所讲的www.i4k.xyz/article/wei… 才搞懂原来登录时应该用 admin 下 role 为 root 的账号,具体如何查找,可以先进入到 mongo shell 下,执行:
admin> show users
[
{
_id: 'admin.root',
userId: UUID("1b211bfa-be05-4c97-a0aa-b7b604cf4201"),
user: 'root',
db: 'admin',
roles: [ { role: 'root', db: 'admin' } ],
mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
}
]
如何忘记密码想更换密码,可以使用:
admin> db.addUser('root','111')
当已存在
root账户时,会更新该账户密码。
或者
> db.changeUserPassword('root','111');
当我们执行 mongodump 和 mongorestore 时指定的 -u 和 -p 就应该是上述 admin 数据库下 user 为 root 的账号及密码。登录 studio 3T 时用的账号也是这个:
云服务器设置端口访问策略
笔者设置的是 3217 作为 mongodb 的端口号