当前位置: 首页 > news >正文

MySQL数据库备份攻略:从Docker到本地部署

目录

  • 前言
  • 创建MySQL账号并授权
  • Docker 容器部署备份
  • 本地 部署备份
  • 定时执行备份脚本
    • 修改 crontab 时间表达式
    • 添加以下行(晚上7点43分执行)

前言

  1. Docker、本地部署的MySQL数据定时备份,定时清理
  2. 支持命令行指定数据库备份(逗号分隔),未指定时自动备份所有非系统库
  3. 按时间分目录存储压缩备份,
  4. 设置Linux定时任务执行备份

创建MySQL账号并授权

CREATE USER 'backup'@'localhost' IDENTIFIED BY '123456';GRANT SELECT, SHOW VIEW, EVENT, LOCK TABLES, RELOAD, PROCESS ON *.* TO 'backup'@'localhost';
FLUSH PRIVILEGES;

Docker 容器部署备份

MySQL容器名:mysql

docker_mysql_backup.sh

#!/bin/bash# ---------------------------- 配置区 ----------------------------
BACKUP_ROOT="/data/mysql_backup"      # 备份根目录
MYSQL_CONTAINER="mysql"               # Docker容器名称
MYSQL_USER="backup"                   # MySQL备份账号
MYSQL_PASS="123456"     		  		# 密码建议从密钥管理服务获取
RETENTION_DAYS=7                      # 备份保留天数
LOG_FILE="/var/log/mysql_backup.log"  # 日志文件路径
EXCLUDE_DBS="information_schema,performance_schema,mysql,sys" # 排除的系统库
# ----------------------------------------------------------------# ---------------------------- 初始化 ----------------------------
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_DIR="${BACKUP_ROOT}/${TIMESTAMP}"
mkdir -p "$BACKUP_DIR"
touch "$LOG_FILE"# 日志记录函数
log() {echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}log "===== 备份开始 [${TIMESTAMP}] ====="# ---------------------------- 参数处理 ----------------------------
if [ -n "$1" ]; then# 处理用户输入的数据库列表(兼容逗号/空格分隔)USER_DBS=$(echo "$1" | tr ',' ' ')log "已指定数据库: ${USER_DBS}"# 验证数据库是否存在ALL_DBS=$(docker exec "$MYSQL_CONTAINER" \sh -c "export MYSQL_PWD='${MYSQL_PASS}'; \mysql -u ${MYSQL_USER} -N -e 'SHOW DATABASES;'")DATABASES=""for DB in $USER_DBS; doif echo "$ALL_DBS" | grep -qw "$DB"; thenDATABASES="$DATABASES $DB"elselog "警告:数据库 ${DB} 不存在,已跳过"fidoneif [ -z "$DATABASES" ]; thenlog "错误:没有有效的可备份数据库"exit 1fi
else# 获取所有非系统库log "未指定数据库,备份所有非系统库"DATABASES=$(docker exec "$MYSQL_CONTAINER" \sh -c "export MYSQL_PWD='${MYSQL_PASS}'; \mysql -u ${MYSQL_USER} -N -e 'SHOW DATABASES;'" | \grep -Ev "^(${EXCLUDE_DBS//,/|})$")
fi# ---------------------------- 备份执行 ----------------------------
TOTAL_SIZE=0
for DB in $DATABASES; doBACKUP_FILE="${BACKUP_DIR}/${DB}.sql.gz"START_TIME=$(date +%s)log "备份启动: ${DB}"# 核心备份命令docker exec "$MYSQL_CONTAINER" \sh -c "export MYSQL_PWD='${MYSQL_PASS}'; \mysqldump -u ${MYSQL_USER} \--routines --triggers --events \--single-transaction \--hex-blob \${DB}" | gzip > "$BACKUP_FILE"# 结果检查if [ $? -eq 0 ]; thenFILE_SIZE=$(du -h "$BACKUP_FILE" | awk '{print $1}')TIME_TAKEN=$(( $(date +%s) - START_TIME ))TOTAL_SIZE=$(( TOTAL_SIZE + $(stat -c %s "$BACKUP_FILE") ))log "备份成功: ${DB} (大小: ${FILE_SIZE}, 耗时: ${TIME_TAKEN}秒)"# 验证压缩文件if ! gzip -t "$BACKUP_FILE" 2>/dev/null; thenlog "警告:压缩文件校验失败 ${BACKUP_FILE}"fielselog "错误:${DB} 备份失败"rm -f "$BACKUP_FILE"fi
done# ---------------------------- 清理旧备份 ----------------------------
if [ -n "$(ls -A "$BACKUP_DIR")" ]; thenlog "正在清理超过 ${RETENTION_DAYS} 天的旧备份..."find "$BACKUP_ROOT" -mindepth 1 -maxdepth 1 -type d -mtime +"$RETENTION_DAYS" \-exec sh -c 'log "删除旧备份: {}"; rm -rf "{}"' \;
elselog "警告:未生成有效备份,跳过清理"rm -rf "$BACKUP_DIR"
fi# ---------------------------- 完成报告 ----------------------------
if [ -d "$BACKUP_DIR" ]; thenHUMAN_SIZE=$(numfmt --to=iec $TOTAL_SIZE)log "备份完成: ${BACKUP_DIR} (总大小: ${HUMAN_SIZE})"
elselog "错误:未生成任何有效备份"
filog "===== 备份结束 [${TIMESTAMP}] ====="
echo "" >> "$LOG_FILE"
exit 0

备份指定数据库:sh docker_mysql_backup.sh neo_dbv1,shop

备份全部:sh docker_mysql_backup.sh

本地 部署备份

设置mysql的用户凭证配置文件

sudo tee /etc/mysql/backup.cnf > /dev/null <<EOF
[client]
user = backup
password = 123456
EOF
sudo chmod 600 /etc/mysql/backup.cnf

docker_mysql_backup.sh

#!/bin/bash# ---------------------------- 配置区 ----------------------------
BACKUP_ROOT="/data/mysql_backup"      # 备份根目录
RETENTION_DAYS=30                     # 备份保留天数
LOG_FILE="/var/log/mysql_backup.log"  # 日志文件路径
CONFIG_FILE="/etc/mysql/backup.cnf"   # 必须存在的配置文件
EXCLUDE_DBS="information_schema,performance_schema,mysql,sys" # 排除的系统库
# ----------------------------------------------------------------# ---------------------------- 初始化 ----------------------------
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_DIR="${BACKUP_ROOT}/${TIMESTAMP}"
mkdir -p "$BACKUP_DIR"
touch "$LOG_FILE"# 日志记录函数
log() {echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}log "===== 备份开始 [${TIMESTAMP}] ====="# ---------------------------- 配置文件检查 ----------------------------
if [ ! -f "$CONFIG_FILE" ]; thenlog "错误:MySQL配置文件 $CONFIG_FILE 不存在"log "请创建包含以下内容的配置文件:"log "[client]"log "user = backup"log "password = your_password"exit 1
fiif [ $(stat -c %a "$CONFIG_FILE") -ne 600 ]; thenlog "警告:配置文件权限不安全,正在设置为600"chmod 600 "$CONFIG_FILE"
fi# ---------------------------- 参数处理 ----------------------------
if [ -n "$1" ]; then# 处理用户输入的数据库列表USER_DBS=$(echo "$1" | tr ',' ' ')log "已指定数据库: ${USER_DBS}"# 验证数据库是否存在ALL_DBS=$(mysql --defaults-file="$CONFIG_FILE" -N -e "SHOW DATABASES;")DATABASES=""for DB in $USER_DBS; doif echo "$ALL_DBS" | grep -qw "$DB"; thenDATABASES="$DATABASES $DB"elselog "警告:数据库 ${DB} 不存在,已跳过"fidoneif [ -z "$DATABASES" ]; thenlog "错误:没有有效的可备份数据库"exit 1fi
else# 获取所有非系统库log "未指定数据库,备份所有非系统库"DATABASES=$(mysql --defaults-file="$CONFIG_FILE" -N -e "SHOW DATABASES;" | \grep -Ev "^(${EXCLUDE_DBS//,/|})$")
fi# ---------------------------- 备份执行 ----------------------------
TOTAL_SIZE=0
for DB in $DATABASES; doBACKUP_FILE="${BACKUP_DIR}/${DB}.sql.gz"START_TIME=$(date +%s)log "备份启动: ${DB}"# 核心备份命令(使用配置文件认证)mysqldump --defaults-file="$CONFIG_FILE" \--routines --triggers --events \--single-transaction \--hex-blob \"$DB" | gzip > "$BACKUP_FILE"# 结果检查if [ $? -eq 0 ]; thenFILE_SIZE=$(du -h "$BACKUP_FILE" | awk '{print $1}')TIME_TAKEN=$(( $(date +%s) - START_TIME ))TOTAL_SIZE=$(( TOTAL_SIZE + $(stat -c %s "$BACKUP_FILE") ))log "备份成功: ${DB} (大小: ${FILE_SIZE}, 耗时: ${TIME_TAKEN}秒)"# 验证压缩文件if ! gzip -t "$BACKUP_FILE" 2>/dev/null; thenlog "警告:压缩文件校验失败 ${BACKUP_FILE}"fielselog "错误:${DB} 备份失败"rm -f "$BACKUP_FILE"fi
done# ---------------------------- 清理旧备份 ----------------------------
if [ -n "$(ls -A "$BACKUP_DIR")" ]; thenlog "正在清理超过 ${RETENTION_DAYS} 天的旧备份..."find "$BACKUP_ROOT" -mindepth 1 -maxdepth 1 -type d -mtime +"$RETENTION_DAYS" \-exec sh -c 'log "删除旧备份: {}"; rm -rf "{}"' \;
elselog "警告:未生成有效备份,跳过清理"rm -rf "$BACKUP_DIR"
fi# ---------------------------- 完成报告 ----------------------------
if [ -d "$BACKUP_DIR" ]; thenHUMAN_SIZE=$(numfmt --to=iec $TOTAL_SIZE)log "备份完成: ${BACKUP_DIR} (总大小: ${HUMAN_SIZE})"
elselog "错误:未生成任何有效备份"
filog "===== 备份结束 [${TIMESTAMP}] ====="
echo "" >> "$LOG_FILE"
exit 0

定时执行备份脚本

修改 crontab 时间表达式

crontab -e  

添加以下行(晚上7点43分执行)

43 19 * * * /usr/local/docker/mysql/backup/docker_backup.sh >> /var/log/mysql_backup_cron.log 2>&1

查看当前用户的定时任务

[root@lavm 20250905_135142]# crontab -l
43 19 * * * /usr/local/docker/mysql/backup/docker_backup.sh >> /var/log/mysql_backup_cron.log 2>&1

备份日志: cat /var/log/mysql_backup.log

备份数据按照时间展示


文章转载自:

http://L0XYqryg.rjhts.cn
http://RZVOiLpq.rjhts.cn
http://DcwNb341.rjhts.cn
http://hW8wnnMN.rjhts.cn
http://7ltvqZSO.rjhts.cn
http://OOyhE4H7.rjhts.cn
http://mhouzzXf.rjhts.cn
http://L2PtU1iI.rjhts.cn
http://NGrqOOdZ.rjhts.cn
http://JQsMMBGu.rjhts.cn
http://FsduRTH7.rjhts.cn
http://HPbi8FFL.rjhts.cn
http://mLmM7V70.rjhts.cn
http://RifETIW9.rjhts.cn
http://vwYJPC5v.rjhts.cn
http://hkbNWAwe.rjhts.cn
http://kPkXqP2P.rjhts.cn
http://P0yB86Lv.rjhts.cn
http://VpnDJoNR.rjhts.cn
http://5patyOvn.rjhts.cn
http://hHWDfouk.rjhts.cn
http://Hnrxzb1H.rjhts.cn
http://YMFGqsKQ.rjhts.cn
http://RapRi9hG.rjhts.cn
http://L1XJdaPZ.rjhts.cn
http://tfC0vD2Z.rjhts.cn
http://f4FClGA0.rjhts.cn
http://COvIWcbH.rjhts.cn
http://yUfaeJTm.rjhts.cn
http://NKYU4dJC.rjhts.cn
http://www.dtcms.com/a/369206.html

相关文章:

  • 2025全球生成式引擎优化(GEO)服务商发展趋势与企业赋能白皮书
  • pthread_mutex_lock与pthread_mutex_unlock
  • 【完整源码+数据集+部署教程】广告牌实例分割系统源码和数据集:改进yolo11-dysample
  • CUDA编程12 - 使用OpenMP控制多个GPU示例
  • TortoiseGit 2.4.0.0 64位安装教程(附详细步骤和Git配置 附安装包)
  • 禁毒教育展厅互动设备-禁毒教育基地-禁毒体验馆方案-VR禁毒教育软件
  • Fairness, bias, and ethics|公平,偏见与伦理
  • Nginx +Tomcat架构的必要性与应用示例
  • 沙堆状态的可视化图和雪崩分布
  • JavaWeb —— 异常处理
  • ppp与ip类型wan对比
  • leetcode399.除法求值
  • 电磁波成像(X射线、CT成像)原理简介
  • RikkaHub:安卓原生AI聊天新体验
  • Linux之Ubuntu桌面化操作系统的安装
  • CASToR 生成的文件进行转换
  • AI架构师的思维方式与架构设计原则
  • 软考 系统架构设计师系列知识点之杂项集萃(140)
  • 修改上次提交的Git提交日志
  • 【可信数据空间-连接器状态监控-Java代码集成】
  • C语言(长期更新)第15讲 指针详解(五):习题实战
  • 全球汽车氮化镓技术市场规模将于2031年增长至180.5亿美元,2025-2031年复合增长率达94.3%,由Infineon和Navitas驱动
  • .Net程序员就业现状以及学习路线图(四)
  • 垃圾回收算法详解
  • 【QT 5.12.12 打包-Windows 平台下】
  • 2025高教社数学建模国赛B题 - 碳化硅外延层厚度的确定(完整参考论文)
  • 【设计模式】UML 基础教程总结(软件设计师考试重点)
  • 三维聚类建模
  • Web 转发机制深度解析
  • 鸿蒙NEXT自定义能力详解:从基础使用到高级技巧