# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。