备份脚本记录(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 小时前
MySQL---数据类型
数据库·mysql
Nturmoils1 小时前
分页别写太顺手,LIMIT 背后还有排序和边界
数据库·后端
小饕1 小时前
RAG学习之【向量数据库】Milvus 从入门到精通:索引、检索、混合搜索一篇打通(RAG 必备)
数据库·人工智能·学习·milvus
私人珍藏库2 小时前
[Android] 视频下载鸟 v20.02 会员
android·人工智能·智能手机·app·工具·多功能
kisdiem2 小时前
RAG ENGINEERING · 中文教程从文档到可靠答案
数据库
zh_xuan2 小时前
tv浏览网页工具
android·tv浏览网页
SilentSamsara2 小时前
向量数据库实战:Chroma/Milvus/Qdrant 选型与语义搜索应用
开发语言·数据库·人工智能·python·青少年编程·milvus
沪漂阿龙3 小时前
LangChain 系列之Agent:从固定流程到模型自主决策
服务器·数据库·langchain
zh_xuan3 小时前
PC端操作SQLite数据库
数据库·c++·sqlite