Mysql數據備份與mysqldump增量備份

       在數據庫表丟失或損壞的情況下,備份你的數據庫是很重要的。如果發生系統崩潰,你肯定想能夠將你的表儘可能丟失最少的數據恢復到崩潰發生時的狀態。本文主要對MyISAM表做備份恢復。
 
備份策略一:直接拷貝數據庫文件
備份策略二:使用mysqldump備份數據庫(一個星期全備一次,每天增量備份)
一、 直接拷貝數據文件
 
直接拷貝數據文件最爲直接、快速、方便,但缺點是基本上不能實現增量備份。爲了保證數據的一致性,需要在備份文件前,執行以下 SQL 語句:FLUSH TABLES WITH READ LOCK;也就是把內存中的數據都刷新到磁盤中,同時鎖定數據表,以保證拷貝過程中不會有新的數據寫入。這種方法備份出來的數據恢復也很簡單,直接拷貝回原來的數據庫目錄下即可。
   爲了方便的拷貝出數據文件,我寫了一個腳本讓其每天運行一次做備份。在/目錄下建一個目錄用來放置腳本文件,
#mkdir /scripts

創建一個備份數據庫的一個腳本文件
#vi backup_mysql.sh
 
#!/bin/bash
 
backup_dir=/backup/databak   #備份文件放置目錄
backup_target_dir=/backup/db
backup_logs_dir=/backup/logs   #備份日誌目錄
db=bcmedia
 
DATE=$(date +%Y%m%d)
#得到10天前的日期
ccDATE=$(date "-d 10 day ago" +%Y%m%d)
 
echo "開始複製數據表"  >> $backup_logs_dir/$db$DATE
echo "-----------`date +"%Y-%m-%d %H:%M:%S"`--------------------"  >> $backup_logs_dir/$db$DATE
 
cp -R /data/$db $backup_target_dir/   #mysql數據庫的數據目錄爲/data
 
echo "開始壓縮數據表"  >> $backup_logs_dir/$db$DATE
echo "------------------------"  >> $backup_logs_dir/$db$DATE
 
cd $backup_target_dir
 
tar -zcvf  $backup_dir/db$DATE.tar.gz $db/ >> $backup_logs_dir/$db$DATE
 
if [ $? -eq 0 ]
then
 echo "backup succeed" >> $backup_logs_dir/$db$DATE
else
 echo "backup fail" >> $backup_logs_dir/$db$DATE
fi
 
echo "開始刪除原數據表"  >> $backup_logs_dir/$db$DATE
 
echo "-----------------------"  >> $backup_logs_dir/$db$DATE
 
rm -rf $backup_target_dir/* && echo “刪除原數據表” >> $backup_logs_dir/$db$DATE
 
echo  "刪除10天前數據" >>$backup_logs_dir/$db$DATE
 
if [ -e $backup_dir/db$ccDATE.tar.gz ]
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
fi

 

 
保存退出並添加可執行的權限
#chmod 755 backup_mysql.sh
讓腳本每天執行一次,每天備份一次數據庫,在crontab 裏面添加一行
Crontab –e
10 4 * * * /scripts/ backup_mysql.sh  #每天4點10分運行腳本備份數據庫

      還原數據庫的時候只要把備份出的文件拷貝到數據庫放置數據的目錄下,修改權限。重啓下數據庫就完成了恢復了。
 
二、 使用mysqldump備份數據庫
 
          mysqldump 是採用SQL級別的備份機制,它將數據表導成 SQL 腳本文件,在不同的 MySQL 版本之間升級時相對比較合適,這也是最常用的備份方法。關於mysqldump的更詳細解釋用/MysqlDir/bin/mysqldump –help 來查看詳細的解釋。
      我們使用的數據庫備份完成之後有10個G如果每天都做一次全備,不方便,就一個星期做一次全備,一天做一次增量備份。爲了不影響線上業務,實現在線備份,並且能增量備份,最好的辦法就是採用主從複製機制(replication),在 slave 機器上做備份。詳細的mysqlreplication請參看
mysql主主、主從複製詳解
    一個星期一次的全備的腳本,腳本文件放在/scripts目錄下,備份時需要一些目錄,注意需要手動創建。
 
#vi mysql_full_bak.sh
#!/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
更多mysqldump的選項請查看mysqldump –help
 
每天增量備份的腳本,定義爲每天410分時運行此文件,備份上一天410分之後到今天4點之前的數據


#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
加到crontab裏面讓腳本自動執行,如果有專門用於備份的服務器,可以利用ssh認證、scp命令,自動發送到另一臺服務器上,保證數據的安全。可以參看rsync參數詳解、利用ssh、rsync 實現數據的定時同步
 
 
#su –bak
 
#crontab –e
10 4 * * 1-6 /scripts/mysqldailybak.sh   #禮拜一到禮拜六運行每天備份腳本
10 4 * * 0 /scripts/mysql_full_bak.sh   #禮拜天執行全備份的腳本
如果想把備份之後的數據文件,傳送到另一臺服務器上,做好ssh信任之後把腳本中紅色的哪行註釋去掉就行。需要更多scp的資料請查看scp --help
本人對shell也不是很懂,如果裏面有錯誤的地方,希望指正。謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章