|
1 | 1 | #!/bin/bash |
2 | | -#The Shell script will be used for taking backup and send it to S3 bucket. |
| 2 | +# Shell script for MongoDB backup with pruning and S3 strategy |
3 | 3 |
|
4 | | -# TO list all Databases in mongodb databases |
5 | 4 | DATE1=$(date +%Y%m%d%H%M) |
6 | 5 | DATE=$(date +%d-%m-%y_%H-%M) |
| 6 | +MONTH=$(date +%b) |
| 7 | +backup_dir="/var/lib/backup/mongodb" |
| 8 | +mongodb_backup_dir="/var/lib/mongodb-backup" |
| 9 | +mongodb_data_dir="/root/mongodb_data" |
| 10 | +report_file="/tmp/mongodbbackup.txt" |
7 | 11 |
|
8 | | -mkdir -p /var/lib/backup/mongodb |
| 12 | +mkdir -p $backup_dir $mongodb_backup_dir $mongodb_data_dir |
9 | 13 |
|
10 | | -#Full Mongodb backup |
| 14 | +# Full MongoDB backup |
| 15 | +mongodump --host mongodb:27017 --authenticationDatabase admin -u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_PASSWORD" -o $mongodb_backup_dir |
11 | 16 |
|
12 | | -mongodump --host mongodb:27017 --authenticationDatabase admin -u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_PASSWORD" -o /var/lib/mongodb-backup/dump |
| 17 | +# List databases |
| 18 | +mongosh --quiet --host mongodb:27017 --eval "printjson(db.adminCommand('listDatabases'))" \ |
| 19 | + -u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_PASSWORD" \ |
| 20 | + | grep -i name | awk -F'"' '{print $4}' > /mongo_dbs.txt |
13 | 21 |
|
| 22 | +# Backup listed databases |
| 23 | +while read -r db; do |
| 24 | + echo "Creating backup for $db" |
| 25 | + mongodump --host mongodb:27017 --db "$db" --authenticationDatabase admin \ |
| 26 | + -u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_PASSWORD" -o $mongodb_backup_dir |
| 27 | +done < /mongo_dbs.txt |
14 | 28 |
|
15 | | -showdb(){ |
16 | | -mongo --quiet --host mongodb:27017 --eval "printjson(db.adminCommand('listDatabases'))" -u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_PASSWORD" | grep -i name | awk -F'"' '{print $4}' |
17 | | -} |
| 29 | +# Archive backups |
| 30 | +tar czf "$backup_dir/${SOURCE_NAME}_mongodb_db_backup_${DATE1}.tgz" $mongodb_backup_dir/. \ |
| 31 | + && rsync -avr /var/lib/mongodb/ $mongodb_data_dir/ \ |
| 32 | + && tar czf "$backup_dir/${SOURCE_NAME}_mongodb_data_backup_${DATE1}.tgz" $mongodb_data_dir/. |
18 | 33 |
|
| 34 | +# Upload backups to S3 (Daily Backup) |
| 35 | +if s3cmd put -r --no-mime-magic $backup_dir/ s3://"${S3_BUCKET_MONGODB}"/daily_backup/; then |
| 36 | + echo "Daily backup succeeded." >> $report_file |
| 37 | +else |
| 38 | + echo "Daily backup failed." >> $report_file |
| 39 | +fi |
19 | 40 |
|
20 | | -showdb > /mongo_dbs.txt |
| 41 | +# Monthly Backup |
| 42 | +if [ "$(date -d +1day +%d)" -eq 1 ]; then |
| 43 | + if s3cmd put -r --no-mime-magic $backup_dir/ s3://"${S3_BUCKET_MONGODB}"/monthly_backup/; then |
| 44 | + echo "Monthly backup succeeded." >> $report_file |
| 45 | + else |
| 46 | + echo "Monthly backup failed." >> $report_file |
| 47 | + fi |
| 48 | +fi |
21 | 49 |
|
22 | | -#Backing up the databases listed. |
23 | | -while read -r db |
24 | | -do |
25 | | - echo "Creating backup for $db" |
26 | | - mongodump --host mongodb:27017 --db "$db" --authenticationDatabase admin -u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_PASSWORD" -o /var/lib/mongodb-backup/ |
27 | | -done < "/mongo_dbs.txt" |
| 50 | +# Quarterly Backup |
| 51 | +if [[ "$MONTH" == "Mar" || "$MONTH" == "Jun" || "$MONTH" == "Sep" || "$MONTH" == "Dec" ]] && [ "$(date -d +1day +%d)" -eq 1 ]; then |
| 52 | + if s3cmd put -r --no-mime-magic $backup_dir/ s3://"${S3_BUCKET_MONGODB}"/quarterly_backup/; then |
| 53 | + echo "Quarterly backup succeeded." >> $report_file |
| 54 | + else |
| 55 | + echo "Quarterly backup failed." >> $report_file |
| 56 | + fi |
| 57 | +fi |
28 | 58 |
|
29 | | -tar czf /var/lib/backup/mongodb/"${SOURCE_NAME}"_mongodb_db_backup_"${DATE1}".tgz /var/lib/mongodb-backup/. && rsync -avr /var/lib/mongodb/ /root/mongodb_data/ && tar czf /var/lib/backup/mongodb/"${SOURCE_NAME}"_mongodb_data_backup_"${DATE1}".tgz /root/mongodb_data/. |
| 59 | +# Prune old backups from S3 |
| 60 | +# Daily Backup Prune (31 days) |
| 61 | +s3cmd ls -r s3://"${S3_BUCKET_MONGODB}"/daily_backup/ | \ |
| 62 | + awk -v DEL="$(date +%F -d "31 days ago")" '$1 < DEL {print $4}' | while read -r file; do s3cmd rm "$file"; done |
30 | 63 |
|
31 | | -# Moving the backup to S3 bucket |
32 | | -if s3cmd put -r --no-mime-magic /var/lib/backup/mongodb/ s3://"${S3_BUCKET_MONGODB}"/; |
33 | | -then |
34 | | - echo "DATE:" "$DATE" > /tmp/mongodbbackup.txt |
35 | | - echo " " >> /tmp/mongodbbackup.txt |
36 | | - echo "DESCRIPTION: ${SOURCE_NAME}_Mongodb backup" >> /tmp/mongodbbackup.txt |
37 | | - echo " " >> /tmp/mongodbbackup.txt |
38 | | - echo "STATUS: mongodb backup is Successful." >> /tmp/mongodbbackup.txt |
39 | | - echo " " >> /tmp/mongodbbackup.txt |
40 | | - echo "******* Mongodb Database Backup ****************" >> /tmp/mongodbbackup.txt |
41 | | - echo " " >> /tmp/mongodbbackup.txt |
42 | | - s3cmd ls --no-mime-magic s3://"${S3_BUCKET_MONGODB}"/ --human-readable | grep -i "${SOURCE_NAME}"_mongodb_db | cut -d' ' -f3- | tac | head -10 | sed "s,s3:\/\/${S3_BUCKET_MONGODB}\/,,g" &>> /tmp/mongodbbackup.txt |
43 | | - echo " " >> /tmp/mongodbbackup.txt |
44 | | - echo "************** Mongodb data Backup *************" >> /tmp/mongodbbackup.txt |
45 | | - echo " " >> /tmp/mongodbbackup.txt |
46 | | - s3cmd ls --no-mime-magic s3://"${S3_BUCKET_MONGODB}"/ --human-readable | grep -i "${SOURCE_NAME}"_mongodb_data | cut -d' ' -f3- | tac | head -10 | sed "s,s3:\/\/${S3_BUCKET_MONGODB}\/,,g" &>> /tmp/mongodbbackup.txt |
47 | | - echo " " >> /tmp/mongodbbackup.txt |
48 | | - echo "********************** END *********************" >> /tmp/mongodbbackup.txt |
49 | | -else |
50 | | - echo "DATE:" "$DATE" > /tmp/mongodbbackup.txt |
51 | | - echo " " >> /tmp/mongodbbackup.txt |
52 | | - echo "DESCRIPTION: ${SOURCE_NAME}_Mongodb backup" >> /tmp/mongodbbackup.txt |
53 | | - echo " " >> /tmp/mongodbbackup.txt |
54 | | - echo "STATUS: mongodb backup is Failed." >> /tmp/mongodbbackup.txt |
55 | | - echo " " >> /tmp/mongodbbackup.txt |
56 | | - echo "Something went wrong, Please check it" >> /tmp/mongodbbackup.txt |
57 | | - < /tmp/mongodbbackup.txt mail -s "${SOURCE_NAME}: mongodb backup" "${CRON_BACKUP_MAIL}" |
58 | | -fi |
| 64 | +# Monthly Backup Prune (1 year) |
| 65 | +s3cmd ls -r s3://"${S3_BUCKET_MONGODB}"/monthly_backup/ | \ |
| 66 | + awk -v DEL="$(date +%F -d "3 months ago")" '$1 < DEL {print $4}' | while read -r file; do s3cmd rm "$file"; done |
| 67 | + |
| 68 | +# Quarterly Backup Prune (3 years) |
| 69 | +s3cmd ls -r s3://"${S3_BUCKET_MONGODB}"/quarterly_backup/ | \ |
| 70 | + awk -v DEL="$(date +%F -d "3 years ago")" '$1 < DEL {print $4}' | while read -r file; do s3cmd rm "$file"; done |
| 71 | + |
| 72 | +# Send report via email |
| 73 | +< $report_file mail -s "${SOURCE_NAME}: MongoDB Backup Report" "${CRON_BACKUP_MAIL}" |
59 | 74 |
|
60 | | -# Remove the old backup data in local directory to avoid excessive storage use |
61 | | -find /var/lib/backup/mongodb/ -type f -exec rm {} \; |
62 | | -find /root/mongodb_data/ -type f -exec rm {} \; |
63 | | -find /var/lib/mongodb-backup/ -type f -exec rm {} \; |
| 75 | +# Clean up local backup data |
| 76 | +find $backup_dir $mongodb_data_dir $mongodb_backup_dir -type f -exec rm {} \; |
| 77 | +rm $report_file |
64 | 78 |
|
65 | | -< /tmp/mongodbbackup.txt mail -s "${SOURCE_NAME}: mongodb backup" "${CRON_BACKUP_MAIL}" |
|
0 commit comments