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恢复演示