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