2012-08-08 1 views
0

내 전용 백업에는 5 기가의 NAS가 필요합니다. 궁극적으로 각 cPanel의 MySQL 테이블과 public_html의 백업을 수행 중임Bash mysql/public_html 전용 백업 스크립트

MySQL 테이블 폴더 (/ var/lib/mysql)의 내용을 읽을 수있는 방법과 하위 폴더가있는 경우 타르를 만들 수 있습니까? .gz 파일을 찾은 다음/mnt/mysql_backup/date/dbname에 복사합니다.

그런 다음 집/이동/백업에 각 폴더가 존재하는/public_html을/폴더를 통해 도보로, 다음을/mnt/files_backup/날짜/스크립트가 성공적으로 완료

경우 cpanelfoler에 파일을 복사합니다. 이전 백업을 삭제하고 생성 된 마지막 백업 만 보관하십시오.

은 어떤 도움이

+0

특히 어떤 문제가 있습니까? –

+2

mysqldump를 사용하면'/ var/lib/mysql'을 백업하는 것보다 쉽고/쉽다. – geirha

답변

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

+0

@Tzvi : 이전 백업을 제거하도록 편집 된 코드 – TOC

0

사용 mysqldump : 백업 MySQL로

$ mysqldump my_database > my_database_dump.sql 
0

, 나는 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) 

같은 약간의 오류 검사를 추가하고 이것은 당신이 가야한다.

백업에 대한 마지막 단어. 마지막 백업 파일을 유지하는 것이 좋습니다. 매주 모든 것을 1 주일간 유지하는 것과 같은 매달마다 나에게 꽤 좋은 것처럼 들립니다.