游乐游手机版
首页/数据库/文章详情

Docker环境下MySQL全库分离备份与还原全面详解教程

时间:2026-07-23 21:59
Docker环境下MySQL全库分离备份方案,按业务库拆分备份,通过自动化脚本执行并压缩存储,实现轻量备份、精准还原与安全存储的闭环管理。适合中小规模场景,可配合crontab定时任务,确保数据安全。

引言

如今,Docker容器化部署已成为主流选择,MySQL数据库的备份与还原不得不面对“环境隔离”与“数据安全”两大挑战。传统的全库备份不仅资源消耗大,一旦某个业务库出现故障,恢复起来相当麻烦——若想单独拉出一个库,要么等待全库还原完毕,要么另寻他法。

本文基于实战经验,提供一套Docker环境下MySQL全库分离备份方案:按业务数据库独立拆分备份、通过自动化脚本执行、压缩存储,最终实现“轻量备份-精准还原-安全存储”的闭环管理。

Docker环境下的MySQL全库分离备份及还原教程

一、Docker中MySQL分离备份

1. 数据准备(待备份机器上MySQL的容器ID、用户名、密码)

执行docker ps | grep pxcdocker ps | grep mysql查看MySQL容器,通常为3306端口的那个容器,记下容器ID(一般位于第一列)。

Docker环境下的MySQL全库分离备份及还原教程

2. 数据库备份步骤

1. 创建并执行备份脚本(bak.sh)

以下脚本需要根据实际环境修改配置项,直接执行命令即可完成数据库备份。

cat > /bak/bak.sh << 'EOF'#!/bin/bash# ========== 配置(请根据实际情况修改) ==========CONTAINER_NAME="xxxxx"   #您的MySQL容器名称或idBACKUP_DIR="/bak/mysql"  #修改为要备份的位置目录MYSQL_USER="xxxxx"       #修改为真实数据库用户名MYSQL_PASSWORD="xxxxx"   #修改为真实数据库密码DATE=$(date +%Y%m%d_%H%M%S)# ========== 创建备份目录==========mkdir -p ${BACKUP_DIR}# ========== 获取数据库列表(过滤系统库) ==========DATABASES=$(docker exec ${CONTAINER_NAME} mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} -e "SHOW DATABASES;" 2>/dev/null |             grep -Ev "^(Database|information_schema|performance_schema|mysql|sys)$")# ========== 逐个备份 ==========for DB in ${DATABASES}; do    echo "正在备份数据库: ${DB}"    BACKUP_FILE="${BACKUP_DIR}/${DB}_${DATE}.sql"    docker exec ${CONTAINER_NAME} mysqldump -u${MYSQL_USER} -p${MYSQL_PASSWORD}         --single-transaction         --routines         --triggers         --events         -B ${DB} > ${BACKUP_FILE} 2>/dev/null    if [ $? -eq 0 ]; then        echo "✓ 备份成功: ${BACKUP_FILE}"    else        echo "✗ 备份失败: ${DB}"        rm -f ${BACKUP_FILE}    fidoneecho "所有数据库备份完成!备份目录:${BACKUP_DIR}"EOFchmod +x /bak/bak.shecho "已更新并添加执行权限,开始备份数据库"/bak/bak.sh

Docker环境下的MySQL全库分离备份及还原教程

2. 压缩备份结果

tar -czf /bak/mysql_backup_$(date +%Y%m%d_%H%M%S).tar.gz -C /bak mysql

需要注意的是,如果脚本在Windows上创建,粘贴到Linux后需要转换换行符——Windows使用CRLF(\r\n),而Linux期望LF(\n)。执行以下命令转换即可:sed -i 's/\r$//' /bak/bak.sh

二、Docker中MySQL一键还原

1. 数据准备(查看待还原机器上MySQL的容器ID、用户名、密码)

执行docker ps | grep pxcdocker ps | grep mysql查看MySQL容器,通常为3306端口的那个容器,记录容器ID(一般位于第一列)。

Docker环境下的MySQL全库分离备份及还原教程

2. 数据库还原步骤

1. 创建目录bak,将备份文件复制并解压到bak目录

#创建目录bakmkdir -p /bak/mysql#解压缩命令tar -zxvf /bak/mysql_backup_20260608_112915.tar.gz -C /bak

2. 创建并执行还原脚本(restore.sh)

同样修改脚本中的配置项,直接执行以下命令即可完成数据库恢复。

cat > /bak/restore.sh << 'EOF'#!/bin/bash# ===== 配置区(与备份脚本保持一致) =====================CONTAINER_NAME="xxxxx"   #您的MySQL容器名称或idBACKUP_DIR="/bak/mysql"  #修改为备份文件的位置目录MYSQL_USER="xxxxx"       #修改为真实数据库用户名MYSQL_PASSWORD="xxxxx"   #修改为真实数据库密码# =============================================# 颜色输出RED='\033[0;31m'GREEN='\033[0;32m'YELLOW='\033[1;33m'NC='\033[0m'# 定义需要跳过的系统数据库列表(恢复时忽略)SKIP_DATABASES=(    "mysql"    "information_schema"    "performance_schema"    "sys"    "test")# 校验备份目录if [ ! -d "${BACKUP_DIR}" ]; then    echo -e "${RED}错误:备份目录 ${BACKUP_DIR} 不存在!${NC}"    exit 1fi# 检查容器是否运行if ! docker ps --filter "id=${CONTAINER_NAME}" --format "{{.ID}}" | grep -q "${CONTAINER_NAME}"; then    echo -e "${RED}错误:容器 ${CONTAINER_NAME} 未运行或不存在!${NC}"    exit 1fi# 测试 MySQL 连接echo -e "${YELLOW}测试 MySQL 连接...${NC}"if ! docker exec -i "${CONTAINER_NAME}" mysql -u"${MYSQL_USER}" -p"${MYSQL_PASSWORD}" -e "SELECT 1;" >/dev/null 2>&1; then    echo -e "${RED}错误:无法连接 MySQL,请检查用户名或密码!${NC}"    exit 1fiecho -e "${GREEN}✓ 连接成功${NC}"# 统计变量TOTAL=0SUCCESS=0SKIPPED=0FAILED=0# 遍历所有 sql 文件for SQL_FILE in "${BACKUP_DIR}"/*.sql; do    [ -e "$SQL_FILE" ] || continue    # 提取数据库名:删除末尾时间戳(_YYYYMMDD_HHMMSS.sql),保留完整名称(含 - 等特殊字符)    DB_NAME=$(basename "${SQL_FILE}" | sed 's/_[0-9]\{8\}_[0-9]\{6\}.sql$//')    # 检查是否在跳过列表中    SKIP=0    for SKIP_DB in "${SKIP_DATABASES[@]}"; do        if [ "${DB_NAME}" == "${SKIP_DB}" ]; then            SKIP=1            break        fi    done    if [ ${SKIP} -eq 1 ]; then        echo "=========================================="        echo -e "${YELLOW}⏭️ 跳过系统数据库:${DB_NAME}${NC}"        ((SKIPPED++))        continue    fi    echo "============================================="    echo -e "${YELLOW}开始恢复数据库:${DB_NAME}${NC}"    echo "文件:${SQL_FILE}"    ((TOTAL++))    # 执行恢复,捕获输出    TEMP_LOG=$(mktemp)    docker exec -i "${CONTAINER_NAME}" mysql -u"${MYSQL_USER}" -p"${MYSQL_PASSWORD}" --force < "${SQL_FILE}" > "${TEMP_LOG}" 2>&1    EXIT_CODE=$?    # 判断是否真正失败:排除 ERROR 1105(PXC 严格模式警告)    OTHER_ERRORS=$(grep -i "ERROR" "${TEMP_LOG}" | grep -v "ERROR 1105")    if [ ${EXIT_CODE} -eq 0 ] && [ -z "${OTHER_ERRORS}" ]; then        # 检查是否只有 1105 警告        # if grep -qi "ERROR 1105" "${TEMP_LOG}"; then            # echo -e "${YELLOW}⚠️ 检测到 PXC 严格模式警告(已忽略),数据已正常恢复${NC}"        # fi        echo -e "${GREEN}✅ ${DB_NAME} 恢复成功${NC}"        ((SUCCESS++))    else        echo -e "${RED}❌ ${DB_NAME} 恢复失败,错误信息:${NC}"        if [ -n "${OTHER_ERRORS}" ]; then            echo "${OTHER_ERRORS}" | head -10        else            tail -5 "${TEMP_LOG}"        fi        ((FAILED++))    fi    rm -f "${TEMP_LOG}"done# 输出汇总echo "============================================="echo -e "${GREEN}批量恢复执行完毕!${NC}"echo "总计处理:$((TOTAL + SKIPPED)) 个文件"echo "  ✅ 成功恢复:${SUCCESS}"echo "  ⏭️  跳过系统库:${SKIPPED}"if [ ${FAILED} -gt 0 ]; then    echo -e "  ${RED}❌ 恢复失败:${FAILED}${NC}"else    echo "  ❌ 恢复失败:0"fiEOFchmod +x /bak/restore.shecho "已更新并添加执行权限,开始恢复数据库"/bak/restore.sh

Docker环境下的MySQL全库分离备份及还原教程

三、总结

这套Docker环境下的MySQL全库分离备份还原方案,适用于中小规模业务场景,脚本可直接使用。核心思路是按库分离备份——这样恢复某个业务库时能够直接操作,无需全量还原;同时借助自动化脚本减少人工干预,有效降低出错概率。如有需要,可配合crontab设置定时备份,例如每天凌晨3点执行:

crontab -e  # 添加一行0 3 * * * /bak/bak.sh && tar -czf /bak/mysql_backup_$(date +%Y%m%d).tar.gz -C /bak mysql --remove-files

数据安全无小事,定期备份,再加上定期的还原测试,才能在关键时刻保证系统稳定运行。

来源:https://www.jb51.net/database/366484k8p.htm
上一篇详解SQL中分组排序后数据倾斜问题处理方法 下一篇彻底理解MySQL中DISTINCT去重语句优化原理与机制详解
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
自增主键值从何而来?深入理解原理,告别只会auto_increment
数据库 · 2026-07-25

自增主键值从何而来?深入理解原理,告别只会auto_increment

KingbaseES推荐使用serial、bigserial、显式sequence或identity列实现自增主键。serial创建integer并关联序列,bigserial对应bigint;显式sequence可自定义起始值等参数;identity有generatedbydefault(允许指定值)与always(禁止)两种模式。

Linux下瀚高数据库授权文件过期及替换解决方案
数据库 · 2026-07-25

Linux下瀚高数据库授权文件过期及替换解决方案

在银河麒麟系统下,瀚高数据库hgdb-4 5试用授权20天到期后需替换正式授权文件。正确操作:停止服务,备份旧文件,将授权文件复制到 opt highgo hgdb-4 5 etc lic 并命名为hgdb lic,设置权限600和属主highgo:highgo,再启动服务。禁止直接修改data目录下的license info文件。

Oracle BLOB实时同步的5大技术挑战与难点解析
数据库 · 2026-07-25

Oracle BLOB实时同步的5大技术挑战与难点解析

OracleBLOB实时同步面临分片组装、多列隔离、长事务跨窗口、事务回滚及大对象资源控制等技术挑战,必须在日志中精确还原完整字段值,才能保证源端与目标端数据完全一致,这对同步系统的稳健性提出了高要求。

MySQL禁用redo日志导致全备失败
数据库 · 2026-07-25

MySQL禁用redo日志导致全备失败

MySQL全量备份失败是由于数据定义语言操作触发排序索引构建,禁用重做日志导致XtraBackup无法获取一致性备份。测试验证表明,优化表语句即使无数据也会触发该问题。根本原因在于排序索引构建过程跳过了重做日志记录,破坏了备份的一致性。

Kafka架构图优化与改进的全面详细步骤与实践指南
数据库 · 2026-07-25

Kafka架构图优化与改进的全面详细步骤与实践指南

Kafka作为实时数据流处理的核心中间件,其底层架构虽已相当成熟,但在实际生产环境中,要充分发挥其性能潜力,仍需落实到具体的调优与架构改造上。核心目标可归纳为三点:如何承载更高的吞吐量、如何保障数据不丢失、以及故障发生时如何快速恢复。本文将从这几个关键方向出发,深入探讨如何真正榨干Kafka集群的性