mysql數據庫增量備份,在這之前修改我們的數據庫配置文件/etc/my.cnf開啟bin-log日志功能即可,下面小編給大家分享mysql數據庫增量備份的思路詳解,一起看看吧
MySQL數據庫增量備份,在這之前修改我們的數據庫配置文件/etc/my.cnf開啟bin-log日志功能即可。接下來是我參考了下網上的一些方法,自己寫的,主要還是要能學到他的一些思路和方法。
#function:MYSQL增量備份 #version:1.0.0 #author:wangyanlin #date:2017/08/02 #----------------------------------------------------------------------------------------------- #!/bin/sh export?LANG=en_US.UTF-8 #設置時間 DATE=`date?+%Y%m%d` #設置信息 USER=root PASSWORD=withub #設置路徑 cd?/ /usr/bin/mkdir?-p?mysql_bak/daily? /usr/bin/mkdir?-p?mysql_bak/logs BakDir=/mysql_bak/daily BinDir=/var/lib/mysql LogFile=/mysql_bak/logs/Daily_$DATE.log BinlogFile=/var/lib/mysql/mysql-bin.index /usr/bin/mysqladmin?-u$USER?-p$PASSWORD?flush-logs?#刷新日志 Counter=`wc?-l?$BinlogFile?|?awk?'{print?$1}'` NextNum=0 start_time=`date?+'%Y-%m-%d?%H:%M:%S'` echo?`date?+"%Y年%m月%d日?%H:%M:%S"`?$Next1?Bakup?start!?>>?$LogFile #這個for循環用于比對$Counter,$NextNum這兩個值來確定文件是不是存在或最新的。 for?file?in?`cat?$BinlogFile` do ??base=`basename?$file` ??#basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./ ??NextNum=`expr?$NextNum?+?1` ??if?[?$NextNum?-eq?$Counter?] ??then ????echo?$base?skip!?>>?$LogFile ??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 echo?`date?+"%Y年%m月%d日?%H:%M:%S"`?$Next2?Bakup?succ!?>>?$LogFile end_time=`date?+'%Y-%m-%d?%H:%M:%S'` start_seconds=$(date?--date="$start_time"?+%s); end_seconds=$(date?--date="$end_time"?+%s); echo?"本次備份運行時間:?"$((end_seconds-start_seconds))"s"?>>?$LogFile
添加計劃任務:
?????????????????????? crontab -e
?????????????????????? 00 03 * * * /root/MySQL_incrementbak.sh??? #每天的凌晨3點開始增量備份日
logs日志打印出來的效果:
PS:下面看下mysql全量和增量備份腳本
全量:
[root@master?leo]#?cat?DBfullBak.sh? #!/bin/bash #use?mysqldump?to?fully?backup?mysql?data BakDir=/root/leo/full LogFile=/root/leo/full/bak.log Date=`date?+%Y%m%d` Begin=`date?+"%Y年%m月%d日?%H:%M:%S"` cd?$BakDir DumpFile=$Date.sql GZDumpFile=$Date.sql.tgz mysqldump?-uroot?-p123456?--all-databases?--lock-all-tables?--routines?--triggers?--events?--master-data=2?--flush-logs?>?$DumpFile tar?zcvf?$GZDumpFile?$DumpFile rm?$DumpFile Last=`date?+"%Y年%m月%d日?%H:%M:%S"` echo?開始:$Begin?結束:$Last?$GZDumpFile?succ?>>?$LogFile
參數注釋:
--all-databases?#備份所有庫 --lock-all-tables?#為所有表加讀鎖 --routinge??#存儲過程與函數 --triggers??#觸發器 --events???#記錄事件 --master-data=2?#在備份文件中記錄當前二進制日志的位置,并且為注釋的,1是不注釋掉在主從復制中才有意義 --flush-logs??#日志滾動一次
結果如下:
[root@master?full]#?ls 20140728.sql.tgz?bak.log [root@master?full]#?cat?bak.log? 開始:2014年07月28日?19:02:59?結束:2014年07月28日?19:02:59?20140728.sql.tgz?succ 開始:2014年07月28日?19:12:01?結束:2014年07月28日?19:12:01?20140728.sql.tgz?succ [root@master?full]#
增量備份:
[root@master?leo]#?cat?DBDailyBak.sh? #!/bin/bash BakDir=/root/leo/binlog/ BinDir=/var/lib/mysql LogFile=/root/leo/binlog/bak.log BinFile=/var/lib/mysql/mysql-bin.index mysqladmin?-uroot?-p123456?flush-logs Counter=`wc?-l?$BinFile|awk?'{print?$1}'` NextNum=0 for?file?in?`cat?$BinFile` do? ?base=`basename?$file` ?NextNum=`expr?$NextNum?+?1` ?if?[?$NextNum?-eq?$Counter?] ?then ??echo?$base?skip!?>>?$LogFile ?else ??dest=$BakDir/$base ??if(test?-e?$dest) ??then ???echo?$base?exist!?>>?$LogFile ??else ???cp?$BinDir/$base?$BakDir/ ???echo?$base?copying?>>?$LogFile ??fi ?fi done echo?`date?+"%Y年%m月%d日?%H:%M:%S"`?$Next?Bakup?succ~?>>?$LogFile
總結
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END