完整和增量備份MySQL指令碼

來源:互聯網
上載者:User

標籤:伺服器   資料庫   二進位   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任務,每天執行備份指令碼
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資料庫名

 

本文出自 “目標:印度” 部落格,請務必保留此出處http://shunzi115.blog.51cto.com/5184443/1826163

完整和增量備份MySQL指令碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.