xtrabackup是MySQL的一种物理备份工具,相对于mysqldump,备份和还原速度更快 , 我写了一份可以进行备份 + 还原的脚本

#!bin/bash
all_bak_path="/opt/my_bak/xbak" # 主备目录
add_bak_path="/opt/my_bak/add" # 增量备份目录
mysql_data_path="/data/mysql/data" # 数据库数据路径
mysql_name="mysqld" # 数据库名称
mysql_cnf="/etc/my.cnf" # MySQL 配置文件
userName="root" # 数据库用户名称
userPasswd="root" # 数据库用户密码
# 获取mysql.sock文件路径
# sock_path=$(find / -name mysql.sock) # 第一次获取时使用
sock_path="/usr/local/mysql/mysql.sock"
mysql_port="3306"
innobackupex_options="
--defaults-file=${mysql_cnf} \
--socket=${sock_path} \
--user=${userName} --password=${userPasswd} \
--port=${mysql_port}" # 0.创建全量备份和增来那个备份路径
create_path(){
if [ ! -d ${all_bak_path} ] ; then
mkdir -p ${all_bak_path}
echo "创建/opt/my_bak/xbak/目录完成"
fi if [ ! -d ${add_bak_path} ] ; then
mkdir -p ${add_bak_path}
echo "创建/opt/my_bak/add/目录完成"
fi
} # 1.安装xtrabackup
ins_xtra(){
ins_app="libev-4.03-3.el6.x86_64.rpm percona-xtrabackup-24-2.4.29-1.el7.x86_64.rpm"
yum -y install $ins_app
if [ $? -ne 0 ]; then
echo "安装xtrabackup失败"
exit 1
fi
echo "安装xtrabackup完成" data_dir=$(cat ${mysql_cnf} | grep datadir)
if [ -z "$data_dir" ]; then
cat >> ${mysql_cnf} <<EOF
datadir=${mysql_data_path}/ # 选择备份的数据库目录
EOF
systemctl restart ${mysql_name}
if [ $? -ne 0 ]; then
echo "重启mysql失败"
exit 1
fi
echo -e "修改${mysql_cnf}文件完成"
fi
} # 2.对数据库进行全量备份
all_backup(){
innobackupex ${innobackupex_options} ${all_bak_path}
} # 3.对数据进行增量备份
add_backup(){ # 检测是否有全量备份
if [ -z "$(find $all_bak_path -maxdepth 1 -type d)" ]; then
echo "没有全量备份,需先全量备份"
exit 1
fi # 执行增量备份部分语句
add_half="innobackupex ${innobackupex_options} \
--incremental "${add_bak_path}" "
#最新的全量备份
new_all_backup_path=$(find ${all_bak_path}/*_* -maxdepth 0 -type d | sort -r | head -1) #没有更新的话,上一次目录路径选择全量目录
if [ -z "$(find $add_bak_path -mindepth 1 -maxdepth 1)" ]; then
$add_half --incremental-basedir="${new_all_backup_path}"
echo "增量执行完成,在全量备份后备份"
else
# 获取所有增量备份
new_add_backup_path=($(find ${add_bak_path}/*_* -maxdepth 0 -type d | sort | cut -d ":" -f 1))
# 获取全量备份文件名
tmp_all_path=$(echo $new_all_backup_path | cut -d "/" -f 5)
# 将文件名格式化为数字格式
all_time=$(echo "${tmp_all_path//[-_]}/" | cut -d "/" -f 1)
# 获取增量备份数量
add_length=${#new_add_backup_path[@]} # 获取全量备份以后得增量备份
for i in ${new_add_backup_path[@]} ; do # 遍历
tmp_add_path=$(echo $i | cut -d "/" -f 5) # 获取文件名
add_time=$(echo "${tmp_add_path//[-_]}/" | cut -d "/" -f 1) # 将文件名格式化为数字格式
if [ $all_time -le $add_time ] ; then # 判断增量备份名称是否相对于全量备份日期更新
$add_half --incremental-basedir="${new_add_backup_path[add_length-1]}"
echo -e "增量执行完成,在上一次增量备份后备份,上一次备份位置${new_add_backup_path[add_length-1]}"
break
else
$add_half --incremental-basedir="${new_all_backup_path}"
echo "增量执行完成,在全量备份后备份"
break
fi
done
fi
} # 4.对全量备份进行合并
merge_backup(){
#最新的全量备份
new_all_backup_path=$(find ${all_bak_path}/*_* -maxdepth 0 -type d | sort -r | head -1)
# 倒序获取所有增量备份
new_add_backup_path=($(find ${add_bak_path}/*_* -maxdepth 0 -type d | sort | cut -d ":" -f 1))
# 获取全量备份文件名
tmp_all_path=$(echo $new_all_backup_path | cut -d "/" -f 5)
# 将文件名格式化为数字格式
all_time=$(echo "${tmp_all_path//[-_]}/" | cut -d "/" -f 1)
# 获取增量备份数量
add_length=${#new_add_backup_path[@]}
# 执行合并部分语句
apply_half="innobackupex --apply-log" echo "准备全量备份"
${apply_half} --redo-only $new_all_backup_path
if [ $? -eq 0 ] ; then
echo -e "准备全量备份完成,位置为${new_all_backup_path}"
else
echo "准备全量备份报错,位置为${new_all_backup_path}"
exit 1
fi # 将增量备份脚本从后向前进行合并
if [ -n $new_add_backup_path ] ; then
# 获取全量备份以后得增量备份
for i in ${new_add_backup_path[@]} ; do # 遍历
tmp_add_path=$(echo $i | cut -d "/" -f 5) # 获取文件名
add_time=$(echo "${tmp_add_path//[-_]}/" | cut -d "/" -f 1) # 将文件名格式化为数字格式
if [ $all_time -le $add_time ] ; then # 判断增量备份名称是否相对于全量备份日期更新
if [ $i == ${new_add_backup_path[add_length - 1]} ] ; then
$apply_half $new_all_backup_path --incremental-dir=${new_add_backup_path[add_length - 1]}
if [ $? -eq 0 ] ; then
echo -e "最后一次合并完成,位置为${i}"
else
echo "最后一次合并报错,位置为${i}"
exit 1
fi
else
$apply_half --redo-only $new_all_backup_path --incremental-dir=$i
if [ $? -eq 0 ] ; then
echo -e "增量合并至全量完成,位置为${i}"
else
echo "增量合并至全量报错,位置为${i}"
echo -e "语句为: $apply_half --redo-only $new_all_backup_path --incremental-dir=${i}"
exit 1
fi
fi
fi
done
else
echo "没有增量备份"
fi echo "最后一次准备全量备份"
${apply_half} $new_all_backup_path
if [ $? -eq 0 ] ; then
echo -e "准备全量备份完成,位置为${new_all_backup_path}"
else
echo "准备全量备份报错,位置为${new_all_backup_path}"
exit 1
fi
} # 5.对数据库进行还原
db_restore(){
#最新的全量备份
new_all_backup_path=$(find ${all_bak_path}/*_* -maxdepth 0 -type d | sort -r | head -1) innobackupex --copy-back ${new_all_backup_path}
echo "还原数据完成" chown -R mysql.mysql ${mysql_data_path}
echo "修改mysql数据库权限完成" systemctl restart ${mysql_name}
echo "重启数据库完成" echo "数据库连接测试: "
mysql -u${userName} -p${userPasswd} -e "show databases"
mysql -u${userName} -p${userPasswd} -e "select * from test.testlog"
} options=("全量备份" "增量备份" "还原数据" "安装xtrabackup" "点击任意键退出")
create_path
select i in ${options[@]} ;do
case $i in
${options[0]})
all_backup
;;
${options[1]})
add_backup
;;
${options[2]})
merge_backup
db_restore
;;
${options[3]})
ins_xtra
;;
*)
echo "退出"
break 2
;;
esac
done ``

xtrabackup脚本的更多相关文章

  1. 「转」xtrabackup新版详细说明

    声明:本文由我的同事@fiona514编写,是我看过的最用心的中文说明介绍,强烈推荐大家学习使用. Percona Xtrabackup 2.4.1 编译及软件依赖 centos5,6 需要升级cma ...

  2. XtraBackup 原理与安装

    简介 XtraBackup(PXB) 工具是 Percona 公司用 perl 语言开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle).Percona Server ...

  3. mysql和mariadb备份工具xtrabackup和mariabackup(mariadb上版本必须用这个)

    简介 xtraBackup(PXB) 工具是 Percona 公司用 perl 语言开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle).Percona Server ...

  4. mysql 开发进阶篇系列 44 物理备份与恢复( 热备份xtrabackup 工具介绍)

    一.概述 物理备份和恢复又分为冷备份和热备份.与逻辑备份相比,它最大优点是备份和恢复的速度更快.因为物理备份的原理都是基于文件的cp. 1.1 冷备份 冷备份就是停掉数据库服务.这种物理备份一般很少使 ...

  5. Xtrabackup的安装与使用

    Xtrabackup的安装与使用 1. XtraBackup 简介 XtraBackup(PXB) 工具是 Percona 公司用 perl 语言开发的一个用于 MySQL 数据库物理热备的备份工具, ...

  6. MySQL数据库之xtrabackup物理备份(一)

    前言:说到数据库备份,我们知道可以用来对数据库进行备份的工具有mysqldump.mydumer.mysqlpump等等,实际工作中,机器上的数据库不大的话,都是用mysqldump工具来备份,这些备 ...

  7. MySQL 使用XtraBackup的shell脚本介绍

    mysql_backup.sh是关于MySQL的一个使用XtraBackup做备份的shell脚本,实现了简单的完整备份和增量备份.以及邮件发送备份信息等功能.功能目前还比较简单,后续将继续完善和增加 ...

  8. centos shell编程6一些工作中实践脚本 nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志 直接送给bc做计算 gzip innobackupex/Xtrabackup 第四十节课

    centos   shell编程6一些工作中实践脚本   nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志  直接送给bc做计算  gzip  innobacku ...

  9. Xtrabackup每周增量备份脚本程序

    Xtrabackup每周增量备份脚本程序(含附件)   程序描述 本程序是一个对percona xtrabackup使用的脚本,它完成了MySQL每周的备份. 程序结构 此程序包含了4个目录(bin. ...

  10. MySQL XtraBackup自动恢复脚本

      #!/bin/sh ################## #author:rrhelei@126.com# ################## #xtrabackup2.1.8 # 使用方法: ...

随机推荐

  1. C++ : 如何用C语言实现C++的虚函数机制?

    前言 在 googletest的源码中,看到gtest-matchers.h 中实现的MatcherBase 类自定义了一个 VTable,这种设计实现了一种类似于C++虚函数的机制.C++中的虚函数 ...

  2. JS 希尔排序完全理解

    希尔排序的思想直白点来说就是间隔对比,比如说 我有一个数组,长度为9,则第一次分割间隔为长度的1/3 + 1,则第一次对比就是1 比 4,2 比 5, 3 比 6,4 比 7,5 比 8 , 6 比 ...

  3. C# Dynamic 转换成 Dictionary,Dynamic 转换成 DataTable

    部分软件开发的时候用到了 dynamic 类型,这个类型的数据不需要做其他处理的时候非常好用,但是需要对其中的数据调整的时候就不是那么好用了,这里提供两个常见的转换方式 Dynamic To Dict ...

  4. Figma 学习笔记 – Plugin

    安装 Figma 安装 plugin 基本上就是点击一下开启而已. 到社区搜索 -> 点击 install Material Icon 下载地址 它的交互不是 drag 出来哦, 而是点击 ic ...

  5. 蓝桥杯-全球变暖 (DFS)

    你有一张某海域NxN像素的照片,"."表示海洋."#"表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. .. ...

  6. mysql 批量有则修改,无则新增

    需要为表添加唯一索引 alter table tb_*** add unique index(aa,bb); -- 此条为联合唯一索引INSERT INTO<include refid=&quo ...

  7. Flutter 2.5 更新详解

    Flutter 2.5 正式版已于上周正式发布!这是一次重要的版本更新,也是 Flutter 发布历史上各项统计数据排名第二的版本.我们关闭了 4600 个 Issue,合并了 3932 个 PR,它 ...

  8. React的useId,现在Vue3.5终于也有了!

    前言 React在很早之前的版本中加了useId,用于生成唯一ID.在Vue3.5版本中,终于也有了期待已久的useId.这篇文章来带你搞清楚useId有哪些应用场景,以及他是如何实现的. 关注公众号 ...

  9. golang的类型转换

    今天我们来说说一个大家每天都在做但很少深入思考的操作--类型转换. 本文索引 一行奇怪的代码 go的类型转换 数值类型之间互相转换 unsafe相关的转换 字符串到byte和rune切片的转换 sli ...

  10. USB协议基础篇

    初次接触USB的同学,可能会被里面各种名词给搞晕,下面就来梳理一下这些知识,希望能帮助大家理解USB. 一,从最常见的名词说起 1.1 什么是USB 这个我就不多解释了,直译就是通用串行总线.再不明白 ...