版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_42018518/article/details/88887182
目录
1、(备份调度机器)调度脚本: /home/wufei/backup_controll/backup_controll_wf.sh
2、(备份存储机器)默认配置文件:/home/backup_mysql_wufei/conf/xxxx_mysql_backup_wf.conf
3、(备份存储机器)备份脚本函数:/home/backup_mysql_wufei/bin/xxxx_xtrabackup_wf.sh
4、(备份存储机器)备份脚本模板:/home/backup_mysql_wufei/bin/mysql_template_backup.sh
1、(备份调度机器)调度脚本: /home/wufei/backup_controll/backup_controll_wf.sh
#!/bin/bash
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Program : MySQL 备份脚本 #
# Version : percona xtrabackup 2.4.7 #
# Author : [email protected] #
# Description : backup base functions #
# Date : 2018-06-12 #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
usage(){
echo "$0 <backup_db>"
}
if [ $# -ne 1 ];then
usage;
echo "backup_db: such as 'higo_bim'"
exit;
fi
user="backup_wf"
passwd="xxxxx"
host="xx.xx.1.49"
port=3303
db_name="wf_dbbackup"
tb_name="db_backup_policy"
backup_db=$1
log_dir="/home/wufei/backup_controll/log"
xtrabackup_wf_file="/home/backup_mysql_wufei/bin/higo_xtrabackup_wf.sh"
# 获取相关参数信息
function getinfo(){
sql="select id,port,mode,inet_ntoa(dest_ip) as dest_ip from ${tb_name} where db='${backup_db}'"
read id port db_mode db_dest_ip <<< `mysql_e "${sql}"`
}
# 连接MySQL
function mysql_e(){
mysql -u${user} -p${passwd} -h${host} -P${port} -D${db_name} -Ne "${1}"
}
# 获取当前时间
function backup_datetime(){
backup_date=`date +%F`
backup_time=`date +%H:%M:%S`
}
# 执行备份
function init(){
ssh -i ~/.ssh/id_rsa root@${db_dest_ip} "bash ${xtrabackup_wf_file} ${id}" > /dev/null 2>&1
}
# 记录日志信息
function setlog(){
echo "{backup_db:${backup_db};port:${port};type:${db_mode};start_datetime:${start_datetime};end_datetime:${end_datetime};info:backup end}" >> ${log_dir}/${backup_db}_${port}.log
}
function main(){
# 获取相关参数信息
getinfo
port=${port}
db_mode=${db_mode}
db_dest_ip=${db_dest_ip}
id=${id}
#获取备份开始时间
backup_datetime
start_datetime="${backup_date} ${backup_time}"
# 执行备份
init
# 获取备份结束时间
backup_datetime
end_datetime="${backup_date} ${backup_time}"
# 记录日志
setlog
}
main
2、(备份存储机器)默认配置文件:/home/backup_mysql_wufei/conf/xxxx_mysql_backup_wf.conf
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Program : MySQL 备份配置文件 #
# Author : [email protected] #
# Date : 2018-06-07 #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# 备份数据库私有配置文件(存储服务器路径)(默认)
conf_template=/home/backup_mysql_wufei/conf/xxxx_mysql_template_wf.conf
# 备份数据库私有配置文件(远程服务器路径)(默认)
remote_conf=/data/percona-xtrabackup/backup_mysql_wufei/conf/xxxx_mysql_backup_wf.conf
# MySQL备份信息数据库连接用户
db_user=backup_wf
# MySQL备份信息数据库连接密码
db_password=xxxxx
# MySQL备份信息数据库
db_name=wf_dbbackup
# MySQL备份信息表
db_table_name=db_backup_policy
# MySQL备份信息数据库IP
db_host=xx.xx.1.49
# MySQL备份信息数据库端口
db_port=3303
# MySQL备份用户名(默认)
user=xtrabackup
# MySQL备份用户密码(默认)
password=xtrabackup
# 备份路径(默认)
backup_dir=/data/percona-xtrabackup/backup_mysql_wufei/backup
# 存储路径(默认)
storage_dir=/home/backup_mysql_wufei/backup
# 备份保存天数(默认)
remain_days=30
# 备份软件路径(默认)
xtrabackup_dir=/data/percona-xtrabackup/xtrabackup
# 全备是在一周的第几天(默认)
full_backup_week_day=2
# 全量备份信息名称 前缀(默认)
full_backup_prefix=full
# 增量备份信息名称 前缀(默认)
increment_prefix=incr
# 克隆从库信息名称 前缀(默认)
cloneslave_prefix=clone
# MySQL配置文件(默认)
mysql_conf_file=/etc/my.cnf
# MySQL socket文件(默认)
mysql_socket_file=/data/mysql-5.7.16/etc/mysql.sock
# 错误日志文件(根据此文件知道备份是否成功)(默认)
# format:
# {week_day:1,dir:full/incr_2017-06-12_14-58-56_7,type:full/incr,date:2017-06-14}
storage_error=/home/backup_mysql_wufei/var
error_log=/data/percona-xtrabackup/backup_mysql_wufei/var
# 索引文件(默认)
# format:
# {week_day:1,dir:full/incr_2017-06-12_14-58-56_7,type:full/incr}
storage_index=/home/backup_mysql_wufei/var
index_file=/data/percona-xtrabackup/backup_mysql_wufei/var
# 存储binlog备份目录(默认)
storage_binlogs=/home/backup_mysql_wufei/binlogs
# 日志目录
log_dir=/data/percona-xtrabackup/backup_mysql_wufei/log
# 存储日志目录(默认)
storage_log=/home/backup_mysql_wufei/log
# 备份模板脚本文件(存储服务器路径)
storage_backup_template=/home/backup_mysql_wufei/bin/mysql_template_backup.sh
# 备份数据库私有配置文件(远程服务器路径)
remote_backup_template=/data/percona-xtrabackup/backup_mysql_wufei/bin/mysql_template_backup.sh
3、(备份存储机器)备份脚本函数:/home/backup_mysql_wufei/bin/xxxx_xtrabackup_wf.sh
#!/bin/bash
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Program : MySQL 备份脚本 #
# Version : percona xtrabackup 2.4.7 #
# Author : [email protected] #
# Description : backup base functions #
# Date : 2018-06-07 #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# 更新时间:2018-09-11;更新人:WUFEI;更新内容:增加记录备份信息到MySQL表db_backup_info中功能,并且新增在执行备份脚本前清空本地默认索引文件方法。
# 更新时间:2018-09-12;更新人:WUFEI;更新内容:修改db_backup_info方法,插入SQL中增加policy_id字段。
# 更新时间:2018-09-14;更新人:WUFEI;更新内容:增加备份状态监控提醒,当备份失败failed时发送邮件给DBA
# 更新时间:2018-11-15;更新人:WUFEI;更新内容:由于重新安装了MySQL5.6.16,所以把mysql的相关命令改为绝对路径/data/mysql-5.6.16/bin/mysql
function usage(){
echo "$0 <policy_id>"
}
if [ $# -ne 1 ];then
usage;
exit;
fi
backup_wufei_path="/home/backup_mysql_wufei"
# 接受要备份的策略ID
policy_id=$1
# 读取配置文件中的所有变量,设置为全局变量
# 配置文件
conf_file="/home/backup_mysql_wufei/conf/xxxx_mysql_backup_wf.conf"
# 备份库配置文件(存储服务器生成的临时文件路径)(默认:/home/backup_mysql_wufei/conf/xxxx_mysql_backup_wf.conf)
conf_template=`sed '/^conf_template=/!d;s/.*=//' ${conf_file}`
# 备份数据库私有配置文件(远程服务器路径)(默认:/data/percona-xtrabackup/backup_mysql_wufei/conf/xxxx_mysql_backup_wf.conf)
remote_conf=`sed '/^remote_conf=/!d;s/.*=//' ${conf_file}`
# MySQL备份信息数据库连接用户(默认:root)
db_user=`sed '/^db_user=/!d;s/.*=//' ${conf_file}`
# MySQL备份信息数据库连接密码(默认:XXXXX)
db_password=`sed '/^db_password=/!d;s/.*=//' ${conf_file}`
# MySQL备份信息数据库(默认:wf_dbbackup)
db_name=`sed '/^db_name=/!d;s/.*=//' ${conf_file}`
# MySQL备份信息表(默认:db_backup_policy)
db_table_name=`sed '/^db_table_name=/!d;s/.*=//' ${conf_file}`
# MySQL备份信息数据库IP(默认:xx.xx.1.49)
db_host=`sed '/^db_host=/!d;s/.*=//' ${conf_file}`
# MySQL备份信息数据库端口(默认:3033)
db_port=`sed '/^db_port=/!d;s/.*=//' ${conf_file}`
# MySQL备份用户(默认:xtrabackup)
user=`sed '/^user=/!d;s/.*=//' ${conf_file}`
# MySQL备份用户密码(默认:xtrabackup)
password=`sed '/^password=/!d;s/.*=//' ${conf_file}`
# MySQL备份目录(默认:/data/percona-xtrabackup/backup_mysql_wufei/backup)
backup_dir=`sed '/^backup_dir=/!d;s/.*=//' ${conf_file}`
# 存储备份目录(默认:/home/backup_mysql_wufei/backup)
storage_dir=`sed '/^storage_dir=/!d;s/.*=//' ${conf_file}`
# 备份保存天数(默认:30)
remain_days=`sed '/^remain_days=/!d;s/.*=//' ${conf_file}`
# percona xtrabackup备份软件路径(默认:/data/percona-xtrabackup/xtrabackup)
xtrabackup_dir=`sed '/^xtrabackup_dir=/!d;s/.*=//' ${conf_file}`
# 全备在一周的第几天(默认:2)
full_backup_week_day=`sed '/^full_backup_week_day=/!d;s/.*=//' ${conf_file}`
# 全量备份信息名称 前缀(默认:full)
full_backup_prefix=`sed '/^full_backup_prefix=/!d;s/.*=//' ${conf_file}`
# 增量备份信息名称 前缀(默认:incr)
increment_prefix=`sed '/^increment_prefix=/!d;s/.*=//' ${conf_file}`
# 克隆从库信息名称 前缀(默认:clone)
cloneslave_prefix=`sed '/^cloneslave_prefix=/!d;s/.*=//' ${conf_file}`
# MySQL配置文件(默认:/etc/my.cnf)
mysql_conf_file=`sed '/^mysql_conf_file=/!d;s/.*=//' ${conf_file}`
# MySQL socket文件(默认:/data/mysql-5.7.16/etc/mysql.sock)
mysql_socket_file=`sed '/^mysql_socket_file=/!d;s/.*=//' ${conf_file}`
# 备份错误日志文件(默认:/data/percona-xtrabackup/backup_mysql_wufei/var/mysql_wufei_backup.err)
error_log=`sed '/^error_log=/!d;s/.*=//' ${conf_file}`
# 存储错误日志文件(默认:/home/backup_mysql_wufei/var/mysql_wufei_backup.err)
storage_error=`sed '/^storage_error=/!d;s/.*=//' ${conf_file}`
# 备份索引文件(默认:/data/percona-xtrabackup/backup_mysql_wufei/var/mysql_wufei_backup.index)
index_file=`sed '/^index_file=/!d;s/.*=//' ${conf_file}`
# 存储索引文件(默认:/home/backup_mysql_wufei/var/mysql_wufei_backup.index)
storage_index=`sed '/^storage_index=/!d;s/.*=//' ${conf_file}`
# 存储binlog备份目录(默认:/home/backup_mysql_wufei/binlogs)
storage_binlogs=`sed '/^storage_binlogs=/!d;s/.*=//' ${conf_file}`
# 日志存放目录(默认:/data/percona-xtrabackup/backup_mysql_wufei/log)
log_dir=`sed '/^log_dir=/!d;s/.*=//' ${conf_file}`
# 存储日志目录(默认:/home/backup_mysql_wufei/log)
storage_log=`sed '/^storage_log=/!d;s/.*=//' ${conf_file}`
# 备份模板脚本文件(存储服务器路径)(默认:/home/backup_mysql_wufei/bin/mysql_template_backup.sh)
storage_backup_template=`sed '/^storage_backup_template=/!d;s/.*=//' ${conf_file}`
# 备份数据库私有配置文件(远程服务器路径)(默认:/data/percona-xtrabackup/backup_mysql_wufei/bin/mysql_template_backup.sh)
remote_backup_template=`sed '/^remote_backup_template=/!d;s/.*=//' ${conf_file}`
# 备份日期
backup_date=`date +%F`
backup_time=`date +%H-%M-%S`
backup_week_day=`date +%u`
backup_dt=`date +%y%m%d_%H%M%S`
backup_dtt=`date +%y%m%d%H%M%S`
# MySQL备份信息数据库连接
function mysql_conn01(){
/data/mysql-5.6.16/bin/mysql -u${db_user} -p${db_password} -h${db_host} -P${db_port} -N -e "${1}"
}
function mysql_conn02(){
/data/mysql-5.6.16/bin/mysql -u${db_user} -p${db_password} -h${db_host} -P${db_port}
}
# 获取备份目的IP和路径等信息
function getdest(){
if [[ $policy_id = '' ]]; then
info="No policy_id was found!"
echo "$info"
exit;
else
sql="select db,inet_ntoa(ip) as ip,port,data_socket,inet_ntoa(dest_ip) as dest_ip,mode,full_backup_week_day,remain_days,zip_type,parallel,throttle,begintime from ${db_name}.${db_table_name} where id=${policy_id}"
read db db_backup_ip db_backup_port db_backup_socket db_dest_ip db_mode db_full_backup_week_day db_remain_days zip_type db_parallel db_throttle db_begintime <<< `mysql_conn01 "${sql}"`
# 如果没有存储备份目录则建立
storage_dir="${storage_dir}/mysql_${db}_${db_backup_port}"
if [ ! -d "${storage_dir}" ];then
mkdir -p ${storage_dir}
fi
# 如果没有存储binlog目录则建立
storage_binlogs="${storage_binlogs}/mysql_${db}_${db_backup_port}"
if [ ! -d "${storage_binlogs}" ];then
mkdir -p ${storage_binlogs}
fi
# 如果没有存储日志目录则建立
storage_log=${storage_log}
if [ ! -d "${storage_log}" ];then
mkdir -p ${storage_log}
fi
# 如果没有 var dir 则建立
# var_dir=storage_error or var_dir=storage_index
if [ ! -d "${storage_error}" ];then
mkdir -p ${storage_index}
fi
# 如果没有存储错误日志文件则建立
storage_error_file="${storage_error}/mysql_${db}_${db_backup_port}.err"
if [ ! -f "${storage_error_file}" ];then
touch ${storage_error_file}
fi
# 如果没有存储索引文件则建立
storage_index_file="${storage_index}/mysql_${db}_${db_backup_port}.index"
if [ ! -f "${storage_index_file}" ];then
touch ${storage_index_file}
fi
# 若果没有默认临时错误日志文件和索引文件则建立
default_error_file="/home/backup_mysql_wufei/var/mysql_wufei_backup.err"
if [ ! -f "${default_error_file}" ];then
touch ${default_error_file}
fi
default_index_file="/home/backup_mysql_wufei/var/mysql_wufei_backup.index"
if [ ! -f "${default_index_file}" ];then
touch ${default_index_file}
fi
# 如果没有备份过程信息日志文件则建立
if [[ ${db_mode} = 'incr' && ${full_backup_week_day} -eq ${backup_week_day} ]];then
backup_folder=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
else
backup_folder=${db_mode}_${backup_date}_${backup_time}_${backup_week_day}
fi
innobackupex_log="${storage_log}/${backup_folder}_${db}_${db_backup_port}.log"
if [ ! -f "${innobackupex_log}" ];then
touch ${innobackupex_log}
fi
fi
}
function check_innnobackupex(){
echo "check the innobackupex:innobackupex version 2.4.7 Linux (x86_64) (revision id: 05f1fcf)" >> ${storage_logfile}
# 检查innobackupex工具是否安装
innobackupex_info=`ssh -i ~/.ssh/id_rsa root@${db_backup_ip} "ls /data/percona-xtrabackup/xtrabackup/bin/innobackupex"`
if [[ ${innobackupex_info} = '' ]]
then
info="xtrabackup not installed!"
echo "${info}" >> ${storage_logfile}
echo "创建相关目录及文件" >> ${storage_logfile}
ssh -i ~/.ssh/id_rsa root@${db_backup_ip} "mkdir -p /data/soft"
ssh -i ~/.ssh/id_rsa root@${db_backup_ip} "mkdir -p /data/percona-xtrabackup/backup_mysql_wufei/bin"
ssh -i ~/.ssh/id_rsa root@${db_backup_ip} "mkdir -p /data/percona-xtrabackup/backup_mysql_wufei/conf"
ssh -i ~/.ssh/id_rsa root@${db_backup_ip} "mkdir -p /data/percona-xtrabackup/backup_mysql_wufei/var"
ssh -i ~/.ssh/id_rsa root@${db_backup_ip} "mkdir -p /data/percona-xtrabackup/backup_mysql_wufei/log"
ssh -i ~/.ssh/id_rsa root@${db_backup_ip} "mkdir -p /data/percona-xtrabackup/backup_mysql_wufei/backup/mysql_${db}_${db_backup_port}"
ssh -i ~/.ssh/id_rsa root@${db_backup_ip} "touch /data/percona-xtrabackup/backup_mysql_wufei/var/mysql_${db}_${db_backup_port}.err"
ssh -i ~/.ssh/id_rsa root@${db_backup_ip} "touch /data/percona-xtrabackup/backup_mysql_wufei/var/mysql_${db}_${db_backup_port}.index"
echo "install percona xtrabackup 2.4.7" >> ${storage_logfile}
ssh -i ~/.ssh/id_rsa root@${db_backup_ip} "rsync -avprP -e ssh ${db_host}:/home/wufei/percona-xtrabackup-2.4.7-Linux-x86_64.tar.gz /data/soft/" >> ${storage_logfile} 2>&1
echo "使用二进制编译好的就行了,这种工具无需源码编译,因为没有什么功能需要定制" >> ${storage_logfile}
ssh -i ~/.ssh/id_rsa root@${db_backup_ip} "tar -zxvf /data/soft/percona-xtrabackup-2.4.7-Linux-x86_64.tar.gz -C /data/percona-xtrabackup/" >> ${storage_logfile} 2>&1
ssh -i ~/.ssh/id_rsa root@${db_backup_ip} "mv /data/percona-xtrabackup/percona-xtrabackup-2.4.7-Linux-x86_64 /data/percona-xtrabackup/xtrabackup"
# 为了防止/etc/profile出现意想不到的错误,执行innobackupex时直接使用了绝对路径(在mysql_template_backup.sh中)
# ssh -i ~/.ssh/id_rsa root@${db_backup_ip} "echo 'export PATH=\$PATH:/data/percona-xtrabackup/xtrabackup/bin' >> /etc/profile"
# ssh -i ~/.ssh/id_rsa root@${db_backup_ip} "source /etc/profile"
echo "创建备份用户" >> ${storage_logfile}
else
echo "已安装innobackupex工具" >> ${storage_logfile}
fi
innobackupex_info=`ssh -i ~/.ssh/id_rsa root@${db_backup_ip} "ls /data/percona-xtrabackup/xtrabackup/bin/innobackupex"`
if [[ ${innobackupex_info} = '' ]]
then
echo "xtrabackup install fail! please check up on xtrabackup" >> ${storage_logfile}
exit 1
fi
}
# check_innnobackupex
# 生成临时cnf文件,规避参数错误
function createcnf(){
echo "生成临时cnf文件,规避参数错误" >> ${storage_logfile}
ssh -i ~/.ssh/id_rsa root@$db_backup_ip "cat /etc/my.cnf|sed 's/.*character_set_client.*//g' > /etc/my.cnf.bakuse"
ssh -i ~/.ssh/id_rsa root@$db_backup_ip "chown mysql:mysql /etc/my.cnf.bakuse"
}
# HIGO全量备份
function higo_full_backup(){
# 生成远程配合文件
echo "date:${wf_dt} 生成远程配置文件:higo_mysql_template_wf.conf" >> ${storage_logfile}
echo "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #" > ${conf_template}
echo "# Program : MySQL 备份配置文件 #" >> ${conf_template}
echo "# Author : [email protected] #" >> ${conf_template}
echo "# Date : ${backup_date} #" >> ${conf_template}
echo "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #" >> ${conf_template}
echo "host=${db_backup_ip}" >> ${conf_template}
echo "port=${db_backup_port}" >> ${conf_template}
echo "user=${user}" >> ${conf_template}
echo "password=${password}" >> ${conf_template}
echo "backup_dir=${backup_dir}" >> ${conf_template}
echo "xtrabackup_dir=${xtrabackup_dir}" >> ${conf_template}
echo "full_backup_week_day=${full_backup_week_day}" >> ${conf_template}
echo "full_backup_prefix=${full_backup_prefix}" >> ${conf_template}
echo "increment_prefix=${increment_prefix}" >> ${conf_template}
echo "cloneslave_prefix=${cloneslave_prefix}" >> ${conf_template}
echo "mysql_conf_file=${mysql_conf_file}" >> ${conf_template}
echo "mysql_socket_file=${mysql_socket_file}" >> ${conf_template}
echo "error_log=${error_log}" >> ${conf_template}
echo "index_file=${index_file}" >> ${conf_template}
echo "log_dir=${log_dir}" >> ${conf_template}
echo "var_dir=${var_dir}" >> ${conf_template}
echo "parallel=${parallel}" >> ${conf_template}
echo "throttle=${throttle}" >> ${conf_template}
echo "dest_ip=${dest_ip}" >> ${conf_template}
echo "storage_backup=${storage_backup}" >> ${conf_template}
echo "storage_binlogs=${storage_binlog}" >> ${conf_template}
echo "innobackupex_log=${innobackupex_log}" >> ${conf_template}
echo "backup_date=${backup_date}" >> ${conf_template}
echo "backup_time=${backup_time}" >> ${conf_template}
echo "backup_week_day=${backup_week_day}" >> ${conf_template}
echo "default_error_file=${default_error_file}" >> ${conf_template}
echo "default_index_file=${default_index_file}" >> ${conf_template}
echo "mode=${mode}" >> ${conf_template}
# echo "" >> ${conf_template}
echo "远程配置文件生成成功!" >> ${storage_logfile}
echo "发送配置文件到远程备份服务器" >> ${storage_logfile}
rsync -avprP -e ssh ${conf_template} ${db_backup_ip}:${conf_dir} >> ${storage_logfile} 2>&1
echo "发送备份脚本模板到远程备份服务器" >> ${storage_logfile}
rsync -avprP -e ssh ${storage_backup_template} ${db_backup_ip}:${bin_dir} >> ${storage_logfile} 2>&1
echo "远程执行脚本进行备份" >> ${storage_logfile}
# 模板位置(10.20.5.16):/home/backup_mysql_wufei/bin/mysql_template_backup.sh
# 远程备份文件路径(默认):/data/percona-xtrabackup/backup_mysql_wufei/bin/mysql_template_backup.sh
ssh -i ~/.ssh/id_rsa root@$db_backup_ip "bash ${remote_backup_template}" >> ${storage_logfile} 2>&1
# backup_type=$?
# if [ 0 -eq "${backup_0k}" ]; then
# echo "innobackupex(${backup_date}): completed OK!" >> ${storage_logfile}
# else
# echo "innobackupex(${backup_date}): backup failure!" >> ${storage_logfile}
# fi
}
# 添加索引,索引记录了当前最新的备份,记录错误消息到文件
function append_index_error_to_file(){
cat ${default_index_file} >> ${storage_index_file}
cat ${default_error_file} >> ${storage_error_file}
}
# 在执行备份脚本前清空本地默认索引文件
function empty_index_error_to_file(){
cat /dev/null > ${default_index_file}
cat /dev/null > ${default_error_file}
}
# 备份状态监控提醒
function backup_monitor_wf(){
backup_monitor_wf_file="/home/wufei/monitor/bin/backup_monitor_wf.sh"
from_notice="email"
# 如果备份状态为failed即backup_status='failed'时马上发送邮件通知DBA
if [ ${backup_status} = 'failed' ]
then
ssh -i ~/.ssh/id_rsa root@${db_host} "bash ${backup_monitor_wf_file} -o ${from_notice}" > /dev/null 2>&1
fi
}
# 增加记录备份信息到MySQL表db_backup_info中
function db_backup_info(){
# 获取记录相关信息值
# policy_id、备份日期backup_date、端口db_backup_port、IP db_backup_ip、备份DB db、备份方式 mode、保存地址IP dest_ip
# 保存目录
dest_dir=${storage_backup}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
# 备份开始时间
backup_start_time="${backup_date} ${begintime}"
# 备份结束时间(获取当前时间)
backup_end_time=`date "+%Y-%m-%d %H:%M:%S"`
# 备份状态
if [[ ! -s ${default_error_file} && -s ${default_index_file} && -s ${innobackupex_log} ]]
then
backup_status='success'
else
backup_status='failed'
fi
sql="insert into ${db_name}.db_backup_info(policy_id,backup_date,port,ip,db,mode,dest_ip,dest_dir,begintime,endtime,backup_status) values (${policy_id},'${backup_date}',${db_backup_port},inet_aton('${db_backup_ip}'),'${db}','${mode}',inet_aton('${dest_ip}'),'${dest_dir}','${backup_start_time}','${backup_end_time}','${backup_status}');"
echo "${sql}" | mysql_conn02
sql_status=$?
if [ 0 -eq "${sql_status}" ]; then
backup_monitor_wf
fi
}
# 删除之前的备份(默认删除一周前备份)
function delete_before_backup(){
find ${storage_backup} -mindepth 1 -maxdepth 1 -type d -mtime +${remain_days} | xargs rm -rf
find ${storage_log} -type f -mtime +${remain_days} | xargs rm -f
}
# 备份binlog日志
function backup_mysqlbinlog(){
echo "MySQL binlog 远程备份"
}
function init(){
cd ${backup_wufei_path}
# 获取备份目的IP和路径等信息
getdest
db=${db}
db_backup_ip=${db_backup_ip}
db_backup_port=${db_backup_port}
mysql_socket_file=${db_backup_socket}
dest_ip=${db_dest_ip}
mode=${db_mode}
full_backup_week_day=${db_full_backup_week_day}
remain_days=${db_remain_days}
zip_type=${zip_type}
parallel=${db_parallel}
throttle=${db_throttle}
begintime=${db_begintime}
storage_logfile="${storage_log}/db_backup_${db_backup_port}_${backup_dt}.log"
echo "" > ${storage_logfile}
echo "===== init =====" >> ${storage_logfile}
echo "DateTime: `date '+%Y-%m-%d %H:%M:%S'`" >> ${storage_logfile}
storage_backup=${storage_dir}
storage_binlog=${storage_binlogs}
storage_error_file=${storage_error_file}
storage_index_file=${storage_index_file}
default_error_file=${default_error_file}
default_index_file=${default_index_file}
innobackupex_log=${innobackupex_log}
backup_dir="/data/percona-xtrabackup/backup_mysql_wufei/backup/mysql_${db}_${db_backup_port}"
mysql_conf_file="/etc/my.cnf.bakuse"
error_log="/data/percona-xtrabackup/backup_mysql_wufei/var/mysql_${db}_${db_backup_port}.err"
index_file="/data/percona-xtrabackup/backup_mysql_wufei/var/mysql_${db}_${db_backup_port}.index"
var_dir="/data/percona-xtrabackup/backup_mysql_wufei/var"
conf_dir="/data/percona-xtrabackup/backup_mysql_wufei/conf"
bin_dir="/data/percona-xtrabackup/backup_mysql_wufei/bin"
# 在执行备份脚本前清空本地默认索引文件
empty_index_error_to_file
# 检查innobackupex工具是否安装
check_innnobackupex
# 生成临时cnf文件,规避参数错误
createcnf
# HIGO全量备份
higo_full_backup
# 添加索引,索引记录了当前最新的备份,记录错误消息到文件
append_index_error_to_file
# 清除保存天数之前备份及日志文件
delete_before_backup
# 增加记录备份信息到MySQL表db_backup_info中
db_backup_info
}
function main(){
init
echo "===== ${db} backup end =====" >>${storage_logfile}
}
main
4、(备份存储机器)备份脚本模板:/home/backup_mysql_wufei/bin/mysql_template_backup.sh
#!/bin/bash
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Program : MySQL 备份脚本 #
# Version : percona xtrabackup 2.4.7 #
# Author : [email protected] #
# Description : backup base template #
# Date : 2018-06-11 #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# 读取配置文件中的所有变量,设置为全局变量
# 配置文件
localhost='127.0.0.1'
conf_file="/data/percona-xtrabackup/backup_mysql_wufei/conf/higo_mysql_template_wf.conf"
# 获取本机IP及端口
host=`sed '/^host=/!d;s/.*=//' ${conf_file}`
port=`sed '/^port=/!d;s/.*=//' ${conf_file}`
# MySQL备份用户
user=`sed '/^user=/!d;s/.*=//' ${conf_file}`
# MySQL备份用户密码
password=`sed '/^password=/!d;s/.*=//' ${conf_file}`
# MySQL备份目录
backup_dir=`sed '/^backup_dir=/!d;s/.*=//' ${conf_file}`
# percona xtrabackup备份软件路径
xtrabackup_dir=`sed '/^xtrabackup_dir=/!d;s/.*=//' ${conf_file}`
# 全备在一周的第几天
full_backup_week_day=`sed '/^full_backup_week_day=/!d;s/.*=//' ${conf_file}`
# 全量备份信息名称 前缀
full_backup_prefix=`sed '/^full_backup_prefix=/!d;s/.*=//' ${conf_file}`
# 增量备份信息名称 前缀
increment_prefix=`sed '/^increment_prefix=/!d;s/.*=//' ${conf_file}`
# 克隆从库信息名称 前缀
cloneslave_prefix=`sed '/^cloneslave_prefix=/!d;s/.*=//' ${conf_file}`
# MySQL配置文件
mysql_conf_file=`sed '/^mysql_conf_file=/!d;s/.*=//' ${conf_file}`
# MySQL socket文件
mysql_socket_file=`sed '/^mysql_socket_file=/!d;s/.*=//' ${conf_file}`
# 备份错误日志文件
error_log=`sed '/^error_log=/!d;s/.*=//' ${conf_file}`
# 备份索引文件
index_file=`sed '/^index_file=/!d;s/.*=//' ${conf_file}`
# 日志存放目录
log_dir=`sed '/^log_dir=/!d;s/.*=//' ${conf_file}`
# 备份信息存放目录
var_dir=`sed '/^var_dir=/!d;s/.*=//' ${conf_file}`
# 获取--parallel值(此参数用于开启多个子进程并发备份多个数据文件)
parallel=`sed '/^parallel=/!d;s/.*=//' ${conf_file}`
# 获取--throttle值(此参数用于限制备份过程中每秒的IO次数)
throttle=`sed '/^throttle=/!d;s/.*=//' ${conf_file}`
# 存储服务器IP
dest_ip=`sed '/^dest_ip=/!d;s/.*=//' ${conf_file}`
# 存储服务器备份保存目录
storage_backup=`sed '/^storage_backup=/!d;s/.*=//' ${conf_file}`
# 存储服务器binlog保存目录
storage_binlogs=`sed '/^storage_binlogs=/!d;s/.*=//' ${conf_file}`
# 存储服务器备份过程信息日志文件
innobackupex_log=`sed '/^innobackupex_log=/!d;s/.*=//' ${conf_file}`
# 存储备份索引默认文件
default_index_file=`sed '/^default_index_file=/!d;s/.*=//' ${conf_file}`
# 存储备份错误日志默认文件
default_error_file=`sed '/^default_error_file=/!d;s/.*=//' ${conf_file}`
# 备份模式
mode=`sed '/^mode=/!d;s/.*=//' ${conf_file}`
# 备份日期
# backup_date=`date +%F`
backup_date=`sed '/^backup_date=/!d;s/.*=//' ${conf_file}`
# backup_time=`date +%H-%M-%S`
backup_time=`sed '/^backup_time=/!d;s/.*=//' ${conf_file}`
# backup_week_day=`date +%u`
backup_week_day=`sed '/^backup_week_day=/!d;s/.*=//' ${conf_file}`
#创建相关目录
#========如果没有备份文件夹则建立之=======#
if [ ! -d "${backup_dir}" ];
then
echo "无此文件夹,建立中..."
mkdir -p ${backup_dir}
fi
#========如果没有日志文件夹则建立之=======#
if [ ! -d "${log_dir}" ];
then
echo "无此文件夹,建立中..."
mkdir -p ${log_dir}
fi
#========如果没有索引文件夹则建立之=======#
if [ ! -d "${var_dir}" ];
then
echo "无此文件夹,建立中..."
mkdir -p ${var_dir}
fi
# XXXX全量备份(5.6.16)
function higo_extra_full_backup() {
# 由于老数据库服务器磁盘容量问题,不能保证每份实例都能在本地保存一份最新备份,故在备份前删除当前所有已存在的本地备份
find ${backup_dir%/*} -mindepth 2 -maxdepth 2 -type d | xargs rm -rf
backup_folder=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
mkdir -p ${backup_dir}/${backup_folder}
${xtrabackup_dir}/bin/innobackupex \
--defaults-file=${mysql_conf_file} \
--user=${user} \
--password=${password} \
--host=${localhost} \
--port=${port} \
--parallel=${parallel} \
--throttle=${throttle} \
--defaults-group=mysqld${port} \
--slave-info \
--no-timestamp \
${backup_dir}/${backup_folder} > ${log_dir}/${backup_folder}_${port}.log 2>&1
return $?
}
# XXXX全量备份(5.7.16+)
function higo_full_backup() {
backup_folder=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
mkdir -p ${backup_dir}/${backup_folder}
${xtrabackup_dir}/bin/innobackupex \
--defaults-file=${mysql_conf_file} \
--user=${user} \
--password=${password} \
--socket=${mysql_socket_file} \
--parallel=${parallel} \
--throttle=${throttle} \
--defaults-group=mysqld${port} \
--slave-info \
--no-timestamp \
${backup_dir}/${backup_folder} > ${log_dir}/${backup_folder}_${port}.log 2>&1
return $?
}
# 全量备份(5.7.16+)
function full_backup() {
backup_folder=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
mkdir -p ${backup_dir}/${backup_folder}
${xtrabackup_dir}/bin/innobackupex \
--defaults-file=${mysql_conf_file} \
--user=${user} \
--password=${password} \
--socket=${mysql_socket_file} \
--parallel=${parallel} \
--throttle=${throttle} \
--defaults-group=mysqld${port} \
--no-timestamp \
${backup_dir}/${backup_folder} > ${log_dir}/${backup_folder}_${port}.log 2>&1
return $?
}
# 增量备份(5.7.16+)
function increment_backup() {
backup_folder=${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day}
incr_base_folder=`sed -n '$p' $index_file | \
awk -F '[, {}]*' '{print $3}' | \
awk -F ':' '{print $2}'`
mkdir -p ${backup_dir}/${backup_folder}
${xtrabackup_dir}/bin/innobackupex \
--defaults-file=${mysql_conf_file} \
--user=${user} \
--password=${password} \
--socket=${mysql_socket_file} \
--parallel=${parallel} \
--throttle=${throttle} \
--defaults-group=mysqld${port} \
--no-timestamp \
--incremental \
${backup_dir}/${backup_folder} \
--incremental-basedir=${backup_dir}/${incr_base_folder} > ${log_dir}/${backup_folder}_${port}.log 2>&1
return $?
}
# 克隆从库
function cloneslave_backup() {
backup_folder=${cloneslave_prefix}_${backup_date}_${backup_time}_${backup_week_day}
mkdir -p ${backup_dir}/${backup_folder}
${xtrabackup_dir}/bin/innobackupex \
--defaults-file=${mysql_conf_file} \
--user=${user} \
--password=${password} \
--socket=${mysql_socket_file} \
--parallel=${parallel} \
--throttle=${throttle} \
--defaults-group=mysqld${port} \
--slave-info \
--safe-slave-backup \
--no-timestamp \
${backup_dir}/${backup_folder} > ${log_dir}/${backup_folder}_${port}.log 2>&1
return $?
}
# 删除之前的备份(一般在全备完成后使用)
function delete_before_backup() {
cat ${index_file} | awk -F '[, {}]*' '{print $3}' | \
awk -v backup_dir=${backup_dir} -F ':' '{if($2!=""){printf("rm -rf %s/%s\n", backup_dir, $2)}}' | \
/bin/bash
cat ${index_file} | awk -F '[, {}]*' '{print $3}' | \
sed 's/$/_*.log/g' | \
awk -v log_dir=${log_dir} -F ':' '{if($2!=""){printf("rm -rf %s/%s\n", log_dir, $2)}}' | \
/bin/bash
}
# 备份索引文件及清除一周之前的索引文件
function backup_index_file() {
index_suffix=`date -d "1 day ago" +%F`
cp -r ${index_file} ${index_file}_${index_suffix}
find ${index_file}_* -type f -mtime +6 | xargs rm -f
}
# 发送索引文件到远程
function send_index_file_to_remote() {
rsync -avpP -e ssh ${index_file} ${dest_ip}:${default_index_file}
# echo 'send index file ok'
}
# 发送错误日志信息到远程
function send_error_file_to_remote() {
rsync -avpP -e ssh ${error_log} ${dest_ip}:${default_error_file}
# echo 'send error file ok'
}
# 添加索引,索引记录了当前最新的备份
function append_index_to_file() {
echo "{week_day:${backup_week_day}, \
dir:${1}_${backup_date}_${backup_time}_${backup_week_day}, \
type:${1}, \
date:${backup_date}}" >> ${index_file}
}
# 记录错误消息到文件
function logging_backup_err() {
echo "{week_day:${backup_week_day}, \
dir:${1}_${backup_date}_${backup_time}_${backup_week_day}, \
type:${1}, \
date:${backup_date}}" >> ${error_log}
}
# 清空索引
function purge_index_from_file() {
> ${index_file}
}
# 清空错误日志信息
function purge_err_log() {
> ${error_log}
}
# 打包备份
function tar_backup_file() {
# echo "tar $1 ok"
tar -jcvf ${backup_dir}/${1}_${backup_date}_${backup_time}_${backup_week_day}.tar.bz2 ${backup_dir}/${1}_${backup_date}_${backup_time}_${backup_week_day}
}
# 发送备份到远程
function send_backup_to_remote() {
# echo "send $1 remote ok"
rsync -avprP -e ssh ${backup_dir}/${1}_${backup_date}_${backup_time}_${backup_week_day} ${dest_ip}:${storage_backup}
rsync -avprP -e ssh ${log_dir}/${1}_${backup_date}_${backup_time}_${backup_week_day}_${port}.log ${dest_ip}:${innobackupex_log}
}
# 判断选择那种备份策略
# incr:0 clone:1 full:2
function get_backup_strategy() {
if [[ ${mode} = 'incr' ]]; then
backup_strategy=0
elif [[ ${mode} = 'clone' ]]; then
backup_strategy=1
else
backup_strategy=2
fi
return ${backup_strategy}
}
# 增量备份判断是应该全备还是增量备份
# 0:full 1:incr
function get_backup_type() {
full_backup_week_day=`sed '/^full_backup_week_day=/!d;s/.*=//' ${conf_file}`
backup_type=0
if [ "${full_backup_week_day}" -eq `date +%u` ]; then
backup_type=0
else
backup_type=1
fi
if [ ! -n "`cat $index_file`" ]; then
backup_type=0
fi
return ${backup_type}
}
# 判断MySQL版本,然后根据MySQL版本再选择合适的配方策略
# mysql5.6:0 mysql5.7:1
function get_mysql_version() {
mysql_version=`mysql --help | grep Distrib | awk '{print $5}' | sed 's/,//'`
if [[ ${mysql_version} = '5.6.16' ]];then
backup_mysql=0
else
backup_mysql=1
fi
return ${backup_mysql}
}
# 测试配置文件的正确性
function test_conf_file() {
# 判断每个变量是否在配置文件中有配置,没有则退出程序
if [ ! -n "$host" ]; then echo 'fail: configure file host not set'; exit 2; fi
if [ ! -n "$port" ]; then echo 'fail: configure file port not set'; exit 2; fi
if [ ! -n "$user" ]; then echo 'fail: configure file user not set'; exit 2; fi
if [ ! -n "$password" ]; then echo 'fail: configure file password not set'; exit 2; fi
if [ ! -n "$backup_dir" ]; then echo 'fail: configure file backup_dir not set'; exit 2; fi
if [ ! -n "$xtrabackup_dir" ]; then echo 'fail: configure file xtrabackup_dir not set'; exit 2; fi
if [ ! -n "$full_backup_week_day" ]; then echo 'fail: configure file full_backup_week_day not set'; exit 2; fi
if [ ! -n "$full_backup_prefix" ]; then echo 'fail: configure file full_backup_prefix not set'; exit 2; fi
if [ ! -n "$increment_prefix" ]; then echo 'fail: configure file increment_prefix not set'; exit 2; fi
if [ ! -n "$cloneslave_prefix" ]; then echo 'fail: configure file cloneslave_prefix not set'; exit 2; fi
if [ ! -n "$mysql_conf_file" ]; then echo 'fail: configure file mysql_conf_file not set'; exit 2; fi
if [ ! -n "$mysql_socket_file" ]; then echo 'fail: configure file mysql_socket_file not set'; exit 2; fi
if [ ! -n "$error_log" ]; then echo 'fail: configure file error_log not set'; exit 2; fi
if [ ! -n "$index_file" ]; then echo 'fail: configure file index_file not set'; exit 2; fi
if [ ! -n "$log_dir" ]; then echo 'fail: configure file log_dir not set'; exit 2; fi
if [ ! -n "$var_dir" ]; then echo 'fail: configure file var_dir not set'; exit 2; fi
if [ ! -n "$parallel" ]; then echo 'fail: configure file parallel not set'; exit 2; fi
if [ ! -n "$throttle" ]; then echo 'fail: configure file throttle not set'; exit 2; fi
if [ ! -n "$dest_ip" ]; then echo 'fail: configure file dest_ip not set'; exit 2; fi
if [ ! -n "$storage_backup" ]; then echo 'fail: configure file storage_backup not set'; exit 2; fi
if [ ! -n "$storage_binlogs" ]; then echo 'fail: configure file storage_binlogs not set'; exit 2; fi
if [ ! -n "$innobackupex_log" ]; then echo 'fail: configure file innobackupex_log not set'; exit 2; fi
if [ ! -n "$backup_date" ]; then echo 'fail: configure file backup_date not set'; exit 2; fi
if [ ! -n "$backup_time" ]; then echo 'fail: configure file backup_time not set'; exit 2; fi
if [ ! -n "$backup_week_day" ]; then echo 'fail: configure file backup_week_day not set'; exit 2; fi
if [ ! -n "$default_error_file" ]; then echo 'fail: configure file default_error_file not set'; exit 2; fi
if [ ! -n "$default_index_file" ]; then echo 'fail: configure file default_index_file not set'; exit 2; fi
if [ ! -n "$mode" ]; then echo 'fail: configure file mode not set'; exit 2; fi
}
# 执行
function incr_run() {
# 检测配置文件值
test_conf_file
# 判断执行全量备份还是增量备份
get_backup_type
backup_type=$?
case ${backup_type} in
0 )
# 全量备份
full_backup
backup_0k=$?
if [ 0 -eq "${backup_0k}" ]; then
# 全备成功
# # 打包最新备份
# tar_backup_file ${full_backup_prefix}
# # 将tar备份发送到远程
# send_backup_to_remote ${full_backup_prefix}
# 发送备份到远程
send_backup_to_remote ${full_backup_prefix}
# 备份索引文件
backup_index_file
# # 发送索引文件到远程
# send_index_file_to_remote
# 清除之前备份
delete_before_backup
# 清除索引文件
purge_index_from_file
# 添加索引,索引记录了当前最新的备份
append_index_to_file ${full_backup_prefix}
# 发送索引文件到远程
send_index_file_to_remote
else
# 全备失败
# 删除备份目录
rm -rf ${backup_dir}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
# 记录错误日志
logging_backup_err ${full_backup_prefix}
# 发送错误日志信息到远程
send_error_file_to_remote
fi
;;
1 )
# 增量备份
increment_backup
backup_ok=$?
if [ 0 -eq "${backup_ok}" ]; then
# 增量备份成功
# 打包最新备份
# # tar_backup_file ${increment_prefix}
# # 将tar备份发送到远程
# send_backup_to_remote ${increment_prefix}
# 发送备份到远程
send_backup_to_remote ${increment_prefix}
# 添加索引, 索引记录了当前最新的备份
append_index_to_file ${increment_prefix}
# 发送索引文件到远程
send_index_file_to_remote
else
# 增量备份失败
# 删除备份目录
rm -rf ${backup_dir}/${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day}
# 记录错误日志
logging_backup_err ${increment_prefix}
# 发送错误日志信息到远程
send_error_file_to_remote
fi
;;
esac
}
function clone_run() {
# 检测配置文件值
test_conf_file
# 克隆从库
cloneslave_backup
backup_0k=$?
if [ 0 -eq "${backup_0k}" ]; then
# 克隆备份成功
# # 打包最新备份
# tar_backup_file ${cloneslave_prefix}
# 发送备份到远程
send_backup_to_remote ${cloneslave_prefix}
# 备份索引文件
backup_index_file
# 清除之前备份
delete_before_backup
# 清除索引文件
purge_index_from_file
# 添加索引,索引记录了当前最新的备份
append_index_to_file ${cloneslave_prefix}
# 发送索引文件到远程
send_index_file_to_remote
else
# 全备失败
# 删除备份目录
rm -rf ${backup_dir}/${cloneslave_prefix}_${backup_date}_${backup_time}_${backup_week_day}
# 记录错误日志
logging_backup_err ${cloneslave_prefix}
# 发送错误日志信息到远程
send_error_file_to_remote
fi
}
function full_run() {
# 检测配置文件值
test_conf_file
# 判断MySQL版本,然后选择合适的备份方案
get_mysql_version
case ${backup_mysql} in
0)
# HIGO全量备份(5.6.16)
higo_extra_full_backup
;;
1)
# HIGO全量备份(5.7.16+)
higo_full_backup
;;
esac
# XXXX全量备份
# higo_full_backup
backup_0k=$?
if [ 0 -eq "${backup_0k}" ]; then
# 全备成功
# # 打包最新备份
# tar_backup_file ${full_backup_prefix}
# 发送备份到远程
send_backup_to_remote ${full_backup_prefix}
# 备份索引文件
backup_index_file
# 清除之前备份
delete_before_backup
# 清除索引文件
purge_index_from_file
# 添加索引,索引记录了当前最新的备份
append_index_to_file ${full_backup_prefix}
# 发送索引文件到远程
send_index_file_to_remote
else
# 全备失败
# 删除备份目录
rm -rf ${backup_dir}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
# 记录错误日志
logging_backup_err ${full_backup_prefix}
# 发送错误日志信息到远程
send_error_file_to_remote
fi
}
function main() {
# 判断执行那种备份策略
get_backup_strategy
case ${backup_strategy} in
0)
# 执行增量备份
incr_run
;;
1)
# 执行克隆备份
clone_run
;;
2)
# 仅全备
full_run
;;
esac
}
main