使用bash脚本在过去10天内进行MySQL备份

时间:2012-08-31 12:16:21

标签: bash

以下是脚本是在Linux服务器上的MYSql DataBase上安排的。 以下是使用bash脚本的代码

#!/bin/bash
# MySQL backup script
# Last update: 20090504
#

MHOST=localhost
MUSER=backup
MPASS=OwBPimRc
BACKUPDIR="/mnt/backup"

########################################################################

MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"

DBPREFIX="$(hostname -s).mysqldb"

echo "Run MySQL backup"
DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"
for db in $DBS
do
  FILE=${BACKUPDIR}/${DBPREFIX}.${db}.gz
  $MYSQLDUMP --no-tablespaces --skip-lock-tables -u $MUSER -h $MHOST -p$MPASS $db | $GZIP -9 > $FILE
done 

但是我想自定义这个过程 1.在上面的bash脚本的帮助下,我希望存储最新的10个数据库备份 请建议bash脚本命令执行相同的操作..

最诚挚的问候 Arvind的

3 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

MHOST=localhost
MUSER=backup
MPASS=OwBPimRc
BACKUPDIR="/mnt/backup"

MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"

DBPREFIX="$(hostname -s).mysqldb"

echo "Run MySQL backup"
DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"
for db in $DBS
do
    FILE=${BACKUPDIR}/${DBPREFIX}.${db}.`date +%Y%m%d`.gz
    $MYSQLDUMP --no-tablespaces --skip-lock-tables -u $MUSER -h $MHOST -p$MPASS $db | $GZIP -9 > $FILE
done 

find  -name "${BACKUPDIR}/${DBPREFIX}*" -type f -mtime +10 -exec rm -f '{}' ';'

基本思想是使用文件名中的日期来获取每天的不同数据库备份。在最后一行中,您可以删除所有超过10天的文件,只保留10个最新的备份。

答案 1 :(得分:0)

来自jOnes的解决方案是合理的。这是另一种选择:单独保留脚本,并使用“logrotate”来处理修剪。在您的/etc/logrotate.conf中,您可以使用以下内容:

   /mnt/backup/*.mysqldb {
       daily
       rotate 10
       missingok
       nocompress
   }

请参阅man logrotate以确认哪种选项最适合您。

答案 2 :(得分:0)

也许我有点迟了,因为问题是3岁,但我想我可以为jOnes脚本添加更多功能。 我需要一个类似的脚本,但由于它可以每天运行多次,因此“旋转”部分对我来说效果不佳。

此外,我认为OP需要一种方法来保留每个数据库的最后“n”个备份,而jOnes版本保留最后的“n”个备份文件(所以如果你的服务器中有11个数据库,那么只有第一个将保留10个。

这是我的版本:

MHOST=localhost
MUSER=backup
MPASS=OwBPimRc
BACKUPDIR="/mnt/backup"
MAXBACKUPS=10

MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"

DBPREFIX="$(hostname -s).mysqldb"

echo "Run MySQL backup"
DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"
for db in $DBS
do
    FILE=${BACKUPDIR}/${DBPREFIX}.${db}.`date +%Y%m%d%H%M%S`.gz
    $MYSQLDUMP --no-tablespaces --skip-lock-tables -u $MUSER -h $MHOST -p$MPASS $db | $GZIP -9 > $FILE

    TOTBACKUPS=$[`ls -l ${BACKUPDIR}/${DBPREFIX}.${db}* | wc -l` - 1]
    if [ $TOTBACKUPS > $MAXBACKUPS ]
    then
        TBREMOVED=$[TOTBACKUPS - MAXBACKUPS + 1]
        REMLIST=`ls -ctr ${BACKUPDIR}/${DBPREFIX}.${db}*  | head -n ${TBREMOVED}`
        for i in $REMLIST
        do
            rm -rf $i
        done
    fi    

done