您好,登录后才能下订单哦!
# Linux下怎么通过Shell脚本自动备份MongoDB
## 前言
在数据驱动的时代,数据库备份是系统运维中不可或缺的重要环节。MongoDB作为流行的NoSQL数据库,其数据备份尤为重要。本文将详细介绍如何在Linux环境下通过Shell脚本实现MongoDB的自动化备份,涵盖单机部署和副本集环境的备份方案,并讨论备份策略优化和常见问题处理。
## 一、准备工作
### 1.1 环境要求
- Linux服务器(本文以Ubuntu 20.04为例)
- 已安装MongoDB(3.6+版本)
- 基本的Shell脚本编写能力
- `mongodump`工具(通常随MongoDB安装包自带)
### 1.2 工具安装确认
```bash
# 检查mongodump是否可用
which mongodump
# 查看版本
mongodump --version
创建mongobackup.sh
文件:
#!/bin/bash
# 基础变量定义
BACKUP_DIR="/data/backup/mongodb"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="mydatabase"
USERNAME="admin"
PASSWORD="yourpassword"
# 创建备份目录
mkdir -p $BACKUP_DIR/$DATE
# 执行备份
mongodump --host 127.0.0.1 --port 27017 \
-u $USERNAME -p $PASSWORD \
--authenticationDatabase admin \
--db $DB_NAME \
--out $BACKUP_DIR/$DATE
# 检查执行结果
if [ $? -eq 0 ]; then
echo "$(date) - MongoDB备份成功" >> $BACKUP_DIR/backup.log
else
echo "$(date) - MongoDB备份失败" >> $BACKUP_DIR/backup.log
exit 1
fi
添加压缩和保留期限功能:
#!/bin/bash
# 增强版配置
BACKUP_ROOT="/data/backup/mongodb"
MAX_DAYS=7 # 保留最近7天备份
COMPRESS=true
# 获取当前时间
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="$BACKUP_ROOT/$TIMESTAMP"
# 创建目录
mkdir -p $BACKUP_DIR
# 备份所有数据库
mongodump --host 127.0.0.1 --port 27017 \
-u $USERNAME -p $PASSWORD \
--authenticationDatabase admin \
--out $BACKUP_DIR
# 压缩备份
if [ "$COMPRESS" = true ]; then
tar -zcvf $BACKUP_DIR.tar.gz $BACKUP_DIR
rm -rf $BACKUP_DIR
fi
# 清理旧备份
find $BACKUP_ROOT -name "*.tar.gz" -type f -mtime +$MAX_DAYS -delete
# 日志记录
echo "$(date) - 备份完成,保存位置: $BACKUP_DIR.tar.gz" >> $BACKUP_ROOT/backup.log
对于MongoDB副本集,建议从secondary节点备份:
#!/bin/bash
# 副本集配置
REPLICA_SET="myreplica"
SECONDARY_NODE="mongo2.example.com"
OPLOG=true # 是否包含oplog
mongodump --host $SECONDARY_NODE \
--oplog=$OPLOG \
--readPreference=secondary \
--out $BACKUP_DIR
分片集群需要备份所有分片和配置服务器:
#!/bin/bash
# 分片集群备份
SHARDS=("shard1.example.com" "shard2.example.com")
CONFIG_SERVERS=("cfg1.example.com" "cfg2.example.com")
# 备份每个分片
for shard in "${SHARDS[@]}"; do
mongodump --host $shard --out $BACKUP_DIR/shards/$shard
done
# 备份配置服务器
mongodump --host ${CONFIG_SERVERS[0]} \
--out $BACKUP_DIR/configsvr
设置每日凌晨2点执行备份:
# 编辑crontab
crontab -e
# 添加以下内容
0 2 * * * /bin/bash /path/to/mongobackup.sh
创建systemd服务更可靠:
/etc/systemd/system/mongobackup.service
:[Unit]
Description=MongoDB Backup Service
After=network.target
[Service]
Type=oneshot
User=mongodb
ExecStart=/bin/bash /path/to/mongobackup.sh
/etc/systemd/system/mongobackup.timer
:[Unit]
Description=Run MongoDB backup daily
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
systemctl enable mongobackup.timer
systemctl start mongobackup.timer
# 单库恢复
mongorestore --host 127.0.0.1 --port 27017 \
-u $USERNAME -p $PASSWORD \
--authenticationDatabase admin \
--db $DB_NAME \
$BACKUP_DIR/$DB_NAME
# 全量恢复
mongorestore --host 127.0.0.1 --port 27017 \
-u $USERNAME -p $PASSWORD \
--authenticationDatabase admin \
--drop \
$BACKUP_DIR
建议定期执行恢复测试:
#!/bin/bash
TEST_DB="backup_test"
TEST_DIR="/tmp/mongorestore_test"
# 复制备份文件到测试目录
cp -r $BACKUP_DIR $TEST_DIR
# 执行恢复
mongorestore --host 127.0.0.1 --port 27017 \
-u $USERNAME -p $PASSWORD \
--authenticationDatabase admin \
--db $TEST_DB \
$TEST_DIR/$DB_NAME
# 验证数据
mongo --host 127.0.0.1 --port 27017 \
-u $USERNAME -p $PASSWORD \
--authenticationDatabase admin \
$TEST_DB \
--eval "printjson(db.stats())"
备份文件权限:
chown -R mongodb:mongodb $BACKUP_ROOT
chmod -R 700 $BACKUP_ROOT
密码安全:
网络传输加密:
mongodump --ssl --host dbserver.example.com
错误信息:
Failed: error connecting to db server: server returned error on SASL authentication step: Authentication failed.
解决方案: - 确认用户名/密码正确 - 检查authenticationDatabase参数 - 验证用户角色是否有备份权限
预防措施: - 备份前检查磁盘空间 - 添加监控告警 - 定期清理旧备份
--numParallelCollections
参数3-2-1备份原则:
多级备份:
云存储集成:
# 上传到AWS S3示例
aws s3 cp $BACKUP_DIR.tar.gz s3://mybackupbucket/mongodb/
通过本文介绍的方法,您可以构建一个健壮的MongoDB自动备份系统。关键是要定期测试恢复流程,确保备份的有效性。随着业务增长,可能需要考虑更专业的备份工具如Percona Backup for MongoDB,但对于大多数场景,本文提供的Shell脚本方案已经足够。
最后更新:2023年11月 作者:数据库运维专家 版权声明:本文采用CC BY-NC-SA 4.0协议 “`
这篇文章共计约2150字,采用Markdown格式编写,包含代码块、章节标题和结构化内容,适合技术文档发布。如需调整内容长度或细节,可以进一步修改。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。