衆所周知,資料對于一個産品來說是非常重要的,特别是已上線的産品,為了産品的健壯性,首先保證資料的安全。防止資料被惡意删除等情況的出現。是以,我們定時對資料庫資料進行備份;
一.什麼是全量備份與增量備份?
全量備份:指對某一個時間點上的所有資料或應用進行的一個完全拷貝。實際應用中就是用一盤錄音帶對整個系統進行全量備份,包括其中的系統和所有資料。這種備份方式最大的好處就是隻要用一盤錄音帶,就可以恢複丢失的資料。是以大大加快了系統或資料的恢複時間。然而它的不足之處在于,各個全備份錄音帶中的備份資料存在大量的重複資訊;另外,由于每次需要備份的資料量相當大,是以備份所需時間較長。
增量備份:針對于上一次備份(無論是哪種備份):備份上一次備份後(包含全量備份、差異備份、增量備份),所有發生變化的檔案。(增量備份過程中,隻備份有标記的選中的檔案和檔案夾,它清除标記,既:備份後标記檔案,換言之,清除存檔屬性);就是指在一次全備份或上一次增量備份後,以後每次的備份隻需備份與前一次相比增加和者被修改的檔案,這就意味着,第一次增量備份的對象是進行全備後所産生的增加和修改的檔案;第二次增量備份的對象是進行第一次增量備份後所産生的增加和修改的檔案,如此類推。這種備份方式最顯著的優點就是:沒有重複的備份資料,是以備份的資料量不大,備份所需的時間很短。但增量備份的資料恢複是比較麻煩的。您必須具有上一次全備份和所有增量備份錄音帶(一旦丢失或損壞其中的一盤錄音帶,就會造成恢複的失敗),并且它們必須沿着從全備份到依次增量備份的時間順序逐個反推恢複,是以這就極大地延長了恢複時間。
二,開始進行mysql備份操作
1.增量備份
在進行增量備份之前,我們需要先打開mysql的binlog功能;
原理
mysql binlog 的功能,會記錄所有的使用者的操作,可以依靠這個,配合全備份,将資料庫復原到某一個特殊的時刻。hhh
簡單來說,比如我們每周做一次全備份,每天做一次增量備份,當資料庫發生問題的時候,我們就可以先将資料庫復原到上一周我們的全備份的時間,然後再通過每天的增量備份(其實就是模拟所有的資料庫操作,全部執行一遍),将資料恢複到我們想要的時間點。
知道它的原理之後,我們先來打開mysql的binlog功能,
mysql 的 binlog 功能需要在配置檔案中打開,在 my.cnf 或者 mysqld.cnf 中添加以下幾行:
[mysqld]
skip-name-resolve
port = 3306
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
lower_case_table_name=1
max_allowed_packet=16M
datadir=/pro/mysql/data
以下是需要添加的内容
#binlog setting,
log-bin=/pro/mysql/mysql-bin
server-id=12345
# 需要備份的資料庫名,如果備份多個資料庫,重複設定這個選項即可
binlog-do-db=db1
binlog-do-db=db2
# 不需要備份的資料庫,如果備份多個資料庫,重複設定這個選項即可
binlog-ignore-db=db1
重新開機mysql服務
service mysql restart
檢視 logbin 是否開啟,進入到 myslq 指令行,輸入如下指令:
show variables like '%log_bin%';
如下指令所示,則為未開啟
mysql> show variables like '%log_bin%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin | OFF |
| log_bin_basename |
/pro/mysql
|
| log_bin_index |
/pro/mysql/mysql-bin.index
|
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-------+
然後退出mysql;我們來編寫增量備份 自動化腳本
首先。我們進入到自己放置腳本的目錄
cd /pro/bin
建立一個 xx.sh腳本
vim mysql_daily.sh
配置以下内容:
-----------------------------------------------------------腳本内容--------------------------------------------------------------------------------------------------
# 增量備份存放路徑
backDir=/pro/mysql/daily
# binlog存放路徑
binDir=/pro/mysql/ (上面開啟binlog的路徑,忘記了就通過mysql
show variables like '%log_bin%'; 進行查詢
)
# binlog.index 檔案路徑
binIndex=/pro/mysql/mysql-bin.index (上面開啟binlog的路徑,忘記了就通過mysql
show variables like '%log_bin%'; 進行查詢
)
# 日志檔案
logFile=/pro/mysql/daily/bak-daily.log
# 将目前所有的日志寫到磁盤,會建立一個00000*的binlog檔案
mysqladmin -uroot -phhxxttxs flush-logs
# 擷取目前有幾條binlog檔案(需要保證是從1開始的)
count=`wc -l $binIndex | awk '{print $1}'`
nextNum=0
for file in `cat $binIndex`
do
# 擷取檔案名,去除檔案夾名
base=`basename $file`
# 周遊每個binlog檔案,如果是最新的不做操作,否則備份
nextNum=`expr $nextNum + 1`
if [ $nextNum -eq $count ]
then
echo $base skip! >> $logFile
else
dest=$backDir/$base
# file already exist
if(test -e $dest)
then
echo $base exist! >> $logFile
else
cp $binDir/$base $backDir
echo $base copyed >> $logFile
fi
fi
done
echo `date +"%Y%m%d %H:%M:%S"` Backup succ! >> $logFile
-------------------------------------------腳本内容結束----------------------------------------------------------
至此配置完成。測試啟動一下該腳本
sh /pro/bin/mysql_daily.sh start
檢視有沒有産生備份
cd /pro/mysql/data/daily
ll
我們會看到裡面有個
mysql-bin.000001。這個檔案裡面會記錄所有的使用者的操作,可以依靠這個,配合全備份,将資料庫復原到某一個特殊的時刻
2.全量備份
首先。我們進入到自己放置腳本的目錄
cd /pro/bin
建立一個 xx.sh腳本
vim mysql_weekly.sh
配置以下内容(相關路徑根據自己的實際情況而定)
-------------------------------------------------------------腳本内容-----------------------------------------------------------------------------------------
# 全備份路徑
backDir=/pro/
mysql/data/weekly
# 日志檔案
logFile=/pro/mysql/data/weekly/weekly_all.log
# 擷取目前時間,用于命名
nowDate=`date +%Y%m%d`
beginTime=`date +"%Y%m%d %H:%M:%S"`
# 進入備份檔案夾
cd $backDir
dumpFile=$nowDate.sql
dumpFileTgz=$nowDate.sql.tgz
# mysqldump 導出所有資料庫
echo dumping...
mysqldump -uroot -ppwd --quick --all-databases --flush-logs --delete-master-logs --single-transaction > $dumpFile
echo compressing...
# 壓縮檔案
tar czvf $dumpFileTgz $dumpFile
rm $dumpFile
endTime=`date +"%Y%m%d %H:%M:%S"`
echo begin:$beginTime end:$endTime $dumpFileTgz succ >> $logFile
# 清除之前的增量備份
cd /pro/
mysql/data/daily (你的增量備份路徑)
rm -f *
----------------------------------------------腳本内容結束-------------------------------------------------------
測試運作該腳本之後,你會發現知道存儲路徑下面有個
XXX.sql.tz的壓縮包
3.配置定時任務,去定時啟動這2個腳本
輸入如下指令,進入定時任務編輯界面:
crontab -e
添加如下指令(注意:linux的定時規則與spring的不同)
每天2點啟動一次增量備份
0 2 * * * sh /pro/bin/mysql_daily.sh
0 2 5 * * sh /pro/bin/mysql_weekly.sh