Xtrabackup命令属于物理备份,还原速度快,mysql自身带着mysqldump属于逻辑备份,适用于备份小型数据库,,而且mysqldump备份得是二进制文件,还原较慢。
xtarbackup安装过程如下:
yum install -y wget perl perl-devel perl-Time-HiRes perl-DBD-MySQL perl-Digest-MD5
wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.9/binary/Linux/x86_64/percona-xtrabackup-2.1.9-744-Linux-x86_64.tar.gz
tar xvf percona-xtrabackup-2.1.9-744-Linux-x86_64.tar.gz
cd percona-xtrabackup-2.1.9-Linux-x86_64/
cd bin
cp innobackupex-1.5.1 /usr/bin/innobackupex
cp xtrabackup_55 /usr/bin/xtrabackup
cp xtrabackup_56 /usr/bin/
mkdir -p /data/backup/mysql/log
mkdir -p /data/backup/mysql/bin-log
mysql数据库热备脚本如下:
#!/bin/bash
#mysql热备脚本
#备份策略:每周一进行完整备份,以后每一天在前一天的基础上进行增量备份
#备份目录
back_dir="/data/backup/mysql"
#备份数据库信息
host=""
dbuser=""
dbpasswd=""
#日志文件
back_log="${back_dir}/log/mysql_back.log"
#week day
week_day=`date +%w`
#yesterday
yesterday=`date +%F -d "1 days ago"`
#日志记录函数
function log(){
echo "`date` $1" | tee -a ${back_log}
}
#判断当前日期,是周一进行全备份,其他时间进行增量备份
if [ ${week_day} -eq 1 ]; then
#完整备份
log "周${week_day}开始完全备份..."
innobackupex --defaults-file=/etc/my.cnf --host=${host} --user=${dbuser} --password=${dbpasswd} ${back_dir} &>> ${back_log}
if [ $? -eq 0 ]; then
log "完全备份完毕."
else
log "完全备份出错,请检查."
exit 1
fi
else
let dir_num=`find ${back_dir} -type d -name "${yesterday}*" | wc -l`
if [ ${dir_num} -ne 1 ]; then
log "昨天增量目录未找到或昨天备份目录大于等于2个,请确认后再次备份."
exit 1
fi
incremental_dir=`find ${back_dir} -type d -name "${yesterday}*"`
log "周${week_day}开始增量备份..."
#增量备份
innobackupex --host=${host} --user=${dbuser} --password=${dbpasswd} --incremental ${back_dir} --incremental-basedir=${incremental_dir} &>> ${back_log}
if [ $? -eq 0 ]; then
log "增量备份成功."
else
log "备份失败,请检查日志..."
exit 1
fi
fi
exit $?
备份二进制如下:
#!/bin/bash
# operating environment :CentOS release 6.8
# chkconfig: 2345 80 50
# Auther:wangjiana
bin=$(cat xtrabackup_binlog_info | awk 'BEGIN {FS=" "}{print $1}')
log=$(cat xtrabackup_binlog_info | awk 'BEGIN {FS=" "}{print $2}')
/data/mysql/bin/mysqlbinlog -j $log /data/mysql/data/$bin > /data/backup/mysql/bin-log/Mon.sql
还原脚本如下:
#!/bin/bash
#mysql数据恢复脚本
#back dir
back_dir='/data/backup/mysql'
#full back day
full_back_day=1
#today
today=`date +%F`
#week day
week_day=`date +%w`
#log file
recovery_log="${back_dir}/log/mysql_recovery.log"
#log
function log(){
echo "`date` $1" | tee -a ${recovery_log}
}
#find back dir
function finddir(){
if [ `find $back_dir -type d -name "$1*" | wc -l` -ne 1 ]; then
log "发现备份目录$1为0个或多于一个,请检查..."
exit 1
else
log "发现备份目录`find $back_dir -type d -name "$1*"`"
find_dir="`find $back_dir -type d -name "$1*"`"
fi
}
#all recovery
function allredo(){
log "开始完整备份恢复准备..."
innobackupex --apply-log --redo-only $1 &>> ${recovery_log}
if [ $? -ne 0 ]; then
log "完整恢复准备出错,请检查..."
exit 1
fi
log "完整备份恢复准备完成"
}
#incremental recovery
function incredo(){
log "开始增量数据恢复准备..."
innobackupex --apply-log --redo-only $1 --incremental-dir=$2 &>> ${recovery_log}
if [ $? -ne 0 ]; then
log "增量数据恢复准备出错,请检查..."
exit 1
fi
log "增量数据$2恢复准备完成"
}
#real recovery
function recovery(){
log "备份数据准备完成,开始恢复数据..."
innobackupex --copy-back $1 &>> ${recovery_log}
if [ $? -ne 0 ]; then
log "完整恢复准备出错,请检查..."
exit 1
fi
log "恢复数据完成,请检查."
log "请手动恢复二进制文件数据."
}
#判断今日是否是周一
if [ $week_day -eq ${full_back_day} ]; then
finddir ${today}
all_dir="${find_dir}"
if [ ! -z "${all_dir}" ]; then
allredo $all_dir
recovery $all_dir
else
log "未发现今日备份,恢复上周数据."
for i in "7 6 5 4 3 2 1"
do
back_date=`date +%F -d "${i} days ago"`
if [ $i -eq 7 ]; then
finddir ${back_date}
all_dir="${find_dir}"
allredo ${all_dir}
else
finddir ${back_date}
dir_back=${find_dir}
incredo ${all_dir} ${dir_back}
fi
done
recovery ${all_dir}
fi
else
back_date=`date +%F -d "$((${week_day}-${full_back_day})) days ago"`
finddir ${back_date}
all_dir="${find_dir}"
allredo ${all_dir}
let flag=$((${week_day}-1-${full_back_day}))
while [ ${flag} -ge 0 ]
do
incr_date=`date +%F -d "${flag} days ago"`
finddir ${incr_date}
incr_dir="${find_dir}"
incredo ${all_dir} ${incr_dir}
let flag=`expr $flag - 1`
done
recovery ${all_dir}
fi
exit 0
#恢复数据文件的过程
:'
1、首先关闭mysql程序
2、删除/data/mysql/data文件数据,保证文件夹内容为空
3、运行恢复脚本
4、修改权限chown -R mysql.mysql /data/mysql/data
5、启动mysql程序
如果报错,报错内容:
Starting MySQL...The server quit without updating PID file (/var/lib/mysql/mysql.pid).[失败]
解决的过程各个方法:
1)、可能是/data/MySQL/mysql.pid没有写权限
2)、可能已经存在mysql进程
3)、有残余数据文件影响服务启动,删除mysql-bin.index
4) 、skip-federated字段的问题,注释掉
5)、错误日志目录不存在,关闭seliunx
6、恢复二进制文件
mysql 进入后首先关闭二进制文件
set sql_log_bin = 0;
source /data/backup/mysql/bin-log/Mon.sql
set sql_log_bin = 1 ;
'