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