为MongoDB服务器配置备份脚本

有效管理数据、服务和信息对一个公司的成功至关重要。在数据日益增长的世界里,选择正确的数据管理解决方案比以往更加重要。MongoDB 是一个新兴的开源 NoSQL 数据库,可用于海量数据管理。它提供了高性能、高可用性和易于扩展的特性。数据管理的一个关键要素是定期执行备份,预防数据丢失,而且不应手动完成此项工作。可使用多种不同方法在 MongoDB 中执行备份,但本文只展示了如何使用 mongodump 和 mongorestore 配置和运行备份脚本。

[[202048]]

设置 MongoDB 实例

执行以下步骤,设计可通过 cron 作业自动运行的 MongoDB 备份脚本。可根据业务需求来自定义备份脚本。

备注:要跟随本教程中的步骤进行操作,请创建一个单独的用户(例如名为 mongo 的用户),在 MongoDB 中执行管理操作。

1、从 MongoDB Download Center 安装 MongoDB。MongoDB 二进制文件位于 /opt/mongodb/mongodb/bin/ 目录中。安装 MongoDB 时使用 root 用户凭证。

2、以 root 用户身份进行登录,然后创建一个组和用户: 

  1. # groupadd mongogrp 
  2. # vi /etc/group 
  3. mongogrp:x:1005: 

3、将用户 mongo 添加到刚创建的组 mongogrp 中:

  1. # useradd mongo -d /home/mongo -f -1 -g mongogrp -m 

4、验证是否已创建该用户: 

  1. # cd /home 
  2. # ls -l 
  3. drwxr-xr-x 2 mongo mongogrp 4096 Oct 18 07:25 mongo 
  4. vi /etc/passwd 
  5. mongo:x:1005:1005::/home/mongo: 

5、设置用户 mongo 设置密码:

  1. # passwd mongo 

调用 MongoDB shell

1、打开一个新会话并以用户 mongo 登录:

  1. $ sudo su – mongo 

2、找到 MongoDB 安装的 bin 目录: 

  1. $ cd /opt/mongodb/mongodb/bin/ 
  2. $ ls 
  3. bsondump mongo mongod mongodump mongoexport mongofiles mongoimport 
  4. mongooplog mongoperf mongorestore mongos mongosniff mongostat mongotop 

3、要运行这些实用程序,bin 目录必须对用户 mongo 具有适当的访问权 。使用 root 用户凭证,并为 mongo 用户提供对 bin 目录的适当访问权。

4、验证第 2 步中所示的实用程序是否位于 bin 目录下。

5、调用 MongoDB shell 时有两个选项:一个使用 SSL,一个不使用 SSL。下面给出了两个选项的使用说明。

a、要调用 MongoDB shell,请使用以下选项运行 mongo 命令:

  1. $ ./mongo - - host pre-mongo01.ibmcloud.com - - port 27017 

如果不使用 SSL 调用 MongoDB shell,请使用以下选项运行 mongo

b、命令: 

  1. $ ./mongo --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem--sslPEMKeyPassword 
  2. password123 pre-mongo01.ibmcloud.com:27017 

其中: 

  1. Certification file :/opt/mongodb/mongodb/cert/mongo.server.trust-certs.pem 
  2. password123 :sslPEMKeyPassword 
  3. port no :27017 
  4. Hostname :pre-mongo01.ibmcloud.com 

备注:在这里,您将获得 MongoDB shell V3.2。现在可以执行各种操作了。

本文使用 SSL 执行 MongoDB 命令和实用程序。 

  1. > show dbs 
  2. testdb1 0.800GB 
  3. local 0.000GB 
  4. mydb 0.300GB 

MongoDB 备份和还原功能

要备份 MongoDB 数据库,请使用 mongodump 实用程序,它位于 bin 目录中。这会将所有数据都备份到默认位置 /bin/dump 上的 dump 文件夹中。MongoDB 使用默认端口 27017。可以使用实用程序 mongodump 执行热(在线)和冷(离线)备份。

离线 MongoDB 备份

MongoDB 服务器有一个主要的守护进程,名为 mongod 。 Mongod 管理数据访问、数据请求和后台操作。要执行离线备份,首先要停止 mongod 服务,这会停止 MongoDB 实例。然后,执行备份并启动 MongoDB 实例。

要创建离线 MongoDB 备份,请执行以下操作:

创建一个备份目录。基于 MongoDB 数据库的大小,在各个备份位置创建备份目录。在这里,将备份目录创建为 /mongo_data/backup: 

  1. # mkdir /mongo_data/backup  
  2. # ls –l 

2、将所有者更改为用户 mongo : 

  1. # chown -R mongo:mongogrp /mongo_data/backup/  
  2. # ls –l 

3、停止 mongod 实例:

  1. service mongod stop 

4、执行离线备份。首先,以 mongo 用户身份进行登录并找到 bin 目录: 

  1. $ pwd 
  2. /opt/mongodb/mongodb/bin 
  3. $./mongodump --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem 
  4. --sslPEMKeyPassword password123 --host pre-mongo01.ibmcloud.com:27017 --out /mongo_data/backup/ 

5、启动 mongod 实例,方法是键入 service mongod start 。

在线 MongoDB 备份

要执行在线备份,请连续运行 mongodump 命令,然后重新启动 mongod 实例。可以使用或不使用 SSL 来运行此命令。两个命令都在下方给出。

要使用 SSL 执行 mongodump 命令,该命令看起来类似于: 

  1. $./mongodump --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem 
  2. --sslPEMKeyPassword password123 --host pre-mongo01.ibmcloud.com:27017 --out /mongo_data/backup/ 

要不使用 SSL 执行 mongodump 命令,该命令看起来类似于:

  1. $ ./mongodump -- host pre-mongo01.ibmcloud.com --port 27017 --out /mongo_data/backup/ 

使用 mongodump 执行小型分片集群备份

如果分片集群包含一个小数据集,可以使用 mongodump 连接到 mongos 。

在 MongoDB 分片集群中, mongodump 是处理来自应用层的查询的路由服务。为了执行该操作,它会确定此数据在分片集群中的位置。

如果基础架构可以在合理的时间量内执行完整备份,而且一个存储系统可以保存整个 MongoDB 数据集,那么可以创建 MongoDB 集群备份。默认情况下, mongodump 向非主要节点发出其查询。

要对分片集群执行备份,请使用 mongodump ,如以下命令所示:

  1. $ ./mongodump -- host pre-mongo01.ibmcloud.com --port 27017 

备注:在 mongodump 捕获输出期间,应用程序可以继续修改数据。对于副本集, mongodump 提供了 –oplog 选项,以便包含在执行 mongodump 操作期间生成的输出 oplog 条目。这允许相应的 mongorestore 操作重放捕获到的 oplog。要还原使用 –oplog 创建的备份,请使用 mongorestore 和 –oplogReplay 选项。但是,对于副本集,可以考虑 MongoDB Cloud Manager 或 Ops Manager。

恢复场景

如果知道故障是如何发生的和如何从故障中恢复,那么可以更好地规划和避免故障场景。以下各节将模拟不同类型的故障,并给出在您的环境中出现其中一种故障时可以执行的一系列步骤。

场景 1.整个数据库意外丢弃或受损坏

人为错误或硬件故障可能损害或损坏整个数据库。如果出现这种情况,可以应用 mongodump 的***一次完整备份恢复整个数据库,并使用 mongorestore 实用程序还原它。

在此场景中,我们假设数据库为 testdb1,其中的集合(比如 users 和 students)包含一些记录,如下所示。

第 1 步.验证数据库和集合

a、以 mongo 用户身份进行登录:

  1. $ sudo su – mongo 

b、找到 bin 目录:

  1. $ cd /opt/mongodb/mongodb/bin/ 

c、调用 MongoDB shell:

  1. $ ./mongo --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem --sslPEMKeyPassword password123 pre-mongo01.ibmcloud.com:27017 

d、验证数据库和集合: 

  1. > show dbs 
  2.  testdb1 0.800GB 
  3. local 0.000GB 
  4. mydb 0.300GB 
  5. > use testdb1 
  6. switched to db testdb1 
  7. > show collections 
  8. student 
  9. users 
  10. > db.student.find({},{_id:0}) 
  11. "rollno" : 1, "name" : "amol""subject" : "english""marks" : 90 } 
  12. "rollno" : 2, "name" : "rachna""subject" : "english""marks" : 85 
  13.     } 
  14. "rollno" : 3, "name" : "Bob""subject" : "english""marks" : 75 } 
  15. > db.users.find({},{_id:0}) 
  16. "name" : "Amol""age" : 39 } 
  17. "name" : "Bob""age" : 30 } 
  18. "name" : "Rachna""age" : 36 } 
  19. "name" : "Aadya""age" : 3 } 

第 2 步.备份整个数据库

使用以下代码备份整个数据库: 

  1. $./mongodump --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem --sslPEMKeyPassword password123 --host pre-mongo01.ibmcloud.com:27017 –db testdb1 --out /mongo_data/backup/ 
  2.  
  3. 2017-01-24T04:14:07.252-0500 writing testdb1.student to 
  4. 2017-01-24T04:14:07.253-0500 writing testdb1.users to 
  5. 2017-01-24T04:14:07.254-0500 done dumping testdb1.student (3 documents) 
  6. 2017-01-24T04:14:07.254-0500 done dumping testdb1.users (3 documents) 

第 3 步.模拟故障

要模拟故障场景,需要完全丢弃数据库。

a、连接到数据库: 

  1. > use testdb1 
  2. switched to db mydb 

b、验证集合: 

  1. > show collections 
  2. student 
  3. users 

c、验证当前数据库: 

  1. > db 
  2. testdb1 

d、丢弃数据库: 

  1. > db.dropDatabase() 
  2. "dropped" : "testdb1""ok" : 1 } 

第 4 步.还原数据库 testdb1

使用实用程序 mongorestore 还原备份镜像,如下所示。在此示例中,还原的***备份镜像位于备份位置 /mongo_data/backup/testdb1 。 

  1. $ ./mongorestore --ssl --sslCAFile 
  2. ../cert/mongo.server.trust-certs.pem --sslPEMKeyPassword password123 --host 
  3. pre-mongo01.ibmcloud.com:27017 --db testdb1 /mongo_data/backup/testdb1 

第 5 步.验证数据库和集合

要验证数据库是否已还原,请连接到数据库并查询集合: 

  1. > show dbs 
  2. testdb1 0.800GB 
  3. local 0.000GB 
  4. mydb 0.300GB 
  5. > use testdb1 
  6. switched to db testdb1 
  7. > show collections 
  8. student 
  9. users 
  10. > db.student.find({},{_id:0}) 
  11. > db.users.find({},{_id:0}) 

场景 2.意外丢弃某个集合

有时,尤其是在数据库中有成千上万个集合时,可能会意外丢弃某个集合。要恢复意外丢弃的集合,需要使用备份位置上该集合(例如 collection.name.bson )的***备份。在此场景中,我将介绍如何使用集合 student 执行这些功能,该集合遭到丢弃并使用 mongorestore 实用程序还原它。

第 1 步.验证集合

使用以下代码验证集合: 

  1. > use testdb1 
  2. switched to db testdb1 
  3. > show collections 
  4. student 
  5. users 
  6. > db.student.find({},{_id:0}) 
  7. "rollno" : 1, "name" : "amol""subject" : "english""marks" : 90 } 
  8. "rollno" : 2, "name" : "rachna""subject" : "english""marks" : 85 
  9. "rollno" : 3, "name" : "Bob""subject" : "english""marks" : 75 } 

第 2 步.备份集合

仅在集合级别上执行备份: 

  1. $./mongodump --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem--sslPEMKeyPassword password123 
  2. --host pre-mongo01.ibmcloud.com:27017 –db testdb1 --collection student --out /mongo_data/backup 

备注:确保在备份位置(例如 mongo_data/backup)上创建了一个文件 student.bson。

第 3 步.模拟故障

要模拟此故障,可完全丢弃该集合。

a、连接到数据库: 

  1. > use testdb1  
  2. switched to db testdb1 

b、丢弃集合: 

  1. > db.student.drop()  
  2. true 

c、验证内容是否已丢弃:

  1. > db.student.find({},{name:1,age:1,_id:0}) 

第 4 步.还原集合 

  1. $./mongorestore --ssl --sslCAFile 
  2. ../cert/mongo.server.trust-certs.pem --sslPEMKeyPassword 
  3. password123 --host pre-mongo01.ibmcloud.com:27017 --db mydb --collection student 
  4. /mongo_data/backup/testdb1/student.bson 

备注:可以使用 mongodump 执行数据库级备份,如有需要,可以仅从备份目录还原所需的集合。

第 5 步.验证集合

要验证集合是否已还原,请连接到数据库并查询该集合: 

  1. > use testdb1 
  2. switched to db testdb1 
  3.  
  4. > show collections 
  5. student 
  6. users 
  7.  
  8. > db.student.find({},{_id:0}) 
  9. "rollno" : 1, "name" : "amol""subject" : "english""marks" : 90 } 
  10. "rollno" : 2, "name" : "rachna""subject" : "english""marks" : 85 
  11. "rollno" : 3, "name" : "Bob""subject" : "english""marks" : 75 } 

使用一个 crob 作业创建和运行备份脚本

要根据业务需求设置备份策略,需要设置自定义的备份脚本: run_backup.sh 。还需要设置一个 cron 作业来运行此备份。

创建备份脚本

下面的样本备份脚本 run_backup.sh 基于以下条件。

  • 该脚本首先从备份位置删除超过 30 天的备份镜像。它在备份位置对所有数据库执行每日备份。
  • 然后该脚本向日志文件 backup.log 写入注释,表明备份操作删除了哪些内容以及执行备份的时间。默认情况下, mongodump 不会捕获本地数据库的内容。如有需要,应该单独添加它。要使用应用程序名称唯一地标识各个数据库备份,必须在备份脚本中定义一些参数。下一节将展示此操作。

创建一个备份目录

以 root 用户身份进行登录:

  1. # mkdir /mongo_data/backup 

将所有者更改为 mongo 用户:

  1. # chown -R mongo:mongogrp /mongo_data/backup 

以 mongo 用户身份进行登录: 

  1. mongo@pre-mongo01 
  2. $pwd 
  3. /mongo_data/backup 

创建备份脚本:

  1. mongo@pre-mongo01:/mongo_data/backup$ vi run_backup.sh 

以下代码给出了备份脚本的样本内容: 

  1. #/bin/bash 
  2. cd /opt/mongodb/mongodb/bin/ 
  3. echo `date` >>/mongo_data/backup/backup.log 
  4. APP_NAME="app1" 
  5. MONGO_HOST="pre-mongo01.ibmcloud.com" 
  6. MONGO_PORT="27017" 
  7. TIMESTAMP=`date +%F-%H%M` 
  8. MONGODUMP_PATH="/opt/mongodb/mongodb/bin/mongodump" 
  9. BACKUPS_DIR="/mongo_data/backup/$APP_NAME-$TIMESTAMP" 
  10. BACKUP_NAME="/mongo_data/backup/$APP_NAME-$TIMESTAMP" 
  11. mkdir -p $BACKUPS_DIR 
  12. cd /opt/mongodb/mongodb/bin/ 
  13. #Delete all backups older than 30 days from /mongo_data/backup 
  14. echo "Deleting following backup files older than 30 days:" >> 
  15.     /mongo_data/backup/backup.log 
  16. find /mongo_data/backup/ -type d -name 'app1-*' -mtime +30 >> 
  17.     /mongo_data/backup/backup.log 
  18. find /mongo_data/backup/ -type d -name 'app1-*' -mtime +30 -exec rm -rf {} 
  19.     + 
  20. #Run the daily backup 'local' database only
  21. for databaseName in local 
  22. do 
  23. echo "Starting daily backup of $databaseName ...." >> 
  24.     /mongo_data/backup/backup.log 
  25. ./mongodump --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem 
  26.     --sslPEMKeyPassword password123 --host pre-mongo01.ibmcloud.com:27017 --db 
  27.     $databaseName >>/mongo_data/backup/backup.log 
  28. #Run the daily backup of remaining databases. 
  29. echo "Starting daily backup of all databases...." >> 
  30.     /mongo_data/backup/backup.log 
  31. ./mongodump --ssl --sslCAFile ../cert/mongo.server.trust-certs.pem 
  32.     --sslPEMKeyPassword password123 --host pre-mongo01.ibmcloud.com:27017 
  33.     >>/mongo_data/backup/backup.log 
  34. if [ $? != 0 ]; then 
  35. echo "Failed to make backup of $databaseName on `date +%F_%T`"|mailx -s 
  36.     "MongoDB backup failed" amolbarsagade@in.ibm.com 
  37. fi 
  38. done 
  39. mv /opt/mongodb/mongodb/bin/dump $BACKUP_NAME 
  40. echo `date` >> /mongo_data/backup/backup.log 
  41. echo "End of backup run" >> /mongo_data/backup/backup.log 
  42. echo "----------------------------------" >> 
  43.     /mongo_data/backup/backup.log 

授予权限

保存该文件并向它授予 755 权限:

  1. mongo@pre-mongo01:/mongo_data/backup$ chmod 755 run_backup.sh 

创建一个 cron 作业来运行备份脚本

在 mongo_data/backup 位置创建一个名为 mycron.txt 的新 cron 作业,并根据备份策略来调度它。

以 mongo 用户身份进行登录: 

  1. mongo@pre-mongo01 
  2. :/mongo_data/backup$ pwd 
  3. /mongo_data/backup 

检查 mongo 用户的现有 cron 作业: 

  1. mongo@pre-mongo01:/mongo_data/backup$ crontab -l 
  2. no crontab for mongo 

创建一个新 cron 作业:

  1. mongo@pre-mongo01:/mongo_data/backup$ vi mycron.txt 

根据备份策略添加运行此 crob 作业的备份时间表。例如:

  1. 30 02 * * * /mongo_data/backup/run_backup.sh >> /mongo_data/backup/run_backup.sh.out 

设置 cron 作业并验证它: 

  1. mongo@pre-mongo01:/mongo_data/backup$ crontab mycron.txt 
  2. mongo@pre-mongo01:/mongo_data/backup$ crontab -l 
  3. 30 02 * * * /mongo_data/backup/run_backup.sh >> 
  4. /mongo_data/backup/run_backup.sh.out 

结束语

您已为 MongoDB 数据库服务器配置并运行了备份脚本,并更好地了解了如何使用 mongodump 和 mongorestore 实用程序执行备份和还原。您使用一个 cron 作业调度并运行了备份脚本。可以使用该备份脚本来调度、维护和管理 MongoDB 数据库服务器的备份。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/284225.html<

(0)
运维的头像运维
上一篇2025-05-14 07:21
下一篇 2025-05-14 07:22

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注