[MYSQL]增量備份和全量備份以及恢復


項目需要進行對mysql的增量備份和全量備份,大致思路是通過編寫crontab(定時任務)執行mysqldump指令下載整個sql文件然后壓縮,進行全量備份;開啟MySQLbinlog日志,備份binlog日志文件進行增量備份。

1.前提

檢測bin-log是否開啟,登錄MySQL,輸入
show variables like 'log_%'
+----------------------------------------+---------------------------------------+
| Variable_name | Value |
+----------------------------------------+---------------------------------------+
| log_bin | ON | ------> ON表示已經開啟binlog日志
| log_bin_basename | /usr/local/mysql/data/mysql-bin |
| log_bin_index | /usr/local/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| log_error | /usr/local/mysql/data/martin.err |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| log_throttle_queries_not_using_indexes | 0 |
| log_warnings | 1 |
+----------------------------------------+---------------------------------------+
如未開啟,修改MySQL配置文件,在[mysqld] 區塊
設置/添加 log-bin=mysql-bin 確認是打開狀態(值 mysql-bin 是日志的基本名或前綴名);
重啟mysqld服務使配置生效
# pkill mysqld # /usr/local/mysql/bin/mysqld_safe --user=mysql &

2.全量備份腳本及恢復

備份腳本

#執行環境變量
source /etc/profile
#設置備份目錄
BakDir=/data/mysql/bak/fully_bak
#設置日志目錄
LogFile=/data/mysql/bak/bak.log
Date=`date +"%Y-%m-%d"`
Begin=`date +"%Y-%m-%d %H:%M:%S"`
cd $BakDir
DumpFile=$Date.sql
GZDumpFile=$Date.sql.tgz
echo $DumpFile
#執行mysqldump指令,生產備份sql
mysqldump -u[在此輸入用戶名] -p[在此輸入密碼] --quick --events --databases  [在此輸入數據庫名]   >$DumpFile
/bin/tar -zvcf  $GZDumpFile $DumpFile #壓縮備份文件
/bin/rm $DumpFile #刪除dump文件,只保留壓縮備份
oldDate=`date -d  '7 days ago' + %Y%m%d`
oldBakFile=$(oldDate)".sql.tgz"
Last=`date +"%Y年%m月%d日 %H:%M:%S"`
echo 開始:$Begin結束:Last $GZDumpFile succ >> $LogFile #記錄備份日志

恢復
找到你需要恢復的文件,進行解壓縮
tar -zxvf '恢復文件'
執行解壓縮后的sql文件
mysql –u用戶名 –p密碼 –D數據庫<【sql腳本文件路徑全名】

3.增量備份腳本及恢復

備份腳本

# Program
# use cp to backup mysql data everyday!
# History
# Path
BakDir=/data/mysql/bak/add_bak       #增量備份時復制mysql-bin.00000*的目標目錄,提前手動創建這個目錄
BinDir=/data/mysql               #mysql數據存放目錄
LogFile=/data/mysql/bak/add_bak.log             #備份日志存放目錄
BinFile=/data/mysql/bin.index       #mysql數據目錄下的index文件
Date=`date +%Y%m%d`
Begin=`date +"%Y年%m月%d日 %H:%M:%S"`
mysqladmin -uroot -pPassc0de@tpcpjl flush-logs
#這個是用於產生新的mysql-bin.00000*文件
Counter=`wc -l $BinFile |awk '{print $1}'`
NextNum=0
#這個for循環用於比對$Counter,$NextNum這兩個值來確定文件是不是存在或最新的
echo \######################################################  >> $LogFile
 
for file in `cat $BinFile`
do
    base=`basename $file`
    #basename用於截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
    NextNum=`expr $NextNum + 1`
    if [ $NextNum -eq $Counter ]
    then
         echo $base skip! > /dev/null
    else
        dest=$BakDir/$base
        if(test -e $dest)
        #test -e用於檢測目標文件是否存在,存在就寫exist!到$LogFile去
        then
            echo $base exist! >> $LogFile
        else
            cp $BinDir/$base $BakDir
            echo $base copying >> $LogFile
         fi
     fi
done
Last=`date +"%Y年%m月%d日 %H:%M:%S"`
echo 開始:$Begin 結束:$Last$Next mysql-daily-backup successful !!! >> $LogFile
echo    >> $LogFile
ls -l -h  $BakDir

恢復
通過binlog將日志文件轉為sql文件,然后執行sql
mysqlbinlog --base64-output=decode-rows 'binlog文件完整路徑'>/opt/excute.sql
執行生成的sql文件

3.定時任務設置

安裝
yum install vixie-cron
yum install crontabs
vixie-cron軟件包是cron的主程序; 
crontabs軟件包是用來安裝、卸裝、或列舉用來驅動 cron 守護進程的表格的程序。
啟動命令
service crond start //啟動服務 
service crond stop //關閉服務 
service crond restart //重啟服務 
service crond reload //重新載入配置
service crond status //查看狀態
chkconfig crond on //設置開機自動啟動crond服務:
chkconfig –list crond //開機級別的crond服務運行情況 ,2、3、4、5級別開機會自動啟動crond服務 
chkconfig crond off//取消開機自動啟動crond服務:
定時執行腳本
crontab -e 進入定時任務編輯模式,輸入cron表達式和執行腳本完整路徑,保存
00 02 * * * /opt/add_bak.sh
cron表達式的一些例子

0 0 10,14,16 * * ? 每天上午10點,下午2點,4點觸發 

0 0/30 9-17 * * ? 朝九晚五工作時間內每半小時觸發  

0 0 12 ? * WED 表示每個星期三中午12點觸發  

0 0 12 * * ? 每天中午12點觸發 

0 15 10 ? * * 每天上午10:15觸發 

0 15 10 * * ? 每天上午10:15觸發 

0 15 10 * * ? * 每天上午10:15觸發 

0 * 14 * * ? 在每天下午2點到下午2:59期間的每1分鍾觸發 

0 0/5 14 * * ? 在每天下午2點到下午2:55期間的每5分鍾觸發 

0 0/5 14,18 * * ? 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鍾觸發 

0 0-5 14 * * ? 在每天下午2點到下午2:05期間的每1分鍾觸發 

0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44觸發 

0 15 10 ? * MON-FRI 周一至周五的上午10:15觸發 

0 15 10 15 * ? 每月15日上午10:15觸發 

0 15 10 L * ? 每月最后一日的上午10:15觸發


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM