温馨提示×

ubuntu sqladmin备份策略制定

小樊
46
2026-01-08 12:14:12
栏目: 云计算

Ubuntu 上 SQLAdmin 备份策略制定

一 目标与前提

  • 明确目标:设定可量化的RPO(恢复点目标)RTO(恢复时间目标),例如:RPO≤24小时、RTO≤2小时。RPO可理解为“允许丢失的数据时间窗口”,RTO为“从故障到恢复可用的时间”。这有助于决定备份频率与保留周期。
  • 工具澄清:SQLAdmin通常是第三方的Web 界面管理工具,并非数据库引擎本体;备份应由数据库引擎完成(如MySQL/MariaDB的 mysqldump、物理备份工具),SQLAdmin仅用于发起或协助操作。
  • 备份类型取舍:
    • 逻辑备份(如mysqldump):跨版本/跨平台迁移友好、粒度灵活,适合中小型库与频繁备份。
    • 物理备份(如 Percona XtraBackup):接近崩溃一致、适合大库与快速恢复,需与存储引擎/版本匹配。

二 备份策略设计

  • 分层策略(示例,可按业务调整):
    • 日常增量/差异:对 MySQL 使用**二进制日志(binlog)**实现时间点恢复(PITR),确保RPO可收敛到分钟级。
    • 每周全量:每周一次全库逻辑/物理备份,作为恢复基线。
    • 每月/每季度归档:长期保留用于审计或合规。
  • 保留与异地:
    • 本地保留:例如近7天日常备份、4周周备、12个月月备。
    • 异地/云存储:至少一份离线或云端副本(如对象存储),防范单点故障。
  • 加密与压缩:传输与静态加密(如GPG),备份文件gzip压缩以节省带宽与空间。
  • 校验与留痕:每次备份生成校验值(SHA-256)备份清单,并落库或日志留存,便于审计与回滚。
  • 调度与幂等:使用Cron或作业编排工具定时执行,脚本需具备幂等性与失败重试。

三 落地实施步骤

  • 准备与目录
    • 创建备份目录并设置权限:/backup/{daily,weekly,monthly,logs}。
    • 建议使用专用备份账号(最小权限:SELECT、SHOW VIEW、RELOAD、LOCK TABLES、REPLICATION CLIENT/REPLICATION SLAVE 等按需)。
  • 全量备份脚本(示例,MySQL)
    • 关键点:单事务一致性(InnoDB)、关闭GTID一致性(如非必要)、压缩与校验、记录日志。
    • 示例脚本(保存为 /usr/local/bin/backup_mysql_full.sh):
      #!/usr/bin/env bash
      set -Eeuo pipefail
      BACKUP_ROOT="/backup"
      DATE=$(date +%F_%H-%M-%S)
      DB_HOST="127.0.0.1"
      DB_PORT="3306"
      DB_USER="backup"
      DB_PASS="YourStrongPass"
      MYSQL="mysql --host=$DB_HOST --port=$DB_PORT --user=$DB_USER --password=$DB_PASS --single-transaction --routines --triggers --default-character-set=utf8mb4"
      MYSQLDUMP="mysqldump --host=$DB_HOST --port=$DB_PORT --user=$DB_USER --password=$DB_PASS \
        --single-transaction --routines --triggers --set-gtid-purged=OFF --hex-blob --triggers --routines --events \
        --default-character-set=utf8mb4 --databases your_db1 your_db2"
      
      OUT_DIR="$BACKUP_ROOT/daily/$DATE"
      mkdir -p "$OUT_DIR"
      
      LOG="$BACKUP_ROOT/logs/backup_$DATE.log"
      exec >"$LOG" 2>&1
      
      echo "[$(date)] Start full backup"
      
      # 全量导出
      $MYSQLDUMP > "$OUT_DIR/full_$DATE.sql"
      
      # 压缩与校验
      gzip "$OUT_DIR/full_$DATE.sql"
      sha256sum "$OUT_DIR/full_$DATE.sql.gz" > "$OUT_DIR/full_$DATE.sha256"
      
      echo "[$(date)] Full backup OK: $OUT_DIR/full_$DATE.sql.gz"
      
  • 增量/时间点恢复准备(MySQL)
    • 开启并持久化 binlog(my.cnf):
      [mysqld]
      server-id=1
      log_bin=/var/log/mysql/mysql-bin
      binlog_format=ROW
      expire_logs_days=7
      
    • 备份后记录位点(用于PITR):
      mysql --host=127.0.0.1 --user=backup --password=YourStrongPass -sN -e \
        "SHOW MASTER STATUS\G" | awk '/File:/ {file=$2} /Position:/ {pos=$2} END {print file, pos}' \
        > /backup/logs/binlog_pos_$(date +%F).txt
      
  • 调度与保留
    • 每日全量(示例:02:00):
      0 2 * * * root /usr/local/bin/backup_mysql_full.sh
      
    • 每周保留(示例:周日 03:00 归档上周日全备):
      0 3 * * 0 root /usr/bin/find /backup/daily -maxdepth 1 -type d -mtime -8 -mtime +0 -exec mv {} /backup/weekly/ \;
      
    • 清理过期(示例:保留近7天日常、4周周备、12个月月备):
      0 4 * * * root /usr/bin/find /backup/daily  -mtime +7 -delete
      0 4 * * 0 root /usr/bin/find /backup/weekly -mtime +28 -delete
      0 5 1 * * root /usr/bin/find /backup/monthly -mtime +365 -delete
      
  • 远程/云端副本(可选)
    • 使用rclone同步至对象存储(需预先配置 rclone.conf):
      0 6 * * * root /usr/bin/rclone copy /backup/daily remote:bucket/mysql/daily/ --log-file /backup/logs/rclone_$(date +\%F).log
      
  • 安全建议
    • 避免在命令行中明文写密码,可使用**~/.my.cnf凭据文件(权限600**)或在脚本中通过安全凭据管理注入。

四 恢复流程与演练

  • 逻辑恢复(全量)
    • 基本步骤:
      gunzip < /backup/daily/2026-01-01_02-00-00/full_2026-01-01_02-00-00.sql.gz | \
        mysql --host=127.0.0.1 --user=root --password=YourRootPass
      
    • 校验:对比SHA-256值,抽样查询核心表数据量与一致性。
  • 时间点恢复(PITR)
    • 基本步骤:
      1. 恢复最近一次全量备份(至目标实例/库)。
      2. 重放自该全量备份之后的binlog至故障前的时间点:
        mysqlbinlog --start-datetime="2026-01-01 02:00:00" \
          --stop-datetime="2026-01-01 10:15:00" \
          /var/log/mysql/mysql-bin.00000[1-9]* | mysql --host=127.0.0.1 --user=root --password=YourRootPass
        
  • 演练与验收
    • 建议每季度执行一次恢复演练,记录实际RTO/RPO,校准备份频率与保留策略。

五 监控告警与优化

  • 监控与告警
    • 进程与连通性:监控mysqld存活、备份目录可写、最近一次备份时间与大小异常。
    • 日志与指标:集中采集备份日志,设置失败告警与容量阈值告警。
    • 简单Prometheus示例(需 mysqld_exporter/自定义脚本采集备份状态指标):
      groups:
      - name: backup
        rules:
        - alert: BackupJobFailed
          expr: backup_last_exit{job="mysql_backup"} != 0
          for: 5m
          labels:
            severity: critical
          annotations:
            summary: "MySQL backup job failed"
            description: "Job mysql_backup exit code != 0 for more than 5m"
      
  • 性能与容量优化
    • 选择业务低峰执行备份;大库考虑物理备份增量备份组合。
    • 定期评估binlog与备份存储增长,调整expire_logs_days与保留策略。

0