Xtrabackup软件安装
官网手册2.4=https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html
官方手册8.0=https://www.percona.com/doc/percona-xtrabackup/8.0/index.html
#!/bin/bash
#PS=xtrabackup软件安装:
#官网手册2.4=https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html
#官方手册8.0=https://www.percona.com/doc/percona-xtrabackup/8.0/index.html
set -u
#查看系统版本
read -p "请输入mysql账户:" Mysql_user
read -s -p "请输入mysql密码:" Mysql_passwd
Mysql_Version=`mysql -u${Mysql_user} -p${Mysql_passwd} -e 'select version();' 2>/dev/null |egrep -v 'version()' |cut -d"." -f1`
Backup_Time=`date "+%Y-%m-%d_%H:%M"`
#下载软件包
function wget_package() {
[ ! -d /var/package ] && mkdir /var/package
case ${Mysql_Version} in
8)
wget -P /var/package https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm
v=8
;;
*)
wget -P /var/package https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.24/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.24-1.el7.x86_64.rpm
v=1
;;
esac
}
#xtrabackup软件安装-RPM
function install_rpm() {
grep -Eo '/epel/|/extras/' -m2 /etc/yum.repos.d/*.repo && yum yum makecache || { echo "epel源或extras源不可用,无法安装xtrabackup软件依赖包";exit 1; }
if [ ${v} -eq 1 ];then
yum -y install /var/packagepercona-xtrabackup-24-2.4.24-1.el7.x86_64.rpm 2>/dev/null || { echo "请安装:install libev-devel";exit 1; }
else
yum -y install /var/package/percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm 2>/dev/null || { echo "请安装:install libev-devel";exit 1; }
fi
}
#xtrabackup软件安装-Repository
function install_Repository() {
#安装xtrabackup存储库
yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
#启动存储库
percona-release enable-only tools release || exit 1
#安装xtrabackup软件-默认安装最新款,如果需要更换,请自行yum list|grep percona
if [ ${Mysql_Version} -eq 5 ];then
yum -y install percona-xtrabackup-24
else
yum -y install percona-xtrabackup-80
fi
}
#基于xtrabackup软件的mysql库全备
function all_database_backup(){
[ ! -d /bakcup ] && mkdr /backup
Backup_file="base-${Backup_Time}.sql"
Backup_log="bakup-log${Backup_Time}"
touch /bakup/log/${Backup_log}
xtrabackup -u${Mysql_user} -p${Mysql_passwd} --backup --target-dir=/backup/${Backup_file} && echo "/backup/${Backup_file}" > /bakup/log/${Backup_log}
}
#基于xtrabackup软件的mysql库全备-还原
function all_prepare(){
#预准备:确认数据一致,提交完成的事务,回滚未完成的事务;
rpm -qa |grep -Ei 'xtrabackup' || echo "需安装xtrabackup软件"
read -p "请输入全备的路径:" Path
xtrabackup --prepare --target-dir=${Path} || exit 3
#确保mysql服务未启动,且主目录为空,默认为:/var/lib/mysql
ss -ntlp |grep mysqld &>/dev/null && { echo "需关闭mysql服务";exit 3; }
[ -e /var/lib/mysql ] || { echo "需清空mysql目录"; exit 3; }
#拷贝备份数据至对端,或本地直接复原
read -p "是否拷贝数据至远端服务器(y/n)" Options
case $Options in
Yes|yes|Y|y)
read -p "请输入远端服务器地址:" Target_ipaddr
read -s -p "请输入目标服务器密码" Target_Password
expect <<EOF
swpan scp -r ${Path} ${Target_ipaddr}/backup
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "${Target_Password}\n" }
}
expect "#" { send "exit\n" }
expect eof
EOF
;;
No|no|N|n)
xtrabackup --copy-back --target-dir=${Path} && chown -R mysql.mysql /var/lib/mysql
systemctl start mysqld || systemctl start mariadb
;;
esac
}
#基于基于xtrabackup软件的mysql库全备的增量备份
function cron_inc() {
#输入一次全备路径,做一次初始增量,后续周一到周六的凌晨2点做一次增量
inc=inc-${Backup_Time}.sql
[ -e ${Path} ] && read -p "请输入全备的路径:" Path
xtrabackup -u${Mysql_user} -p${Mysql_passwd} --backup --target-dir=/backup/${inc}.sql --incremental-basedir=${Path}
echo ${inc} >> /backup/inc.log
[ -f /backup/inc.log ] || exit 4
touch /backup/cron/inc_cron.sh && chmod 755 /backup/cron/inc_cron.sh
echo $PTAH > /backup/cron/inc_cron.sh
tee /backup/inc_cron.sh <<EOF
inc=`cat /backup/inc.log |tail -1`
xtrabackup -u${Mysql_user} -p${Mysql_passwd} --backup --target-dir=/backup/inc-\${Backup_Time}.sql --incremental-basedir=${inc}
echo /backup/inc-\${Backup_Time} >> /backup/inc.log
EOF
sed -r '/.*inc=.*/i\ Backup_Time=`date "+%Y-%m-%d_%H:%M"`\' /backup/cron/inc_cron.sh
tee /etc/cron.d/inc_cron <<EOF
2 * * * 1-6 root sh /backup/cron/inc_cron.sh
EOF
}
function inc_prepare(){
read -p"请输入all备份的路径" All_path
read -p"请输入第一次增量备份的路径" Inc_path_1
read -p"请输入第二次增量备份的路径" Inc_path_2
#预准备完成备份,此选项--apply-log-only 阻止回滚未完成的事务
xtrabackup --prepare --apply-log-only --target-dir=${All_path}
#合并第一次增量备份
xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=${Inc_path_1}
#合并第最后一次增量备份
xtrabackup --prepare --target-dir=/backup/base --incrementaldir=${Inc_path_2}
#还原数据
xtrabackup --copy-back --target-dir=${All_path}
#权限
chown -R mysql:mysql /var/lib/mysql
#启动mysql
systemctl start mysqld || systemctl start mariadb
}
PS3="请选择:(1-6):"
select MENU in RPM包安装 源仓库安装 完全备份 基于完全备份的还原 增量备份并生成计划任务 退出 ;do
case $REPLY in
1)
install_rpm
;;
2)
install_Repository
;;
3)
all_database_backup
;;
4)
all_prepare
;;
5)
cron_inc
;;
6)
exit 0
;;
esac
done