云服务器 docker 迁移 mongodb 数据库

575 阅读3分钟

步骤

本地安装 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的字样。

image.png

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'

image.png 如图,第一行是执行启动 mongoDB 的命令,--auth 是开启 auth 校验,这是由于我们启动容器时添加了 --auth 的参数; --bind_ip_all 是绑定所有ip,关于绑定ip 设置会影响是否可以通过远程访问到 docker 容器中 mongodb,具体可以参考:www.mongodb.com/docs/manual… ,但是我们启动的最新版的 mongodb docker 容器时自动添加这个 --bind_ip_all 参数的。

所以整体步骤:

  1. docker pull mongo:v4.22。注意版本,笔者迁移的版本比较旧,最新的可以用 latest。
  2. docker run -itd --name mongo-test -v yourdb:/data/db -p 3217:27017 mongo --auth
  3. docker cp ./dump/ mongo-test:/tmp/dump/
  4. docker exec -it mongo-test bash
  5. 输入 mongo 进入mongo shell。执行 use admin,db.createUser( {user: "root",pwd: "xxx",roles: [ { role: "root", db: "admin" } ]})
  6. 执行 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… 才搞懂原来登录时应该用 adminroleroot 的账号,具体如何查找,可以先进入到 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');

当我们执行 mongodumpmongorestore 时指定的 -u-p 就应该是上述 admin 数据库下 user 为 root 的账号及密码。登录 studio 3T 时用的账号也是这个:

image.png

云服务器设置端口访问策略

笔者设置的是 3217 作为 mongodb 的端口号

image.png