mysql8-innodb-备份方案

mysql 自动备份

备份方案一

根据业务库独立备份,每个备份文件独立存储

1.1备份脚本

#!/bin/bash

# 备份配置(按需修改)
MYSQL_USER="root"                 # 数据库用户名
MYSQL_PASS="your_password"         # 数据库密码
BACKUP_DIR="/data/backups/mysql"   # 备份存储目录
KEEP_DAYS=7                       # 备份保留天数
LOG_FILE="/var/log/mysql_backup.log"

# 定义需要备份的业务库列表(重要!按实际修改)
BUSINESS_DBS=("order_db" "user_db" "product_db") 

# 创建备份目录
mkdir -p ${BACKUP_DIR} || { echo "无法创建备份目录"; exit 1; }

# 获取备份时间戳
TIMESTAMP=$(date +"%Y%m%d-%H%M%S")

# 记录开始时间
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始多库备份" >> ${LOG_FILE}

# 循环备份每个业务库
for DB_NAME in "${BUSINESS_DBS[@]}"; do
    BACKUP_FILE="${BACKUP_DIR}/backup_${DB_NAME}_${TIMESTAMP}.sql.gz"
    
    # 记录单库开始
    echo "  |- 数据库 ${DB_NAME} 备份开始..." >> ${LOG_FILE}
    
    # 执行单库备份
    mysqldump --single-transaction \
              --quick \
              --no-tablespaces \
              --routines \
              --triggers \
              --events \
              --hex-blob \
              -u${MYSQL_USER} -p${MYSQL_PASS} \
              ${DB_NAME} 2>> ${LOG_FILE} | gzip > ${BACKUP_FILE}

    # 检查单库结果
    if [ $? -eq 0 ]; then
        echo "  |- 数据库 ${DB_NAME} 备份成功 → ${BACKUP_FILE}" >> ${LOG_FILE}
        
        # 清理该库的旧备份
        find ${BACKUP_DIR} -name "backup_${DB_NAME}_*.sql.gz" -mtime +${KEEP_DAYS} -delete 2>> ${LOG_FILE}
    else
        echo "  |- [错误] 数据库 ${DB_NAME} 备份失败!" >> ${LOG_FILE}
    fi
done

echo "[$(date +'%Y-%m-%d %H:%M:%S')] 所有业务库备份完成" >> ${LOG_FILE}

备份特点:

1.2独立备份

通过预定义的 BUSINESS_DBS 数组指定业务库
每个数据库生成独立文件,命名格式:backup_库名_时间戳.sql.gz
示例:backup_order_db_20231001-020000.sql.gz

1.3清理机制

find ${BACKUP_DIR} -name "backup_${DB_NAME}_*.sql.gz" -mtime +${KEEP_DAYS} -delete

1.4日志可读

[2023-10-01 02:00:00] 开始多库备份
  |- 数据库 order_db 备份开始...
  |- 数据库 order_db 备份成功 → /data/backups/mysql/backup_order_db_20231001-020000.sql.gz
  |- 数据库 user_db 备份开始...
  |- 数据库 user_db 备份成功 → /data/backups/mysql/backup_user_db_20231001-020000.sql.gz
[2023-10-01 02:15:00] 所有业务库备份完成

 

1.5使用方式

配置业务表

BUSINESS_DBS=("电商订单库" "用户中心库")  # 使用实际库名

恢复单个库

# 解压指定库的备份文件
gzip -d backup_order_db_20231001-020000.sql.gz

# 单独恢复订单库
mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS order_db"
mysql -uroot -p order_db < backup_order_db_20231001-020000.sql

 

备份方案二

2.1备份脚本

#!/bin/bash

# 备份配置(按需修改)
MYSQL_USER="root"                 # 数据库用户名
MYSQL_PASS="your_password"         # 数据库密码
BACKUP_DIR="/data/backups/mysql"   # 备份存储目录
KEEP_COPIES=7                      # 保留最近备份份数
LOG_FILE="/var/log/mysql_backup.log"

# 需要备份的业务库列表
BUSINESS_DBS=("order_db" "user_db" "product_db")

# 创建备份目录
mkdir -p ${BACKUP_DIR} || { echo "无法创建备份目录"; exit 1; }

# 获取时间戳
TIMESTAMP=$(date +"%Y%m%d-%H%M%S")

# 记录开始时间
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始多库备份" >> ${LOG_FILE}

# 循环备份每个业务库
for DB_NAME in "${BUSINESS_DBS[@]}"; do
    BACKUP_FILE="${BACKUP_DIR}/backup_${DB_NAME}_${TIMESTAMP}.sql.gz"
    
    # 记录单库开始
    echo "  |- 数据库 ${DB_NAME} 备份开始..." >> ${LOG_FILE}
    
    # 执行单库备份
    mysqldump --single-transaction \
              --quick \
              --no-tablespaces \
              --routines \
              --triggers \
              --events \
              --hex-blob \
              -u${MYSQL_USER} -p${MYSQL_PASS} \
              ${DB_NAME} 2>> ${LOG_FILE} | gzip > ${BACKUP_FILE}

    # 检查备份结果
    if [ $? -eq 0 ]; then
        echo "  |- 数据库 ${DB_NAME} 备份成功 → ${BACKUP_FILE}" >> ${LOG_FILE}
        
        # 保留策略:按备份次数清理旧文件
        BACKUP_FILES=($(ls -t ${BACKUP_DIR}/backup_${DB_NAME}_*.sql.gz 2>/dev/null))
        
        if [ ${#BACKUP_FILES[@]} -gt ${KEEP_COPIES} ]; then
            # 需要删除的文件列表(保留最新的KEEP_COPIES个)
            DELETE_FILES=("${BACKUP_FILES[@]:${KEEP_COPIES}}")
            
            # 执行删除并记录日志
            for DEL_FILE in "${DELETE_FILES[@]}"; do
                rm -f "${DEL_FILE}"
                echo "  |- 删除旧备份: $(basename ${DEL_FILE})" >> ${LOG_FILE}
            done
        fi
    else
        echo "  |- [错误] 数据库 ${DB_NAME} 备份失败!" >> ${LOG_FILE}
    fi
done

echo "[$(date +'%Y-%m-%d %H:%M:%S')] 所有业务库备份完成" >> ${LOG_FILE}

使用过程参考方案一,具体看脚本参数设置,此处省略

2.2智能保留机制

使用 ls -t 按时间倒序排列文件,通过数组切片保留最新7个文件:

BACKUP_FILES=($(ls -t ${BACKUP_DIR}/backup_${DB_NAME}_*.sql.gz))
DELETE_FILES=("${BACKUP_FILES[@]:${KEEP_COPIES}}")  # 从第8个开始截取

 

2.3动态清理逻辑

每次备份后立即检查该库的备份文件数量
只有当文件数 ?超过 保留份数时才执行删除
支持不同库独立计数(例如order_db保留7份,user_db也保留7份)

2.4安全删除验证

# 输出示例
BACKUP_FILES=(
  /data/backups/mysql/backup_order_db_20240301-090000.sql.gz  # 最新
  /data/backups/mysql/backup_order_db_20240228-090000.sql.gz
  ...共8个文件...
)
# 保留前7个,删除第8个及之后的文件

 

2.5恢复示例演示

backup_order_db_20240301-120000.sql.gz  # 最新
backup_order_db_20240301-090000.sql.gz
backup_order_db_20240228-090000.sql.gz
...
backup_order_db_20240225-090000.sql.gz  # 最旧

执行备份后:

新增 backup_order_db_20240301-150000.sql.gz(第11个文件)
系统自动删除最旧的4个文件(保留最新的7个

注意事项

2.5.1文件名规范
备份文件必须遵循统一命名格式,脚本通过 backup_${DB_NAME}_ 前缀匹配
2.5.2时区一致性
确保服务器时间准确,避免因时间错误导致排序混乱
2.5.3权限控制
备份目录建议设置为:

chown -R mysql:mysql ${BACKUP_DIR}
chmod 750 ${BACKUP_DIR}

2.5.4监控建议
可通过以下命令查看各库备份数量

# 查看订单库备份数量
ls -l ${BACKUP_DIR}/backup_order_db_*.sql.gz | wc -l
# 查看最新3个备份文件
ls -lt ${BACKUP_DIR}/backup_order_db_*.sql.gz | head -n4

 

2.5恢复演示

 

posted @ 2025-03-26 22:35  李文学  阅读(23)  评论(0)    收藏  举报