惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
Engineering at Meta
Engineering at Meta
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
量子位
Jina AI
Jina AI
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
L
LangChain Blog
A
About on SuperTechFans
人人都是产品经理
人人都是产品经理
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
美团技术团队
博客园 - 三生石上(FineUI控件)
N
Netflix TechBlog - Medium
D
DataBreaches.Net
P
Proofpoint News Feed
小众软件
小众软件
Vercel News
Vercel News
T
The Blog of Author Tim Ferriss
WordPress大学
WordPress大学
雷峰网
雷峰网
G
Google Developers Blog

膨胀自留地

使用CloudFlare标记管理功能优雅的使用谷歌分析 四天轻松版北京旅游攻略 Adsense税务居住地证明申请教程:如何申请中国税收居民身份证明以及Google Adsense更新新加坡税务信息教程 常见的 VPS 优化措施 HTML实现table表格移动端自动转为卡片样式 个人网站接入 Google 登录 如何从 GitHub 永久删除泄露的 .env 文件 Cloudflare设置www的域名跳转到不带www的域名 顶级iOS神器!全面解开App Store限制,AssPP Pro保姆级教程 BroadcastChannel将你的 Telegram Channel 转为微博客 Medama开源轻量级网站统计(分析)系统 白嫖一个网站监控面板:uptime-kuma 部署TraffMonetizer利用闲置VPS挂机赚钱 Counterscale-使用CloudflareWorkers部署的免费网站数据统计工具,界面类似umami 封装一个最简单的Axios,避免过度封装! 如何使用Cloudflare Email Routing创建域名邮箱免费发送邮件 使用Cron定时更新Hosts解决Gihub无法访问问题 JetBrains全家桶许可证服务器怎么找,JetBrains激活教程 图片加速接口:缓存图片,加速访问,解决防盗链 MySQL模糊查询再也不用like+%了,全文索引介绍及使用简介 为什么这么多人推荐你办理流量卡?流量卡怎么赚钱?怎么避坑? 借助Cloudflare Worker实现Google Analytics反代加速,规避广告屏蔽插件的拦截 etcd入门之在Centos上安装部署 Grafana在linux下安装和基本使用入门 Prometheus介绍、安装和基本功能快速入门 无需加速器,油猴插件解锁xbox云游戏 阿里云盘自动每日签到,无需部署,无需服务器 自定义VSCode终端主题样式 一行 CSS 代码实现响应式布局 – 使用 Grid 实现的响应式布局 加不加「/」?Nginx location 路径与 proxy_pass 的规律
容器化MariaDB/Mysql实现定时备份
2024-04-21 · via 膨胀自留地

#编程技术 2024-04-21 10:10:00 | 全文 764 字,阅读约需 2 分钟 | 加载中... 次浏览

👋 相关阅读


前段时间购买了绿云的 VPS,刚用了一个月就遇到主机上问题,导致数据全部丢失,幸好上边没有放什么重要的东西,但是也提醒了自己备份的重要性

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

备份方案

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

编写备份脚本

新建一个备份目录,比如 backupdata

在 backupdata 目录下,创建一个 backup_script.sh 文件,内容如下:

#!/bin/bash

# 获取环境变量(-后边的内容为未获取到对应变量时的默认值)
MYSQL_HOST=${MYSQL_HOST:-"192.168.0.200"}
MYSQL_PORT=${MYSQL_PORT:-"3306"}
MYSQL_USER=${MYSQL_USER:-"demo"}
MYSQL_PASSWORD=${MYSQL_PASSWORD:-"demo"}
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 has been created at $BACKUP_FILENAME"

构建容器镜像

在 backupdata 目录下,创建一个 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

# 设置环境变量(替换为你的docker中数据库的信息)
ENV MYSQL_HOST="192.168.0.200"
ENV MYSQL_PORT="3306"
ENV MYSQL_USER="demo"
ENV MYSQL_PASSWORD="demo"
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"]

构建容器&启动容器

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

# 构建容器
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

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

设置 Cron 定时任务

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

crontab -e

# 在后面添加一行:

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

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

VIA

容器化MariaDB/Mysql定时备份实现 - 珂泽小站 https://www.kezez.com/archives/278.html


×