首页主机资讯如何实现MariaDB数据备份自动化

如何实现MariaDB数据备份自动化

时间2025-12-12 21:03:03发布访客分类主机资讯浏览1024
导读:MariaDB 备份自动化落地方案 一 方案选型与准备 工具选择:使用 mariabackup(MariaDB 官方热备工具,支持 InnoDB 热备、增量备份、流备份),适合生产环境的在线备份与快速恢复。 备份用户与权限:创建最小权限备...

MariaDB 备份自动化落地方案

一 方案选型与准备

  • 工具选择:使用 mariabackup(MariaDB 官方热备工具,支持 InnoDB 热备、增量备份、流备份),适合生产环境的在线备份与快速恢复。
  • 备份用户与权限:创建最小权限备份账号,建议仅本地连接,授予 RELOAD、PROCESS、LOCK TABLES、REPLICATION CLIENT 等必要权限。
  • 目录与日志:规划备份根目录(如 /opt/mysql_backup)、全量/增量子目录、以及日志文件(如 /var/log/mariadb_backup.log),并确保运行用户(如 mysql)对相关目录有读写权限。
  • 保留策略:结合容量与合规设置保留天数(如 7/30 天),并配置周期性清理任务。

二 自动化脚本示例

  • 策略说明:每天做 全量备份,其余时间基于“上一次备份目录”做 增量备份;通过状态文件记录“基准备份”,失败自动清理残留目录;按保留天数清理旧备份。
  • 使用方式:修改脚本顶部的 MYSQL_USER/MYSQL_PASSWORD/BACKUP_DIR/FULL_BACKUP_INTERVAL/RETENTION_DAYS/LOG_FILE 后赋权并加入 crontab 定时执行。
#!/usr/bin/env bash
set -Eeuo pipefail

# ===== 用户配置 =====
MYSQL_USER="buser"
MYSQL_PASSWORD="tmrQ"
BACKUP_DIR="/opt/mysql_backup"
FULL_BACKUP_INTERVAL=7      # 全量间隔:天
RETENTION_DAYS=30          # 保留天数
LOG_FILE="/var/log/mariadb_backup.log"

# ===== 内部变量 =====
FULL_DIR="$BACKUP_DIR/full"
INCR_DIR="$BACKUP_DIR/incr"
LAST_FULL_FILE="$BACKUP_DIR/last_full_backup"
XBK="/usr/bin/mariabackup"

log() {

  echo "[$(date '+%F %T')] $*" | tee -a "$LOG_FILE"
}


cleanup() {
    
  local target="$1"
  if [[ -d "$target" ]];
 then
    rm -rf "$target"
    log "已清理临时目录: $target"
  fi
}


check_db() {
    
  if ! mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "SELECT 1" &
    >
    /dev/null;
 then
    log "ERROR: 无法连接 MariaDB,请检查账号/网络/权限"
    return 1
  fi
}


full_backup() {
    
  local ts
  ts=$(date +"%Y%m%d_%H%M%S")
  local target_dir="$FULL_DIR/full-$ts"
  mkdir -p "$target_dir"

  log "开始全量备份 ->
     $target_dir"
  if "$XBK" --backup \
      --user="$MYSQL_USER" \
      --password="$MYSQL_PASSWORD" \
      --target-dir="$target_dir" >
    >
    "$LOG_FILE" 2>
    &
    1;
     then
    echo "$target_dir" >
 "$LAST_FULL_FILE"
    log "全量备份成功: $target_dir"
  else
    log "全量备份失败: $target_dir"
    cleanup "$target_dir"
    return 1
  fi
}


incremental_backup() {
    
  local base_dir
  base_dir=$(cat "$LAST_FULL_FILE" 2>
    /dev/null || true)
  if [[ -z "$base_dir" || ! -d "$base_dir" ]];
     then
    log "未找到可用基准备份,回退执行全量备份"
    full_backup
    return $?
  fi

  local ts
  ts=$(date +"%Y%m%d_%H%M%S")
  local target_dir="$INCR_DIR/incr-$ts"
  mkdir -p "$target_dir"

  log "开始增量备份 ->
     $target_dir(基于: $(basename "$base_dir"))"
  if "$XBK" --backup \
      --user="$MYSQL_USER" \
      --password="$MYSQL_PASSWORD" \
      --target-dir="$target_dir" \
      --incremental-basedir="$base_dir" >
    >
    "$LOG_FILE" 2>
    &
    1;
 then
    log "增量备份成功: $target_dir"
  else
    log "增量备份失败: $target_dir"
    cleanup "$target_dir"
    return 1
  fi
}


purge_old() {
    
  log "清理超过 $RETENTION_DAYS 天的备份..."
  find "$FULL_DIR" -mindepth 1 -type d -mtime "+$RETENTION_DAYS" -print -delete | while read d;
     do
    log "删除旧全备: $d"
  done
  find "$INCR_DIR" -mindepth 1 -type d -mtime "+$RETENTION_DAYS" -print -delete | while read d;
 do
    log "删除旧增备: $d"
  done
}


main() {
    
  log "===== 备份开始 ====="
  check_db || exit 1

  local need_full=false
  if [[ ! -f "$LAST_FULL_FILE" ]];
     then
    need_full=true
  elif [[ $(find "$LAST_FULL_FILE" -mtime "+$FULL_BACKUP_INTERVAL" | wc -l) -gt 0 ]];
     then
    need_full=true
  fi

  if $need_full;
 then
    full_backup
  else
    incremental_backup
  fi

  purge_old
  log "===== 备份完成 ====="
}
    

main "$@"
  • 定时任务示例(每天 04:00 执行):
    0 4 * * * /usr/bin/bash /opt/scripts/mariadb_backup.sh
    
  • 如需按“每天全量、每小时增量”的节奏,可改为每小时执行,并在脚本内按“当天是否已全量”进行分支选择。

三 远程备份与传输

  • rsync 方式(推荐,增量同步、断点续传):
    # 本地脚本备份完成后执行
    rsync -avz --delete -e ssh /opt/mysql_backup/ backup@10.0.0.111:/data/mysqlbak/
    
  • 打包流 + SSH 方式(适合带宽一般或需压缩传输):
    # 全量
    mariabackup --backup --user=buser --password=tmrQ --stream=xbstream | \
      gzip | ssh backup@10.0.0.111 "cat >
         /data/mysqlbak/full_$(date +%F_%H%M%S).xbstream.gz"
    
    # 增量(基于上一次备份目录)
    mariabackup --backup --user=buser --password=tmrQ \
      --incremental-basedir=/opt/mysql_backup/full/full-YYYYMMDD_HHMMSS \
      --stream=xbstream | gzip | \
      ssh backup@10.0.0.111 "cat >
         /data/mysqlbak/incr_$(date +%F_%H%M%S).xbstream.gz"
    
  • 前置条件:打通 SSH 免密登录(ssh-keygen/ssh-copy-id),并在远端创建备份目录与合适的属主属组。

四 还原流程要点

  • 准备阶段(Prepare)
    • 全量准备(仅一次):
      mariabackup --prepare --target-dir=/data/restore/base
      
    • 依次准备每个增量(按时间顺序,除最后一个增量外建议加 –apply-log-only):
      mariabackup --prepare --apply-log-only --target-dir=/data/restore/base \
        --incremental-dir=/data/restore/incr_YYYYMMDD_HHMMSS_01
      mariabackup --prepare --apply-log-only --target-dir=/data/restore/base \
        --incremental-dir=/data/restore/incr_YYYYMMDD_HHMMSS_02
      # 最后一个增量可不加 --apply-log-only
      mariabackup --prepare --target-dir=/data/restore/base \
        --incremental-dir=/data/restore/incr_YYYYMMDD_HHMMSS_NN
      
  • 恢复阶段(Copy Back)
    systemctl stop mysqld
    mv /var/lib/mysql /var/lib/mysql.bak_$(date +%F_%H%M%S)
    mkdir -p /var/lib/mysql
    mariabackup --copy-back --target-dir=/data/restore/base
    chown -R mysql:mysql /var/lib/mysql
    systemctl start mysqld
    
  • 提示:若使用 –stream 方式备份,需先用 mbstream -x 解包到目录后再执行 prepare/copy-back。

五 监控校验与最佳实践

  • 校验与留痕:脚本内统一 日志输出错误退出码;定期校验备份可用(如随机抽取一次做“prepare 演练”),并将关键指标(成功/失败、耗时、备份大小)接入监控告警。
  • 安全建议:避免在命令行中明文写密码,可使用 ~/.my.cnf 配置凭据或凭据管理工具;限制备份账号仅本地访问;备份文件与传输通道加密存储/传输。
  • 保留与容量:按 容量与 RPO/RTO 设定全量/增量频率与保留天数;对历史备份做 定期归档与异地/离线 存放,降低单点风险。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: 如何实现MariaDB数据备份自动化
本文地址: https://pptw.com/jishu/770912.html
怎样提高MariaDB并发性能 怎样防止MariaDB SQL注入攻击

游客 回复需填写必要信息