51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

容器化MariaDB/Mysql定时备份实现

自从本站更换了服务器后,一直没有给数据库做定时的备份,目前服务器采用的是全部Docker容器化的方式,本站以及数据库都是运行在单独的docker容器中,为了以防万一,觉得还是需要做一次定时的全量备份比较好

备份方案

目前想到的方案是采取mysqldump工具进行备份的方式,所以需要构建一个单独的容器,在容器这个容器中使用mysqldump命令连接另一个容器的mariadb进行备份

构建容器镜像

在服务器的某个目录下,创建一个Dockerfile文件:

                          
                            # 使用包含mysql-client和bash的基础镜像
FROM alpine:latest

替换为阿里云的Alpine镜像源(如果需要)
======================



RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories


更新包索引并安装mysqldump与bash
======================



RUN apk update \&\& apk add --no-cache mysql-client bash coreutils


设置环境变量
======



ENV MYSQL_HOST="192.168.0.200"
ENV MYSQL_PORT="3306"
ENV MYSQL_USER="root"
ENV MYSQL_PASSWORD="123456"
ENV MYSQL_DATABASE="dbname"
ENV BACKUP_DIR="/backup"


将备份脚本复制到容器内
===========



COPY backup_script.sh /usr/local/bin/backup_script.sh
RUN chmod +x /usr/local/bin/backup_script.sh


在容器启动时执行备份脚本
============



CMD \["/usr/local/bin/backup_script.sh"\]


                          </code>
                        </pre>



 
这个时候第一步准备好了

 
编写备份脚本
------


 
在Dockerfile的同目录下,创建一个backup_script文件

 
````lang-bash
                          
                            #!/bin/bash

获取环境变量
======



MYSQL_HOST=${MYSQL_HOST:-"192.168.0.200"}
MYSQL_PORT=${MYSQL_PORT:-"3306"}
MYSQL_USER=${MYSQL_USER:-"root"}
MYSQL_PASSWORD=${MYSQL_PASSWORD:-"123456"}
MYSQL_DATABASE="dbname"
BACKUP_DIR="${BACKUP_DIR:-"/backup"}"


创建备份目录(如果不存在)
=============



mkdir -p "$BACKUP_DIR"


设置备份文件名称(包含时间戳)
===============



BACKUP_FILENAME="$BACKUP_DIR/blog_$(date +'%Y%m%d%H%M%S').sql.gz"


执行mysqldump命令并压缩备份文件
====================



mysqldump -h $MYSQL_HOST -P $MYSQL_PORT -u$MYSQL_USER -p$MYSQL_PASSWORD --single-transaction $MYSQL_DATABASE \| gzip \> $BACKUP_FILENAME


echo "Database backup of blog has been created at $BACKUP_FILENAME"


                          </code>
                        </pre>



 
这个时候备份的脚本也准备好了

 
构建容器\&启动容器
----------


 
容器内部的备份目录为/backup ,所以我这里将宿主机的/data/backup 映射到容器的/backup目录,当备份完成后宿主机的/data/backup就会存在备份的文件

 
```lang-bash
                          
                            # 构建容器
docker build -t db-backup-image .
# 启动容器
docker run -d \
  --env MYSQL_HOST=192.168.0.200 \
  --env MYSQL_PORT=3306 \
  -v /data/backup:/backup \
  db-backup-image
                          
                        

```


 
run之后,执行完成容器会自动退出,此时可以查看备份目录下是否存在备份的数据库文件

 
Cron 定时任务
---------


 
通过docker ps -a 命令,我们可以拿到构建容器的容器id,通过执行 docker start 容器id命令就可以直接执行备份

 
                              
                                crontab -e
                              
                            



 
在后面添加一行:

 
```lang-BASH
                          
                            0 1 * * * docker restart xxx(替换为你的容器ID)
                          
                        

```


 
保存后,将会在每天的凌晨一点执行备份


````

赞(1)
未经允许不得转载:工具盒子 » 容器化MariaDB/Mysql定时备份实现