mysql 镜像备份_手动构建percona-xtrabackup Docker镜像,并实现mysql数据备份

本文介绍了如何手动构建一个基于Percona-Xtrabackup的Docker镜像,用于实现MySQL数据的自动化备份。通过Docker容器化,简化了在多台MySQL服务器上的备份工作流程。提供了全量和增量备份的脚本,以及详细的Dockerfile,以便用户可以拉取预封装的镜像或自行构建。备份规则包括每周三和周六进行全量备份,其余时间做增量备份,并保留最近10天的备份数据。
摘要由CSDN通过智能技术生成

由于最近项目比较多,并且都需要自己部署运维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了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mysql建立镜像数据库- - Tag: mysql建立镜像数据库 环境介绍:主库 192.168.0.205 从库 192.168.0.206 mysql版本:4.1.13a 1、主库创建/etc/my.cnf,修改[mysqld]里边的键值增加 server-id=1 log-bin=binlog_name 2、主库增加用户,用于从库读取主库日志。 grant replication slave,reload,super on *.* to 'slave'@'192.168.0.206' identified by '123456' 3、从库连接主库进行测试。 /opt/mysql/bin/mysql -u slave -p -h 192.168.0.205 4、停从库,修改从库/etc/my.cnf,增加选项: [mysqld] server-id=2 master-host=192.168.0.205 master-user=slave master-password=123456 5、启动从库,可以进行主从库数据同步 /opt/mysql/share/mysql/mysql start /opt/mysql/bin/mysql -u root -p mysql>load data from master; 说明:这一步不这么做也可以,用数据库倒入或者直接目录考过来也行。 6、进行测试: 主库创建表, mysql>create database sampdb; mysql>create table new (name char(20),phone char(20)); mysql>insert into new ('lhj','60549391'); 打开从库,察看: /opt/mysql/bin/mysql -u root -p mysql>show database; mysql sampdb test mysql>use sampdb; mysql>show tables; new 说明主从数据库创建成功。 7、主从数据库相关命令: slave stop; slave start ; 开始停止从数据库。 show slave status\G; 显示从库正读取哪一个主数据库二进制日志 purge master logs to 'binlog.000004';C此命令非常小心,删除主数据库没用的二进制日志文件。如果误删除,那么从库就没有办法自动更新了。 change master; 从服务器上修改参数使用。 如果数据库表是myisam类型,并且权限够 grant replication slave,reload,super on *.* to 'slave_user'@'host' identified by 'slave_pass' 也可以用load data from master命令,建立从数据库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值