备份脚本记录(binlog文件+mysql+mongo)

mysql备份

bash 复制代码
#!/bin/bash

# ===================== 配置区 =====================
MYSQL_USER="xxx"
MYSQL_PASSWORD='xxxxxx'
MYSQL_SOCKET="/tmp/mysql.sock"   # 根据你的实际路径调整
MYSQL_DATA_DIR="/data/mysqldata"

BACKUP_DIR="/data/backup"
OSS_DIR="oss://backups/test/test-mysql/"
DATE=$(date +"%Y-%m-%d")
BACKUP_NAME="mysql_full_${DATE}"
FULL_BACKUP="${BACKUP_DIR}/${BACKUP_NAME}"
ARCHIVE_FILE="${BACKUP_DIR}/${BACKUP_NAME}.tar.gz"
ENC_PASSWORD="wlyy"
ENC_ARCHIVE_FILE="$BACKUP_DIR/${BACKUP_NAME}.tar.gz.enc"
RETENTION_DAYS=3        # 保留最近3天备份
XTABACKUP_LOG="${BACKUP_DIR}/xtrabackup.log"
# ==================================================

# ===================== 函数区 =====================
log() {
    echo "[$(date '+%F %T')] $1" | tee -a "${XTABACKUP_LOG}"
}

do_full_backup() {
    log "开始 MySQL 8.0 XtraBackup 全量备份..."

    # 执行全量备份
    /data/percona-xtrabackup-8.0.34/bin/xtrabackup \
        --backup \
        --target-dir="${FULL_BACKUP}" \
        --user="${MYSQL_USER}" \
        --password="${MYSQL_PASSWORD}" \
        --socket="${MYSQL_SOCKET}" \
        --stream=xbstream |gzip - > ${ARCHIVE_FILE}

    if [ $? -ne 0 ]; then
        log "ERROR: xtrabackup 备份失败"
        rm -rf "${FULL_BACKUP}"
        exit 1
    fi
	# 加密
    openssl enc -aes-256-cbc -salt -pass pass:"${ENC_PASSWORD}" -in ${ARCHIVE_FILE} -out ${ENC_ARCHIVE_FILE}
    # 复制到OSS
    /usr/local/bin/ossutil cp ${ENC_ARCHIVE_FILE} ${OSS_DIR}
    # 删除临时备份目录
    rm -rf "${FULL_BACKUP}"
    log "备份完成: ${ENC_ARCHIVE_FILE}"
}

clean_old_backups() {
    log "清理 ${RETENTION_DAYS} 天前的旧备份..."
    find "${BACKUP_DIR}" -name "mysql_full_*.tar.gz" -mtime +${RETENTION_DAYS} -delete
	find "${BACKUP_DIR}" -name "mysql_full_*.tar.gz.enc" -mtime +${RETENTION_DAYS} -delete
    find "${BACKUP_DIR}" -name "xtrabackup.log" -mtime +30 -delete
}

# ===================== 主流程 =====================
main() {
    log "========== MySQL 8.0 XtraBackup 开始 =========="

    do_full_backup
    clean_old_backups
    
    log "========== MySQL 8.0 XtraBackup 结束 =========="
}

main

mysql的binlog文件

bash 复制代码
#!/bin/bash
set -euo pipefail

##############################
# ====== 配置区 ======
##############################
BINLOG_DIR="/data/mysqldata"
INDEX_FILE="${BINLOG_DIR}/binlog.index"
OSS_DIR="oss://backups/test/test-mysql/"
BACKUP_DIR="/data/backup"
DATE=$(date +"%Y-%m-%d")
TIMESTAMP=$(date '+%Y%m%d_%H%M%S')
TAR_FILE="$BACKUP_DIR/binlog_${DATE}.tar.gz"
LOG_FILE="$BACKUP_DIR/backup_binlog.log"
ENC_PASSWORD="xxxx"
ENC_TAR_FILE="$BACKUP_DIR/binlog_${DATE}.tar.gz.enc"
RETENTION_DAYS=1

##############################
# ====== 函数 ======
##############################
log() {
  echo "[$(date '+%F %T')] $*" | tee -a "$LOG_FILE"
}

cleanup() {
  rm -f "$BACKUP_DIR/binlog.list"
}
trap cleanup EXIT

check_env() {
  if [ ! -f "$INDEX_FILE" ]; then
    log "ERROR: binlog.index not found: $INDEX_FILE"
    exit 1
  fi
  if ! command -v ossutil &>/dev/null; then
    log "ERROR: ossutil not found"
    exit 1
  fi
}

##############################
# ====== 主流程 ======
##############################
check_env

# 1) 读取 index,去掉最后一行(当前 binlog)
OLD_BINLOGS=$(head -n -1 "$INDEX_FILE" || true)

if [ -z "$OLD_BINLOGS" ]; then
  log "No closed binlog to backup (only current active binlog exists)"
  exit 0
fi

# 2) 转成文件名列表(仅 basename)
> "$BACKUP_DIR/binlog.list"
echo "$OLD_BINLOGS" | while read -r path; do
  [ -n "$path" ] && echo "$(basename "$path")" >> "$BACKUP_DIR/binlog.list"
done

COUNT=$(wc -l < "$BACKUP_DIR/binlog.list")
log "Found $COUNT closed binlog(s) to backup"

# 3) 打包
log "Creating archive: $TAR_FILE"
tar -czf "$TAR_FILE" -C "$BINLOG_DIR" \
  --files-from="$BACKUP_DIR/binlog.list"

if [ ! -s "$TAR_FILE" ]; then
  log "ERROR: tar.gz is empty"
  exit 1
fi

log "Archive size: $(du -sh "$TAR_FILE" | awk '{print $1}')"

# 4) 加密

openssl enc -aes-256-cbc -salt -pass pass:"${ENC_PASSWORD}" -in ${TAR_FILE} -out ${ENC_TAR_FILE}

# 5) 上传到 OSS
log "Uploading to ${OSS_DIR}"
/usr/local/bin/ossutil cp ${ENC_TAR_FILE} ${OSS_DIR}

log "Backup SUCCESS: ${OSS_DIR}"

# 6) 可选:清理本地 tar
find "${BACKUP_DIR}" -name "binlog_*.tar.gz" -mtime +${RETENTION_DAYS} -delete
find "${BACKUP_DIR}" -name "binlog_*.tar.gz.enc" -mtime +${RETENTION_DAYS} -delete

log "Done."

mongo备份

bash 复制代码
#!/bin/bash

# ===================== 配置区 =====================
MONGO_HOST="127.0.0.1"
MONGO_PORT="27020"
MONGO_USER="xxx"          # 如无认证留空
MONGO_PASS="xxxx"          # 如无认证留空
MONGO_AUTH_DB="xxxx"  # 认证库

BACKUP_DIR="/data/backup"
OSS_DIR="oss://backups/prod/mongo/"
DATE=$(date +"%Y-%m-%d")
BACKUP_NAME="mongo_backup_${DATE}"
RETENTION_DAYS=3       # 保留最近3天备份
# ==================================================

# ===================== 函数区 =====================
log() {
    echo "[$(date '+%F %T')] $1"
}

do_backup() {
    local backup_path="${BACKUP_DIR}/${BACKUP_NAME}"
    local archive_file="${BACKUP_DIR}/${BACKUP_NAME}.tar.gz"
	local enc_archive_file="${BACKUP_DIR}/${BACKUP_NAME}.tar.gz.enc"

    log "开始备份 MongoDB..."

    # 构造 mongodump 命令
    local cmd="/usr/local/mongodb/bin/mongodump \
        --host ${MONGO_HOST} \
        --port ${MONGO_PORT} \
        --out ${backup_path}"

    # 如果配置了认证
    if [ -n "${MONGO_USER}" ] && [ -n "${MONGO_PASS}" ]; then
        cmd="${cmd} \
            --username ${MONGO_USER} \
            --password ${MONGO_PASS} \
            --authenticationDatabase ${MONGO_AUTH_DB}"
    fi

    # 执行备份
    eval "${cmd}" >> "${BACKUP_DIR}/backup.log" 2>&1
    if [ $? -ne 0 ]; then
        log "ERROR: mongodump 执行失败"
        rm -rf "${backup_path}"
        exit 1
    fi

    # 压缩备份
    log "压缩备份文件..."
    tar -czf "${archive_file}" -C "${BACKUP_DIR}" "${BACKUP_NAME}" >> "${BACKUP_DIR}/backup.log" 2>&1
    if [ $? -ne 0 ]; then
        log "ERROR: 压缩失败"
        exit 1
    fi
	# 加密
    openssl enc -aes-256-cbc -salt -pass pass:"${ENC_PASSWORD}" -in ${archive_file} -out ${enc_archive_file}
    # 复制到OSS
    /usr/local/bin/ossutil cp ${enc_archive_file} ${OSS_DIR} 
    # 删除临时目录
    rm -rf "${backup_path}"
    log "备份完成: ${enc_archive_file}"
}

clean_old_backups() {
    log "清理 ${RETENTION_DAYS} 天前的旧备份..."
    find "${BACKUP_DIR}" -name "mongo_backup_*.tar.gz" -mtime +${RETENTION_DAYS} -delete
	find "${BACKUP_DIR}" -name "mongo_backup_*.tar.gz.enc" -mtime +${RETENTION_DAYS} -delete
    find "${BACKUP_DIR}" -name "backup.log" -mtime +${RETENTION_DAYS} -delete
}

# ===================== 主流程 =====================
main() {
    log "========== MongoDB 备份开始 =========="
    do_backup
    clean_old_backups
    
    log "========== MongoDB 备份结束 =========="
}

main
相关推荐
运维行者_1 小时前
企业无线网络监控的挑战与智能化演进趋势
大数据·运维·服务器·网络·数据库
国强_dev2 小时前
技术探讨:使用 stunnel 加密转发数据库连接时,如何获取客户端真实 IP?
数据库·网络协议·tcp/ip
@insist1232 小时前
系统规划与管理师-信息系统规划核心工作要点解析
数据库·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
超级数据查看器2 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
数安3000天2 小时前
增量数据如何自动分类分级,避免目录“过期“?
大数据·数据库
GitLqr2 小时前
Flutter 3.44 插件内置 Kotlin (KGP) 双向兼容适配指南
android·flutter·dart
南墙上的石头3 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql
画中有画4 小时前
论向量数据库在项目中的应用
数据库
spider_xcxc5 小时前
Redis 数据库高质量实践指南(一)
运维·数据库·redis·oracle·云计算
l1t5 小时前
在linux和windows中解决duckdb 1.6dev版本输出执行计划报错问题
linux·运维·数据库·windows·duckdb