簡體   English   中英

在Bash備份腳本中刪除舊的MySQL / MariaDB備份

[英]Removing old MySQL / MariaDB backups in Bash Backup Script

我編寫了一個在cron上啟動的bash腳本,該腳本每晚和每周備份一台特定計算機上的所有數據庫。 該腳本可以正確刪除舊數據庫,但月份發生變化的情況除外。

例如,假設是11月2日。 該腳本在晚上11:00運行,並正確刪除自11月1日以來所做的備份。 但是12月1日到來時,腳本會變得混亂,並且不能正確刪除11月30日以來所做的備份。

在這種情況下,如何解決此腳本以正確刪除舊備份?

DATABASES=$(echo 'show databases;' | mysql -u backup --password='(password)' | grep -v ^Database$)
LIST=$(echo $DATABASES | sed -e "s/\s/\n/g")
DATE=$(date +%Y%m%d)
DAYOLD=$(($DATE-1))
SUNDAY=$(date +%a)
WEEKOLD=$(($DATE-7))

for i in $LIST; do
if [[ $i != "mysql" ]]; then
        mysqldump --single-transaction $i > /mnt/backups/mariadb/daily/$i.$DATE.sql
        if [ -f /mnt/backups/mariadb/daily/$i.$DAYOLD.sql ]; then
                rm -f /mnt/backups/mariadb/daily/$i.$DAYOLD.sql
        fi
        if [[ $SUNDAY == "Sun" ]]; then
                cp /mnt/backups/mariadb/daily/$i.$DATE.sql /mnt/backups/mariadb/weekly/$i.$DATE.sql
                rm -f /mnt/backups/mariadb/weekly/$i.$WEEKOLD.sql
        fi
fi
done

如果您知道在特定時間范圍內執行的備份數量,那么假設您知道從11月2日到12月2日,您已經知道已經完成了30次備份,而現在您要擦除這些備份,只需使用備份數量即可,超級簡單,您不必處理bash中非常復雜的日期:

$ (ls -t|head -n 30;ls)|grep -v ^Database|sort|uniq -u|xargs rm -rf

然后,您可以通過每天刪除較舊的一天來輕松地自動執行此腳本,從而僅獲得所需的固定備份數量:

#! /bin/bash
# Create new full backup
BACKUP_DIR="/path-to-backups/"
BACKUP_DAYS=1

# Prepare backup
cd ${BACKUP_DIR}
latest=`ls -rt | grep 201 | head -1`

# Change latest reference
ln -sf ${BACKUP_DIR}${latest} latest

# Cleanup older than one week (n days)
to_remove=`(ls -t | grep 201 | head -n 3;ls)|sort|uniq -u`
echo "Cleaning up... $to_remove"
(ls -t|head -n ${BACKUP_DAYS};ls)|sort|uniq -u|xargs rm -rf

echo "Backup Finished"
exit 0

然后,您可以將其鏈接到每日cron。 這是在此博客條目中說明的,如何以一種非常直接的方式(但有熱備份,沒有mysqldump)來完成這些工作: http : //codeispoetry.me/index.php/mariadb-daily-hot-backups-with- xtrabackup /

我讓這太復雜了。 我根本沒有使用日期,而是使用以下命令搜索文件備份的期限:

find /mnt/backups/mariadb/weekly/* -type f -mtime +8 -exec rm -f {} \;

因此,整個腳本變為:

DATABASES=$(echo 'show databases;' | mysql -u backup --password='foo' | grep -v ^Database$)
LIST=$(echo $DATABASES | sed -e "s/\s/\n/g")
DATE=$(date +%Y%m%d)
SUNDAY=$(date +%a)

for i in $LIST; do
if [[ $i != "mysql" ]]; then
        /bin/nice mysqldump --single-transaction $i > /mnt/backups/mariadb/daily/$i.$DATE.sql
        find /mnt/backups/mariadb/daily/* -type f -mtime +1 -exec rm -f {} \;

        if [[ $SUNDAY == "Sun" ]]; then
                cp /mnt/backups/mariadb/daily/$i.$DATE.sql /mnt/backups/mariadb/weekly/$i.$DATE.sql
                find /mnt/backups/mariadb/weekly/* -type f -mtime +8 -exec rm -f {} \;
        fi
fi
chown -R backup.backup /mnt/backups
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM