Percona-xtrabackup——mysql備份
一. 備份政策
資料庫備份,尤其生産庫備份政策需要考慮到如下四點:
- 資料丢失最少
- 資料庫性能影響最小
- 硬碟空間使用最少
- 資料庫恢複時間最少
資料丢失最少,主要是保證在資料庫在當機、硬碟毀壞等不可避免的情況下,能夠最大可能的保證資料不丢失;資料庫性能影響最小,空間使用最小,就需要考慮全備+增量備份;資料恢複時間不僅要考慮資料庫的還原時間,還需要考慮資料庫檔案轉移拷貝的時間。
結合以上情況,制定備份政策如下:
- l 每天0點進行一次全備
- l 每隔5分鐘進行一次增量備份
- l 先備份到本機,再分别将備份檔案拷貝到本機房不同機器上,異地機房的伺服器上,保有三份備份檔案
異機拷貝,及備份檔案拷貝到異地伺服器涉及到檔案轉移方案,将不再本文中叙述。本文僅僅叙述本機備份方案。
二. 備份準備
2.1 建立備份賬戶
備份使用上文安裝的percona-xtrabackup進行熱備,首先需要準備一個mysql備份賬戶,并給予備份需要的最小權限。
>create user 'backupMyDB' identified by '123456';
> GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backupMyDB'@'localhost'
>flush privileges;
上面腳本在mysql中建立了backupMyDB賬戶,密碼123456,并給予RELOAD,PROCESS, LOCK TABLES,REPLICATION CLIENT 權限
2.2 建立備份目錄
$ sudo mkdir /var/mysqlBackups/
在/var/下建立mysqlBackups檔案夾,用于放資料庫備份檔案。
三. 備份腳本
其他不多贅述,直接上腳本
$ vim /var/dayBackup
備份腳本
#!/bin/bash
#mysql 熱備腳本,Version:1.0
#Author:Jack
#備份政策:每天0點進行完整備份,以後每隔5分鐘在前一次備份的基礎上進行增量備份
#第一次差備是基于全備的
#以後每一次差備都是基于前一次的備份的差異
#備份針對執行個體上所有資料庫,包括系統資料庫
#備份資料庫資訊
host="localhost"
dbuser="backupMyDB"
dbpasswd='T+fh!Hm+2kujN+'
dbsocket="/tmp/mysql3306.sock"
dbport=3306
back_dir=/var/mysqlBackups
#備份日志檔案
back_log=${back_dir}/mysql_back.log
#當天日期
today=`date +%F`
#備份時分:
dbHour=`date +"%H-%M"`
#完整備份的時點
fullBackupTime=`date +"%F_00-00"`
#日志記錄函數
function log(){
echo "`date` $1" | tee -a ${back_log}
}
if [ ${dbHour} = "00-00" ] || [ `find ${back_dir} -type d -name "${today}*" | wc -l` eq 0 ];then
#完整備份
#每天删除前一天備份日志
rm -f ${back_log}
log "`date` 開始每天完全備份..."
innobackupex --host=${host} --user=${dbuser} --password=${dbpasswd} --port=${dbport} --socket=${dbsocket} ${back_dir} &>> ${back_log}
if [ $? -eq 0 ];then
log "`date`完全備份完畢。"
else
log "完全備份出錯,請檢查。"
exit 1
fi
#清除一周前的備份檔案
sevenDayAgo=`date +%F -d "7 days ago"`
rm -rf `find ${back_dir} -type d -name "${sevenDayAgo}*"`
else
let dir_num=`find ${back_dir} -type d -name "${lastFiveMinute}*" | wc -l`
if [ ${dir_num} -ne 1 ];then
log "上個5分鐘增量目錄未找到或上個5分鐘備份目錄大于等于2個,請确認後再次備份。"
exit 1
fi
incremental_dir=`find ${back_dir} -type d -name "${lastFiveMinute}*"`
log "`date` 開始增量備份..."
#增量備份
innobackupex --host=${host} --user=${dbuser} --password=${dbpasswd} --port=${dbport} --socket=${dbsocket} --incremental ${back_dir} --incremental-basedir=${incremental_dir} &>> ${back_log}
if [ $? -eq 0 ];then
log "`date` 增量備份成功。"
else
log "增量備份失敗,請檢查日志..."
exit 1
fi
fi
exit $?
該腳本需要調整的部分為資料庫資訊部分,mysql資料庫配置檔案my.cnf,資料庫socket的檔案路徑,端口
innobackup隻能備份資料庫相關檔案,如果資料庫data目錄下還存儲有其他檔案,需要手動備份
四. 部署備份定時任務
$ Crontab –e
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90TQhhWNXRWcWNjYvB3MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DM4UzMwgDNwITMyQDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)