2012-08-08 97 views
0

在我的專用服務器上,有一臺我想備份的5gig NAS。 最後做每個cPanel的MySQL表和public_html,僅限Bash mysql/public_html備份腳本

如何讀取MySQL表文件夾(/ var/lib/mysql)的內容,如果找到子文件夾,然後製作一個tar找到這些子文件夾的.gz文件,然後將它們複製到/ mnt/mysql_backup/date/dbname。

然後去到/ home /,並通過在每個文件夾備份到它的存在/的public_html /文件夾走,然後把文件複製到/ mnt/files_backup /日期/ cpanelfoler

如果腳本成功完成。 刪除舊備份並僅保留剛剛創建的最後一個備份。

任何幫助,將不勝感激

+0

你有什麼特別的困難? – 2012-08-08 09:28:29

+2

使用'mysqldump'會比備份'/ var/lib/mysql'更好/更容易。 – geirha 2012-08-08 09:50:01

回答

0

試試這個腳本:

#! /usr/bin/bash 

OK=0   
KO=1 

MYSQL_DIR="/var/lib/mysql" 
MYSQL_BACKUP_DIR="/mnt/mysql_backup/date/dbname" 
HTML_DIR="/home/public_html" 
HTML_BACKUP_DIR="/mnt/files_backup/date/cpanelfoler" 
LOG_FILE="/tmp/backup_log.log" 

function archiving 
{ 
     local return_status=$OK   # Function return status 
     local IN_DIR=$1     # Input directory 
     local ARC_DIR=$2    # Archiving directory 

     final_arc_dir=$ARC_DIR 
     timestamp=`date +%Y%m%d%H%M%S` 
     # Archive will be like this : archive_YYYYMMDDHHMMSS 
     final_arc_dir=${final_arc_dir}/archive_$timestamp 

     if [ ! -d "$final_arc_dir" ]; then 
     echo "Creating directory $final_arc_dir" 
     mkdir -p $final_arc_dir 
     fi 

     # More secure : copy then delete instead of moving 
     echo "Copying files ... to $ARC_DIR" 
     # For each file, or directory we copy than delete 
     cp -r $IN_DIR $final_arc_dir 
     return_last_command=`echo $?` 
     if [ $return_last_command -ne 0 ] 
     then 
       return_status=KO 
       echo "Error copying files ---> $IN_DIR" 
     else 
       rm -rf $IN_DIR 
     fi 

     # Archive name 
     archive_name=$(echo $final_arc_dir | awk -F/ '{print $NF}') 
     # We can compress 
     tar cvf - $final_arc_dir | gzip > $ARC_DIR/$archive_name.tar.gz 
     ret=$? 
     if [ $ret -ne 0 ] 
     then 
       echo "Compression failed ---> $final_arc_dir" 
       return_status=$KO 
     else 
       echo "Compression terminated successfully, we can delete original directory" 
       rm -rf $final_arc_dir 
     fi 

     # Cleanup old archives 
     for f in `ls -l $ARC_DIR | awk '{print $9}' | grep -v "$timestamp"` 
     do 
      echo "\nRemove this older backup --------------------> $f\n" 
      rm -rf $ARC_DIR/$f 
     done 


     return $return_status 
} 

### MAIN ### 

### Archiving MYSQL FILES 
if ! archiving $MYSQL_DIR $MYSQL_BACKUP_DIR 
then 
    echo "\nError archiving MYSQL FILES ----> KO" | tee -a $LOG_FILE 
    exit $KO 
fi 

### Archiving HTML FILES 
if ! archiving $HTML_DIR $HTML_BACKUP_DIR 
then 
    echo "\nError archiving HTML FILES ----> KO" | tee -a $LOG_FILE 
    exit $KO 
fi 

# All seems to be ok 
echo "\nAll seems to be okay\n" 
exit $OK 
+0

看起來不錯,但是這不會創建無限的「日期」文件夾?有沒有辦法讓它只保留最新的和刪除舊的,如果備份是成功的? – Tzvi 2012-08-08 12:16:48

+0

@Tzvi:編輯代碼以刪除舊備份 – TOC 2012-08-08 13:21:59

0

使用mysqldump

$ mysqldump my_database > my_database_dump.sql 
0

要備份mysql,我會考慮用mysqldump。但請記住,mysqldump在運行時會鎖定這些表。如果你的數據庫中有相當數量的數據,這個過程可能需要一段時間。

如果您無法長時間鎖定數據庫,我會做一個鏡像並在該鏡像上運行備份腳本。 (在這裏找到詳細的一步一步的過程,這樣做的:http://www.howtoforge.com/mysql_database_replication

要備份的數據庫,你可以做這樣的事情:

BACKUPDATE=$(date +"%Y%m%d") 
BACKUPDIR='/mnt/backup' 

BACKUPUSER='bkpUser' 
BACKUPPASS='bkpPassword' 

mkdir -p $BACKUPDIR/$BACKUPDATE/databases/ 

for DATABASE in $(mysql -u$BACKUPUSER -pBACKUPPASS -e "show databases" | grep -v Database | grep -v information_schema) 
    do 
     mysqldump -u$BACKUPUSER -pBACKUPPASS $DATABASE > $BACKUPDIR/$BACKUPDATE/databases/$DATABASE.sql 
    done 

這應該創建一個新的文件夾,每天和轉儲所有數據庫進入它。

爲的public_html文件夾,像

tar czvf $BACKUPDIR/$BACKUPDATE/public_html.tar.gz $(find /home/ -type d -name public_html) 

加一點點錯誤檢查,這應該讓你去。

關於備份的最後一句話。我強烈建議你保留更多的只是最後一個備份文件。就像保持一個星期的一樣,每個月一個對我來說聽起來都很不錯。