備份策略二:使用mysqldump備份數據庫(一個星期全備一次,每天增量備份)
創建一個備份數據庫的一個腳本文件
backup_target_dir=/backup/db
backup_logs_dir=/backup/logs #備份日誌目錄
db=bcmedia
#得到10天前的日期
ccDATE=$(date "-d 10 day ago" +%Y%m%d)
echo "-----------`date +"%Y-%m-%d %H:%M:%S"`--------------------" >> $backup_logs_dir/$db$DATE
echo "------------------------" >> $backup_logs_dir/$db$DATE
then
echo "backup succeed" >> $backup_logs_dir/$db$DATE
else
echo "backup fail" >> $backup_logs_dir/$db$DATE
fi
then
rm -rf $backup_dir/db$ccDATE.tar.gz
echo "Delete $backup_dir/db$ccDATE.tar.gz succeed" >>$backup_logs_dir/$db$DATE
else
echo "Not found $backup_dir/db$ccDATE.tar.gz file" >>$backup_logs_dir/$db$DATE
fi
if [ -e $backup_logs_dir/$db$ccDATE ]
then
rm -rf $backup_logs_dir/$db$ccDATE
echo "Delete $backup_logs_dir/$db$ccDATE succeed" >>$backup_logs_dir/$db$DATE
else
echo "Not found $backup_logs_dir/$db$ccDATE file" >>$backup_logs_dir/$db$DATE
#chmod 755 backup_mysql.sh
讓腳本每天執行一次,每天備份一次數據庫,在crontab 裏面添加一行
10 4 * * * /scripts/ backup_mysql.sh #每天4點10分運行腳本備份數據庫
還原數據庫的時候只要把備份出的文件拷貝到數據庫放置數據的目錄下,修改權限。重啓下數據庫就完成了恢復了。
我們使用的數據庫備份完成之後有10個G如果每天都做一次全備,不方便,就一個星期做一次全備,一天做一次增量備份。爲了不影響線上業務,實現在線備份,並且能增量備份,最好的辦法就是採用主從複製機制(replication),在 slave 機器上做備份。詳細的mysqlreplication請參看mysql主主、主從複製詳解
#!/bin/bash
# This is mysql mysqlfullbak scripts
#2009-08-20
#badboy
user=bak
passwd=123456
databak_dir=/backup/cacti #備份的目錄
eMailFile=$databak_dir/email.txt
[email protected]
DATE=`date +%Y%m%d`
logFile=$databak_dir/logs/mysql$DATE.log
database=cacti
echo " " > $eMailFile
echo "---------------------------------" >> $eMailFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $eMailFile
cd /data
dumpFile=$database$DATE.sql
GZDumpFile=$database$DATE.tar.gz
options="-u$user -p$passwd --opt --extended-insert=false --triggers=false -R --hex-blob --flush-logs --delete-master-logs -B $database"
mysqldump $options > $dumpFile #導出數據文件
if [[ $? == 0 ]]; then
tar cvzf $GZDumpFile $dumpFile >> $eMailFile 2>&1
echo "BackupFileName:$GZDumpFile" >> $eMailFile
echo "DataBase Backup Success" >> $eMailFile
scp $GZDumpFile user@”ip地址”:/Dir #傳送備份文件到另一臺計算機,需要做好ssh信任
rm -f $dumpFile #刪除備份的文件
rm –rf $databak_dir/daily/* #刪除每天備份的文件
else
echo "DataBase Backup Fail!" >> $emailFile
mail -s " DataBase Backup Fail " $eMail < $eMailFile #如果備份不成功發送郵件通知
fi
echo "--------------------------------------------------------" >> $logFile
cat $eMailFile >> $logFile
#vi mysqldailybak.sh
#!/bin/bash
# This is mysql mysqldailybak scripts
# 2009-08-20
# badboy
/usr/bin/mysqladmin flush-logs #
user=bak
passwd=123456
database=cacti
daily_databak_dir=$databak_dir/daily #備份目錄,需要創建
eMailFile=$daily_databak_dir/email.txt
[email protected]
DATE=`date +%Y%m%d`
logFile=$daily_databak_dir/mysql$DATE.log
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")
echo “Delete 10 days before the log ” >> $eMailFile
mysql -u$user -p"$passwd" -e "purge master logs before ${TIME}" && echo "delete 10 days before log" |tee -a $eMailFile #刪除10天前的2進制文件
filename=/data/`cat /data/mysql-bin.index |awk -F "/" '{print $2}'` # 2進制文件
for i in $filename
do
echo "$StartTime start backup binlog " >> $eMailFile
mysqlbinlog -u$user -p$passwd -d $batabase --start-datetime="$StartTime" $i >> $daily_databak_dir/daily$DATE |tee -a $eMailFile
done
if [ $? = 0 ]
then
cd $daily_databak_dir
tar -zcvf $daily_databak_dir/$database$DATE.tar.gz daily$DATE >>/dev/null 2>&1
#scp $daily_databak_dir/$database$DATE.tar.gz user@”ip地址”:/Dir #傳送備份文件到另一臺計算機,需要做好ssh信任
echo "daily backup succeed" >> $eMailFile
else
echo "daily backup fail" >> $eMailFile
mail -s "MySQL Backup" $eMail < $eMailFile #備份失敗之後發送郵件通知
fi
cat $eMailFile > $logFile
添加可執行的權限
#chmod 755 /scripts/mysql_full_bak.sh /scripts/mysqldailybak.sh
10 4 * * 0 /scripts/mysql_full_bak.sh #禮拜天執行全備份的腳本