加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

MongoDB自动备份全进程实录

发布时间:2019-05-15 15:02:47 所属栏目:编程 来源:itmuch
导读:前段时刻,小我私人小措施 因处事器磁盘空间被占满,导致MongoDB挂了。整理了一些无用的数据后,重启MongoDB,竟然无法启动,一番折腾(20分钟)后,总算修复了。这让我意识到:固然是小我私人小项目,但也必需按期备份啊,不然数据丢了很忧伤的说。 碎碎念 我不是Mo

MongoDB自动备份全进程实录

前段时刻,小我私人小措施 因处事器磁盘空间被占满,导致MongoDB挂了。整理了一些无用的数据后,重启MongoDB,竟然无法启动,一番折腾(20分钟)后,总算修复了。这让我意识到:固然是小我私人小项目,但也必需按期备份啊,不然数据丢了很忧伤的说。

碎碎念

我不是MongoDB好手,之以是选择MongoDB,是由于需求不明晰——MongoDB很得当不明晰需求场景的开拓。

小我私人对Elasticsearch更认识,Elasticsearch也很得当不定需求的营业开拓;但小我私人处事器只有1G内存,用Elasticsearch得进级处事器,得花许多几何钱啊啊啊。

MongoDB备份较量简朴,只需用内置的 mongodump 即可,呼吁名目如下:

  1. mongodump -h {mongodb主机名}:{端口} -u {账号} -p {暗码} -d {数据库名称} -o {存储路径} 

然而,笔者为MongoDB配置的暗码是带有非凡字符的,譬喻 @#$ 之类,直接以如上情势执行呼吁,会报错!

以是笔者选择不带 -p 参数执行呼吁,即:

  1. mongodump -h {mongodb主机名}:{端口} -u {账号} -d {数据库名称} -o {存储路径} 

然后,呼吁提醒符会提醒输入暗码。譬喻

  1. # mongodump -h 127.0.0.1 -u user -d itmuch -o /tmp/somepathEnter password: 

至此已实现MongoDB的备份。然而,手动备份照旧挺贫困的,怎么实现备份的自动化呢?

自动备份

正常来说,自动备份是较量简朴的——只需将手动备份的呼吁做成Shell剧本,并配置按时使命即可。然而,笔者的场景,呼吁是必要交互式输入暗码的啊!

怎么才气自动输入暗码呢?expect 登场了——一款提供自动交互的器材。

安装expect

  1. yum install -y expect 

编写expect剧本

expect语法很是简朴,和Shell险些一样。笔者的剧本编写如下:

  1. #!/bin/expect 
  2. # spawn是expect的语句,执行呼吁前需添加该字眼 
  3. set DATE [exec date "+%Y-%m-%d"] 
  4. set DIR /xxxxx/dbbak-$DATE 
  5. spawn rm -rf $DIR 
  6. spawn echo 'removing...$DIR' 
  7. spawn mongodump -h {host:port}  -u {user} -d {dbname} -o $DIR 
  8. # 交互获取是否返回password:要害字 
  9. expect "password:" 
  10. # 将暗码发送已往,留意最后的换行不能少,不然得人工输入回车。 
  11. send "暗码r" 
  12. # 逗留在长途节制台,没有这行就会直接返回当地节制台,而不等shell执行完 
  13. interact 

注释很全面了,智慧的你阅读必定没有压力。最终备份出来的文件会存放在 /xxxxx/dbbak-备份日期 目次中。

自动备份

笔者操作Linux按时使命实现自动执行。

  1. crontab -e 

在新窗口中添加如下内容:

  1. 0 0 1 * * ? /usr/bin/expect 上面expect shell的完备路径 

本来觉得这样就可以按时执行了,然而却无法正常执行。

百度后,将剧本修改为如下,终于可以正常执行了。

  1. #!/bin/expect 
  2. # spawn是expect的语句,执行呼吁前需添加该字眼 
  3. set DATE [exec date "+%Y-%m-%d"] 
  4. set DIR /xxxxx/dbbak-$DATE 
  5. spawn rm -rf $DIR 
  6. spawn echo 'removing...$DIR' 
  7. spawn mongodump -h {host:port}  -u {user} -d {dbname} -o $DIR 
  8. # 交互获取是否返回password:要害字 
  9. expect "password:" 
  10. # 将暗码发送已往,留意最后的换行不能少,不然得人工输入回车。 
  11. send "暗码r" 
  12.  
  13. set timeout 120 
  14. expect eof 
  15.  
  16. exit 

总结

本文没什么难点,都是一些细节——

  • 由于暗码含有非凡字符,以是必要交互式输入暗码;
  • 由于要交互式输入暗码,以是行使了expect

写出来首要是总结下踩到的坑,其它,expect是一款通用的提供自动交互的器材,用来实现ssh的自动登录、sftp的自动登录、mysql的自动登录等。剧本的套路都和本文展示的布局根基相同。

【编辑保举】

  1. 10个顶级Mongodb GUI器材,以图形方法打点数据库
  2. 10个顶级Mongodb GUI器材,以图形方法打点数据库
  3. 七步操纵!教你正确改换MySQL数据库字符集
  4. 高可用数据库主从复制延时的办理
  5. 办理线上数据库死锁,就是这么简朴!
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读