记一次mongodb迁移过程

参考文章     

最新最详细的linux当中安装mongodb教程_linux安装mongodb详细教程-CSDN博客

Linux安装mongodb数据库最新版(全网最细)_mangdb 官网-CSDN博客

MongoDB数据迁移、备份和恢复 - MongoDB从入门到删库 - 简书 (jianshu.com)

 MongoDB 如何将 MongoDB 转移到另一个服务器|极客笔记 (deepinout.com)

因为种种原因,要把一个生产环境的mongodb迁移,虽说不难,还是折腾了一下。

步骤:

1. 版本确认

        进入mongo安装目录bin

 cd bin
 ./mongo -version

 

        原机器mongo版本是4.2.1。这个版本就找不到,没办法找了一个最接近的4.2.3进行安装。

  2.  创建目录

        按说明,默认情况下,MongoDB使用mongod用户帐户运行,并使用以下默认目录:

  • /var/lib/mongo (数据目录)
  • /var/log/mongodb (日志目录)

我不想用这个,所以新建目录

 mkdir data
 mkdir log
 cd logs
 touch mongodb.log

3. 环境变更

        按教程,现在应该设置环境变量。包括mongodb.conf配置文件:

#指定数据库路径
dbpath=/usr/local/mongodb/data
#指定MongoDB日志文件
logpath=/usr/local/mongodb/logs/mongodb.log
# 使用追加的方式写日志
logappend=true
#端口号
port=27017 
#方便外网访问
bind_ip=0.0.0.0
fork=true # 以守护进程的方式运行MongoDB,创建服务器进程
#auth=true #启用用户验证
#bind_ip=0.0.0.0 #绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定则默认本地所有IP

设置 MongoDB 环境变量

vim /etc/profile
#增加以下内容
export MONGODB_HOME=/usr/local/mongodb
export PATH=$MONGODB_HOME/bin:$PATH

 但我在生产环境上查找,全没有...

cat /etc/profile中展示了java环境变量,etc下,有mongo.conf文件(旧版本使用)。
cat /etc/profile

echo 环境变量也没发现设置,印象中linux有三种方式设置环境变更,都检查了遍,也没找到。纠结下,还是决定按生产机器的来,毕竟是迁移,尽量保证环境一致。其实启动命令里都有(如下),只是这种设置是好是不好,不好评价,不知道当时配置的人是什么情况,各人喜欢吧。

cd /xx/bin
./mongod --dbpath /home/xx/data/ --logpath /home/xx/log/mongodb.log --auth --port 27017 --bind_ip 0.0.0.0 --fork
 4. 启动服务

启动服务教程里有两种方式:

#方式一,linux内置的systemctl 命令
sudo systemctl start mongod
#方式二,conf
mongod -f /etc/mongodb.conf

既然我环境变量都没配置,那就别整这些了。用原先的方式启动。 可以通过命令查看启动是否成功。

netstat -tanp | grep 27017
 5. 建库、用户 

进入bin目录后,输入./mongo,进入mongo。

#使用库,没有则新建
use appmanage
#建立用户
db.createUser({
  user: "xxx",
  pwd: "xxx",
  roles: [ { role: "readWrite", db: "appmanage" } ]
})

这里出错:not authorized on appmanage to execute command。权限不够,因为我用的不是linux的root用户,所以怀疑是这个。切换root登录mongo,还是一样。再查询下,有说要用admin。于是在mongo中执行user admin,再执行还不行。最后查到,有说明第一次启动时把权限验证去掉,配置完成后再开启。而我启动命令中刚好都有,自己把自己限制住了。关掉以无权限方式重启,再执行,果然没问题了。

 6. 导出导入

 迁移有mongoexport、mongoimport和mongodump、mongorestore两组命令。export还要指定集合,明显不合适,我需要的是整个迁移,mongodump更合适。

#在生产机器上的bin目录下执行
./mongodump --host 192.168.1.10 --port 27017 -u xxx -p xxx --authenticationDatabase appmanage --out /back/mo
#打包压缩
tar -cvf appmanage.tar appmanage


#在迁移机器远程取文件
scp root@192.168.1.10:/back/mo/appmanage.tar ./
#解压缩
tar -xvf appmanage.tar 
#在迁移机器上的bin目录下执行
 ./mongorestore --host 192.168.1.100 --port 27017 -u xxx -p xxx --authenticationDatabase appmanage --drop /back/mo/appmanage

导出比较耗时,但还顺利,导出的都是按表划分的json\bson文件。导入时报错:don't know what to do with file。查询了一下,这是目录结构不一致导致的。

简单说,我导出时到mo目录下,它生成了appmanage(实例名)目录。我导入时也应该指定到appmanage的上层目录,mo,不能是appmanage目录。修改命令:

./mongorestore --host 192.168.1.100 --port 27017 -u xxx -p xxx --authenticationDatabase appmanage --drop /back/mo

之后就正常了。可以通过工具连接查看导入的表。

总结:
  1. 迁移我优先保证的是两台机器环境尽可能一致,因此提前准备了一台和生产环境一样的机器,还有很多配置检查确认的工作,再结合教程比对,决定哪些修改,哪些保留,很费时间。
  2. 原版本的安装文件没有,也很麻烦。考虑以后强制要求服务器装好,安装文件都要保留一份,或者做个镜像备份,能够快速在另一台机器上恢复,这样备份、迁移的工作就会简单很多了。
  3. 导出过程比我预计的要顺利,因为遇到过too many files open这一错误,我担心导出时读取文件过多,会出现问题。特意找了晚上的时间执行。结果很顺利,可能在底层还是做了一些优化,和平时读取使用不太一样。而对于too many files open这个问题,我看解决方案都是增大允许打开的文件数,问下知道的网友:除了这个方式,还有没有更加治本的方案呢?
  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值