【问题标题】:Removing old MySQL / MariaDB backups in Bash Backup Script在 Bash 备份脚本中删除旧的 MySQL / MariaDB 备份
【发布时间】:2016-05-11 19:07:00
【问题描述】:

我编写了一个在 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

【问题讨论】:

    标签: mysql bash mariadb


    【解决方案1】:

    如果您知道在特定时间范围内执行的备份数量,假设您知道从 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/

    【讨论】:

    • 感谢@danigosa 的回答。我赞成它,因为它看起来确实很有帮助,并且就像您在其中投入了一些工作一样。也就是说,我以不同的方式解决了这个问题,并在下面回答我的问题。 (另外:我刚刚注意到这个问题在很长一段时间内都没有得到公认的答案,但这个问题一直是“杰出的”)。
    • 谢谢,我只是复制粘贴了一个我们在内部完成的解决方案,工作量不大,希望可以帮助或给任何人一些想法
    【解决方案2】:

    我把这弄得太复杂了。而不是使用日期,我只是在搜索文件备份的年龄:

    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
    

    【讨论】:

      猜你喜欢
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 2016-07-27
      相关资源
      最近更新 更多