mysql的增量备份方法_Mysql 增量备份,全部备份实现方法以及自动化脚本
前情摘要
自己作死干了一件特別蠢的事情(具體略)
然后開始研究如何進行增量備份
增量備份
原理
mysql 有個 binlog 的功能,會記錄所有的用戶的操作,可以依靠這個,配合全備份,將數據庫回滾到某一個特殊的時刻。hhh
簡單來說,比如我們每周做一次全備份,每天做一次增量備份,當數據庫發生問題的時候,我們就可以先將數據庫回滾到上一周我們的全備份的時間,然后再通過每天的增量備份(其實就是模擬所有的數據庫操作,全部執行一遍),將數據恢復到我們想要的時間點。
配置
mysql 的 binlog 功能需要在配置文件中打開,在 my.cnf 或者 mysqld.cnf 中添加以下幾行:server-id = 1
# binlog存放路徑
log_bin = /var/log/mysql/mysql-bin.log
# binlog記錄的格式,有row、statement、mixed三種選項
binlog-format = row
# binlog寫緩沖區設置大小,由于是內存,寫速度非常快,可以有效提高binlog的寫效率,如果數據庫中經常出現大事務,可以酌情提高該參數。
binlog_cache_size = 32m
# 最大緩存區大小
max_binlog_cache_size = 512m
# binlog文件最大的大小
max_binlog_size = 1000m
# 需要備份的數據庫名,如果備份多個數據庫,重復設置這個選項即可
binlog-do-db=game
binlog-do-db=platform
# 不需要備份的數據庫,如果備份多個數據庫,重復設置這個選項即可
binlog-ignore-db=
重啟mysql服務,在對應的文件夾下(這里是/var/log/mysql)會看到 mysql-bin.000001 和 mysql-bin.index 兩個文件,第一個就是我們需要的 binlog 文件,里面會記錄我們的操作,第二個負責記錄 binlog 的名稱,可以用來判斷當前最新的 binlog 是哪一個
一些相關的操作
開啟了binlog之后,就可以進行一些嘗試了,可以先去數據庫做一些修改操作。(因為binlog的格式選擇的是row,所以select語句是不會被記錄的)mysql> UPDATE ....
mysql> DELETE ....
// 查看當前log的備份情況
mysql> show master logs;
// 查看最新的備份文件的情況
mysql> show master status;
// 將當前的log寫入磁盤,并創建新的binlog文件
mysql> flush log;
binlog 文件可以使用 mysqlbinlog 命令查看// 查看binlogfile即可看到這份log中記錄的數據庫操作
mysqlbinlog mysql-bin.000011 > /tmp/binlogfile
// 獲取指定位置范圍的記錄
mysqlbinlog --start-position=1285 --stop-position=1681 mysql-bin.000011 > /tmp/binlogfile
// 獲取指定時間范圍內的記錄,常用
mysqlbinlog --start-date="2012-10-15 16:30:00" --stop-date="2012-10-15 17:00:00"
全備份
全備份沒什么好說的,mysqldump一條命令就可以了mysqldump -uroot -ppwd --quick --all-databases --flush-logs --delete-master-logs --single-transaction > $dumpFile
注意里面的一些參數,尤其是flush-logs和single-transaction兩個參數,建議開啟
自動化腳本
全備份#!/bin/bash
# 全備份路徑
backDir=/var/log/mysql/backup/weekly
# 日志文件
logFile=/var/log/mysql/backup/bak-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 $backDir/../daily
rm -f *
增量備份腳本#!/bin/bash
# 增量備份存放路徑
backDir=/var/log/mysql/backup/daily
# binlog存放路徑
binDir=/var/log/mysql/
# 日志文件
logFile=/var/log/mysql/backup/bak-daily.log
# binlog.index 文件路徑
binIndex=/var/log/mysql/mysql-bin.index
# 將當前所有的日志寫到磁盤,會新建一個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
做一下定時就好了
具體恢復操作
當發現數據丟失時確認丟失數據的開始時間
找到距離這個時間最近的全量備份
mysql -uuser -p < all.sql
依次運行從全備份到丟失時間之間的增量備份
mysqlbinlog mysql-bin.000123 –start-date=”” –end-date=”” > /tmp/tmpfile
mysql -uuser -p < /tmp/tmpfile
通過以上,就可以將數據還原到需要的還原點。
記得定期查看備份的log文件,以防出現問題,全備份需要定時清理
總結
以上是生活随笔為你收集整理的mysql的增量备份方法_Mysql 增量备份,全部备份实现方法以及自动化脚本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云mysql写入性能_插入mysql
- 下一篇: mysql的安装胚子_下列哪个制剂是以主