程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> shell進行完整和增量備份mysql數據庫

shell進行完整和增量備份mysql數據庫

編輯:MySQL綜合教程

shell進行完整和增量備份mysql數據庫    文檔介紹 本文檔采用mysqldump 對數據庫進行備份,mysqldump 是采用SQL級別的備份機制,它將數據表導成 SQL腳本文件,在不同的 MySQL 版本之間升級時相對比較合適,這也是最常用的備份方法,mysqldump 比直接拷貝要慢些。 本文描述Mysql數據庫的自動備份,包括完全備份和增量備份。其中,完全備份每周執行一次,增量備份每天都會執行。備份成功後會自動上傳到FTP服務器。mysql需要開啟二進制日志。   備份策略布置 把腳本放到/usr/bin 目錄下面 (1)、啟用二進制日志 采用 binlog 的方法相對來說更靈活,省心省力,而且還可以支持增量備份。 啟用 binlog 時必須要重啟 mysqld。首先,關閉 mysqld,打開 /etc/my.cnf,加入以下幾行: [mysqld] log-bin 然後啟動 mysqld 就可以了。運行過程中會產生 HOSTNAME-bin.000001 以及 HOSTNAME-bin.index,前面的文件是 mysqld 記錄所有對數據的更新操作,後面的文件則是所有 binlog 的索引,都不能輕易刪除。關於binlog 的更詳細信息請查看手冊。 (2)、設置crontab任務,每天執行備份腳本 shell> vi /etc/crontab  添加以下: 0 00 * * * root /usr/bin/backap_mysql.sh 腳本如下: #!/bin/bash   #set -x   #此腳本的主要用途是備份mysql服務器上的數據庫。並且自動通過FTP上傳到服務器。備份完後都會發送一封郵件。   echo -e "此腳本的主要用途是備份mysql服務器上的數據庫.並且自動通過FTP上傳到服務器。"   Host=www.chlinux.net   pass=chenqibin   name=root   DATE=`date +"%Y%m%d"`   WAN_DIR="/wan_dir"   ZENG_BACK="/backup"   DATA_DIR="/usr/local/mysql/data"   MYSQL_BIN="/usr/local/mysql/bin"   error_log="$WAN_DIR/backup_error_$DATE.log"   backup_log="$ZENG_DIR/backup_$DATE.log"   gzdumpfile="$DATE.sql.tar.gz"   db="/var/log/backup_$DATE.txt"      cd $DATA_DIR      ls -l $DATA_DIR | grep "^d" | awk -F " " '{print $9}' >>$db      function wan() {   #檢測完全備份目錄是否存在,如果不存在就創建。   if [ -d $WAN_DIR ]   then       echo "完全備份目錄存在" >>$backup_log   else       echo "完全備份目錄不存在,開始創建......."       /bin/mkdir $WAN_DIR   fi      eMailFile="$WAN_DIR/mail.log"   [email protected]       echo "       " > $eMailFile       echo "-----------------------" >> $eMailFile       echo "`date +"%y-%m-%d %H:%M:%S"`" >> $eMailFile       echo "-------------------------" >> $eMailFile   cd $WAN_DIR       for dbname in $(cat $db)       do          mysqldump --flush-logs -u$name -p$pass --skip-lock-tables --quick $dbname > $dbname.sql           if [ $? = 0 ]           then                find $ZENG_BACK -name "*.log" -mtime +32 -exec rm {} \; >/dev/null 2>&1                cd $WAN_DIR                 tar -zcvf $dbname.$gzdumpfile $dbname.sql                echo "Backup MySQL succeed" >>$eMailFile                mail -s "MySQL Backup" $email < $eMailFile           else                echo "Backup MySQL fail" >>$eMailFile                mail -s "MySQL Backup fail" $email < $eMailFile           fi       done   #完全備份後刪除本地增量備份文件,只保留最近一個星期的增量備份文件   find $ZENG_BACK -name "*.sql.tar.gz"  --mtime +7 -exec rm -rf {} \; >>$backup_log       #將備份好的上傳到FTP服務器   cd $WAN_DIR   for db_back in $(cat $db)   do       ftp -nv $Host <<EOF       user wolf "wolf#123"       put $db_back.$gzdumpfile       quit   EOF   done   }   function zeng() {   /bin/mkdir /zeng_dir      eMailFile="$ZENG_DIR/mail.log"   [email protected]      echo "       " > $eMailFile   echo "-----------------------" >> $eMailFile   echo "`date +"%y-%m-%d %H:%M:%S"`" >> $eMailFile   echo "-------------------------" >> $eMailFile      TIME=$(date "-d 10 day ago" +%Y-%m-%d %H:%M:%S)    StartTime=$(date "-d 1 day ago" +"%Y-%m-%d %H:%M:%S")   Start="--start-datetime"   #刪除10天前的二進制文件   mysql -u$name -p$pass -e "purge master logs before ${TIME}" && echo "delete 10 days before log" | tee -a $eMailFile   filename=`cat $DATA_DIR/chlinux-bin.index | awk -F "/" '{print $2}'`   cd /zeng_dir      for i in $filename   do        echo "$StartTime start backup binlog" >> $eMailFile           for db_name in $(cat $db)        do              mysqlbinlog -u$name -pchenqibin -d $db_name $Start="$StartTime" $DATA_DIR/$i >>$db_name.$DATE.sql           if [ $? = 0 ]           then                cd /zeng_dir                tar -zcvf $db_name.$gzdumpfile $db_name.$DATE.sql                echo "Backup MySQL succeed" >>$eMailFile                mail -s "MySQL Backup" $email < $eMailFile           else                echo "Backup MySQL fail" >>$eMailFile                mail -s "MySQL Backup fail" $email < $eMailFile           fi        done   done   find $ZENG_BACK -name "*.log" -name +32 -exec rm {} \; >/dev/null 2>&1   cd /zeng_dir   #刪除上次備份的完整備份的文件   find $WAN_DIR -name "*.tar.gz"  --mtime +7 -exec rm -rf {} \;      #將備份好的上傳到FTP服務器   for db_back in $(cat $db)   do       ftp -nv $Host <<EOF       user wolf "wolf#123"       put $db_back.$gzdumpfile       quit   EOF   done   }   backfile=`ls -l /wan_dir | wc -l`   if [ $backfile != 0 ]   then       echo "完整備份已經存在,現在進行增量備份"       sleep 10       zeng   else       echo "還沒進行完整備份,現在進行完整備份"       sleep 30       wan   fi     主要變量說明:   Host     #FTP的IP   pass     #FTP的密碼   name     #FTP和mysql的用戶名   DATE     #時間   WAN_DIR  #完整備份的目錄   ZENG_BACK  #增量備份的目錄   DATA_DIR   #mysql數據目錄   error_log  #錯誤日志   gzdumpfile #壓縮後的後綴名   db          #mysql數據庫名  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved