2012-08-31 60 views
0

以下是腳本安排在Linux服務器上的MYSQL DataBase上。 以下是代碼中使用bash腳本使用bash腳本進行最近10天的MySQL備份

#!/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腳本命令來完成同..

問候 阿文德

+0

這是一個純粹的Bash shell腳本;不是Perl。 – JRFerguson

+0

對不起,這是shell腳本。 perl腳本的計劃是檢查數據庫備份是否正確完成。你可以請動這個帖子各自的組 – user1338040

+0

下看一看http://gehrcke.de/2010/11/mysql-backup-script-with-email-support-and-lzma-compression-for-cron/。 –

回答

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個最近的備份。

+0

請謹慎將密碼放入命令中。機器上的其他用戶將能夠在進程列表中讀取它。像這裏描述的那樣使用'$(cat passwordfile)':http://gehrcke.de/2010/11/mysql-backup-script-with-email-support-and-lzma-compression-for-cron/ –

+0

Hello , 感謝您的回覆。但是在這裏我可以看到備份是用各自的日期創建的,我可以創建新的文件夾,並且在該文件夾中要存儲最後10個備份?我怎麼能做到這一點。我的意思是在文件夾/ mnt/backup中,我們有10個文件夾可以存儲最後10個數據庫文件?爲什麼我可以修改上面的代碼? – user1338040

0

jOnes的解決方案是合理的。這裏有另一種方法:把腳本留下,用「logrotate」來處理修剪。在你/etc/logrotate.conf,你會把這樣的事情:

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

man logrotate確認哪些選項將工作最適合你。

0

也許我是有點晚了,因爲這個問題是3歲,但我想我可以給瓊斯腳本添加更多一點的功能。 我需要一個類似的腳本,但由於它可能每天運行多次,「旋轉」部分對我來說效果不佳。此外,我認爲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