mysql 镜像备份_手动构建percona-xtrabackup Docker镜像,并实现mysql数据备份
由于最近项目比较多,并且都需要自己部署运维Mysql,为了保证mysql数据的安全,那么数据备份就必不可少了。之前做mysql数据备份的时候,都是使用的xtrabackup,所以这次也不例外,由于需要备份的mysql服务器较多,每台都安装一遍xtrabackup的话,重复工作量就太大了,这时候,当然就想着将xtrabackup容器化,需要使用的地方,只需要拉取一下镜像,启动一下容器,感觉一下子就简单起来了呢。
不想动手的小伙伴,可以拉取我已经封装好的镜像,该镜像仅在mysql 5.7测试,mysql 8不支持,5.6是否可用,就各位自己测试啦
docker pull f763180872/xtrabackup
docker run -d --name mysql_backup --privileged \
-e BASE_DIR=/mnt/backup \
-e OPTION="-H127.0.0.1 -P3306 -uroot -ppasswd" \
-v /var/lib/mysql/data:/var/lib/mysql \
-v /mnt:/mnt \
--restart=always \
--net=host
f763180872/xtrabackup
参数说明:
BASE_DIR: 备份文件存放目录
OPTION: mysql连接参数-H IP地址 -P 端口号 -u 用户名 -p 密码
备份规则为:每周三和周六凌晨三点全量备份,其余时间凌晨三点做增量更新,每次全量更新的时候,会把之前的全量与增量备份数据压缩后存放在BASE_DIR目录下,保留最近10天的备份数据,也就是最多三个全备数据
手动开始折腾
1. 准备需要的文件
全量,增量备份脚本基于这篇文章的脚本修改的
全量备份脚本fullbak.sh
#!/bin/bash
# docker需要判断环境变量文件是否存在
if [ -f /dockerenv ];then
source /dockerenv
env
fi
INNOBACKUPEXFULL=/usr/bin/innobackupex
TODAY=`date +%Y%m%d%H%M`
YESTERDAY=`date -d"yesterday" +%Y%m%d%H%M`
FULLBACKUPDIR=$BASE_DIR/full # 全库备份的目录
INCRBACKUPDIR=$BASE_DIR/incr # 增量备份的目录
TMPFILEDIR=$BASE_DIR/logs # 日志目录
TMPFILE="$TMPFILEDIR/innobackup_$TODAY.$$.log" # 日志文件
#############################################################################
# 打印错误信息并退出
#############################################################################
error()
{
echo "$1" 1>&2
exit 1
}
# 开始备份前检查相关的参数
if [ ! -x $INNOBACKUPEXFULL ]; then
error "$INNOBACKUPEXFULL does not exist."
fi
#if [ ! -d $BASE_DIR ]; then
# error "Backup destination folder: $BASE_DIR does not exist."
#fi
# 输出备份信息
echo "----------------------------"
echo
echo "$0: MySQL backup script"
echo "started: `date '+%Y-%m-%d %H:%M:%S'`"
echo
# 如果备份目录不存在则创建相应的全备增备目录
for i in $FULLBACKUPDIR $INCRBACKUPDIR $TMPFILEDIR; do
if [ ! -d $i ]; then
mkdir -pv $i
fi
done
# 压缩上传前一天的备份
echo "压缩前一天的备份"
cd $BASE_DIR
tar -zcf $YESTERDAY.tar.gz ./full/ ./incr/
# scp -P 8022 $YESTERDAY.tar.gz root@192.168.10.46:/data/backup/mysql/
#if [ $? = 0 ]; then
rm -rf $FULLBACKUPDIR $INCRBACKUPDIR
echo "开始全量备份"
echo "start exec $INNOBACKUPEXFULL $OPTION $FULLBACKUPDIR > $TMPFILE 2>&1"
$INNOBACKUPEXFULL $OPTION $FULLBACKUPDIR > $TMPFILE 2>&1
#else
# echo "远程备份失败"
#fi
if [ -z "`tail -1 $TMPFILE | grep 'completed OK!'`" ] ; then
echo "$INNOBACKUPEXFULL failed:"; echo
echo "---------- ERROR OUTPUT from $INNOBACKUPEXFULL ----------"
# cat $TMPFILE
# rm -f $TMPFILE
exit 1
fi
# 这里获取这次备份的目录
THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPFILE`
echo "THISBACKUP=$THISBACKUP"
#rm -f $TMPFILE
echo "Databases backed up successfully to: $THISBACKUP"
# Cleanup
echo "delete tar files of 10 days ago"
find $BASE_DIR/ -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo
echo "completed: `date '+%Y-%m-%d %H:%M:%S'`"
exit 0
增量备份脚本incrbak.sh
#!/bin/bash
# docker需要判断环境变量文件是否存在
if [ -f /dockerenv ];then
source /dockerenv
env
fi
INNOBACKUPEXFULL=/usr/bin/innobackupex
TODAY=`date +%Y%m%d%H%M`
YESTERDAY=`date -d"yesterday" +%Y%m%d%H%M`
FULLBACKUPDIR=$BASE_DIR/full # 全库备份的目录
INCRBACKUPDIR=$BASE_DIR/incr # 增量备份的目录
TMPFILEDIR=$BASE_DIR/logs # 日志目录
TMPFILE="$TMPFILEDIR/innobackup_$TODAY.$$.log" # 日志文件
#############################################################################
# 打印错误信息并退出
#############################################################################
error()
{
echo "$1" 1>&2
exit 1
}
# 开始备份前检查相关的参数
if [ ! -x $INNOBACKUPEXFULL ]; then
error "$INNOBACKUPEXFULL does not exist."
fi
#if [ ! -d $BASE_DIR ]; then
# error "Backup destination folder: $BASE_DIR does not exist."
#fi
# 输出备份信息
echo "----------------------------"
echo
echo "$0: MySQL backup script"
echo "started: `date '+%Y-%m-%d %H:%M:%S'`"
echo "exec $INNOBACKUPEXFULL $OPTION $FULLBACKUPDIR > $TMPFILE 2>&1"
echo
# 如果备份目录不存在则创建相应的全备增备目录
for i in $FULLBACKUPDIR $INCRBACKUPDIR $TMPFILEDIR; do
if [ ! -d $i ]; then
mkdir -pv $i
fi
done
# 查找最近的全备目录
LATEST_FULL=`find $FULLBACKUPDIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n"`
echo "最近的全备目录为: $LATEST_FULL"
# 如果最近的全备仍然可用执行增量备份
# 创建增量备份的目录
TMPINCRDIR=$INCRBACKUPDIR/$LATEST_FULL
mkdir -p $TMPINCRDIR
BACKTYPE="incr"
# 获取最近的增量备份目录
LATEST_INCR=`find $TMPINCRDIR -mindepth 1 -maxdepth 1 -type d | sort -nr | head -1`
echo "最近的增量备份目录为: $LATEST_INCR"
# 如果是首次增量备份,那么basedir则选择全备目录,否则选择最近一次的增量备份目录
if [ ! $LATEST_INCR ] ; then
INCRBASEDIR=$FULLBACKUPDIR/$LATEST_FULL
else
INCRBASEDIR=$LATEST_INCR
fi
echo "Running new incremental backup using $INCRBASEDIR as base."
echo "start exec $INNOBACKUPEXFULL $OPTION --incremental $TMPINCRDIR --incremental-basedir $INCRBASEDIR > $TMPFILE 2>&1"
$INNOBACKUPEXFULL $OPTION --incremental $TMPINCRDIR --incremental-basedir $INCRBASEDIR > $TMPFILE 2>&1
if [ -z "`tail -1 $TMPFILE | grep 'completed OK!'`" ] ; then
echo "$INNOBACKUPEX failed:"; echo
echo "---------- ERROR OUTPUT from $INNOBACKUPEX ----------"
exit 1
fi
# 这里获取这次备份的目录
THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPFILE`
echo "THISBACKUP=$THISBACKUP"
echo
echo "Databases backed up successfully to: $THISBACKUP"
echo
echo "incremental completed: `date '+%Y-%m-%d %H:%M:%S'`"
exit 0
镜像依赖安装脚本install.sh
使用脚本安装依赖和软件是因为直接使用RUN命令安装xtrabackup在构建镜像时会被终止,具体的自己可以手动试试
#!/bin/bash
apt update -y
dpkg -i /root/percona-xtrabackup-24_2.4.21-1.focal_amd64.deb
apt install -fy
apt install cron -y
rm -rf /root/percona-xtrabackup-24_2.4.21-1.focal_amd64.deb
apt clean
镜像启动脚本init.sh
#!/bin/bash
# 将环境变量写入到文件中,方便定时任务在执行时获取,要不定时任务获取不到Docker设置的环境变量
echo "export BASE_DIR='$BASE_DIR'" > /dockerenv
echo "export OPTION='$OPTION'" >> /dockerenv
if [ "$1" == "init" ];then
# 初始化执行环境
/etc/init.d/cron start
echo '0 3 * * 3,6 root /root/fullbak.sh > /var/log/mysql_backup.log 2>&1' >> /etc/crontab
echo '0 */2 * * 1,2,4,5,7 root /root/incrbak.sh >> /var/log/mysql_backup.log 2>&1' >> /etc/crontab
/root/fullbak.sh > /var/log/mysql_backup.log 2>&1
tail -f /dev/null
else
# 透传待执行的命令
exec "$@"
fi
Dockerfile
FROM ubuntu:20.04
USER root
ENV LANG=C.UTF-8
COPY percona-xtrabackup-24_2.4.21-1.focal_amd64.deb fullbak.sh incrbak.sh install.sh /root/
RUN sh /root/install.sh && rm -rf /root/install.sh && chmod a+x /root/*.sh
COPY init.sh /root/
RUN chmod a+x /root/*.sh
ENTRYPOINT ["/root/init.sh"]
CMD [ "init" ]
2. 构建镜像
把上面所有的文件准备好之后放在同一个目录下
执行构建命令即可
docker build -t name .
以后要使用的话,就只需要拉取一下镜像,再将镜像运行起来,也就OK了
mysql 镜像备份_手动构建percona-xtrabackup Docker镜像,并实现mysql数据备份相关推荐
- 手动build unity3d的docker镜像
手动build unity3d的docker镜像 参考资料 docker官方文档:Docker Documentation | Docker Documentation unity3d linux版的 ...
- 构建多平台Docker镜像
利用 Docker 19.03 以上版本引入的插件 buildx[4],可以很轻松地构建多平台 Docker 镜像.buildx 是 docker build ... 命令的下一代替代品,它利用 Bu ...
- 构建SpringBoot应用Docker镜像
准备工作 使用到的工具及运行环境: JDK 1.8 及以上 Gradle 4+ 或 Maven 3.2+ 开发工具 Spring Tool Suite (STS) IntelliJ IDEA 创建Sp ...
- mysql的安装备份恢复_安装使用Percona XtraBackup来备份恢复MySQL的教程
1.安装XtraBackup yum的安装方法: 自动 $ rpm -Uhv http://www.percona.com/downloads/percona-release/percona-rele ...
- SpringBoot打包docker镜像并桥接mysql(windows版)
文章目录 docker建立桥bridge SpringBoot项目配置文件调整 idea增加插件 增加Dockerfile文件 docker上管理端口的暴露 idea连接docker 构建 Docke ...
- 实验:构建第一个Docker镜像
文章目录 概述 寻找和准备镜像 寻找镜像模板 准备镜像模板 Dockerfile 打包容器并上传到仓库 把容器打包成镜像 把镜像上传到公网 参考文章和链接 概述 docker的关键作用:可靠地重现 ...
- maven项目中如何直接访问某一个页面_整一个自己的docker镜像
获取镜像的途径有两个,一是从镜像仓库获取,如官方的Docker Hub,二是自定义.上文已经介绍如何从镜像仓库获取镜像,本文基于一个Springboot项目,来介绍自定义一个镜像的基本流程. 1. 定 ...
- modules node 太大了_如何将Node.js Docker镜像大小减小10倍
对应用程序进行Docker化非常简单,有效,但是优化Docker Image的大小是棘手的部分. Docker易于使用,但是一旦应用程序开始扩展,镜像大小就会呈指数增长.通常,大多数情况下,应用程序的 ...
- linux docker查找镜像文件,搜索/下载/构建自定义/删除Docker镜像,运行和删除Docker容器的方法...
本文为你介绍的内容是Docker入门相关的操作方法:搜索Docker镜像.下载Docker镜像.运行Docker容器.构建自定义Docker镜像.删除容器.删除Docker镜像.以下给出的所有步骤均在 ...
最新文章
- oracle导出导入emp,oracle导入导出操作
- MTK Code Sync Clone
- mysql常见的错误码
- linux6.5下配置nfs,CentOS 6.5 NFS配置详细教程
- linux 建议锁和强制锁
- Response to preflight request doesn‘t pass access control check: The value of the ‘Access-Control-Al
- 新兴IT企业特斯拉(七)——充电先行
- UltraCompare比较文件时出现UTF8_ConvertorForMac无转换符号!
- 关闭WIN7休眠功能
- 前程无忧网站大数据职位信息分析可视化(源码)
- mac数字键盘错乱_苹果电脑键盘打不出数字解决办法
- 【微信小程序】本地服务页面案例实现
- 写QT串口通信的UI界面时,数据输入文本框为什么要有文本(字符串)发送和十六进制发送?
- xmanager无法连接Linux服务器,解决xmanager连接linux出错问题
- 第 1-6 课:Spring 的另一个核心机制 AOP
- 软件考试:89个系统相关的基本概念
- CH340驱动(含各平台)
- ❤️ 跟我一起用python追到女朋友!❤️
- 为python-docx插入表格提速
- 易宝支付在线支付测试注意事项:
热门文章
- 【英语学习】【Level 07】U06 First Time L2 A good food experience
- c++ 应用socket实现C/S端文件的传输
- 导出参考文献是ciw格式_参考文献排版,这几点非常重要!
- sql server 2008 每次都要use_这个方法选的都是强势股,短线操作,快进快出,不恋战,建议收藏...
- scala 高阶函数学习
- 娱乐开源commons-email-1.x包
- SCCM2012软件更新(WSUS补丁)同步成功无法获取补丁问题
- [Android]使用Dagger 2依赖注入 - DI介绍(翻译)
- oracle xe 数据库用户操作
- PostgreSQL备份之omniPITR