完整和增量備份MySQL腳本

 

本文檔採用mysqldump 對數據庫進行備份,mysqldump 是採用SQL級別的備份機制,它將數據表導成 SQL腳本文件,在不一樣的 MySQL 版本之間升級時相對比較合適,這也是最經常使用的備份方法,mysqldump 比直接拷貝要慢些。mysql

本文描述Mysql數據庫的自動備份,包括徹底備份和增量備份。其中,徹底備份每週執行一次,增量備份天天都會執行。備份成功後會自動上傳到FTP服務器。mysql須要開啓二進制日誌。linux

備份策略佈置
把腳本放到/usr/bin 目錄下面
(1)、啓用二進制日誌
採用 binlog 的方法相對來講更靈活,省心省力,並且還能夠支持增量備份。
啓用 binlog 時必需要重啓 mysqld。首先,關閉 mysqld,打開 /etc/my.cnf,加入如下幾行:
[mysqld]
log-binsql

而後啓動 mysqld 就能夠了。運行過程當中會產生 HOSTNAME-bin.000001 以及 HOSTNAME-bin.index,前面的文件是 mysqld 記錄全部對數據的更新操做,後面的文件則是全部 binlog 的索引,都不能輕易刪除。關於binlog 的更詳細信息請查看手冊。數據庫

(2)、設置crontab任務,天天執行備份腳本
vi /etc/crontab
添加如下:
0 00 * * * root /usr/bin/backap_mysql.shbash

腳本以下:
#!/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=kelly@r2games.net
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=kelly@r2games.net

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數據庫名服務器

相關文章
相關標籤/搜索