mariadb10.3.35备份脚本

发布于:2025-08-05 ⋅ 阅读:(13) ⋅ 点赞:(0)

一、创建备份用户

[(none)]> create user 'buser'@'localhost' identified by 'tmrQ';

[(none)]> GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'buser'@'localhost';

[(none)]> flush privileges;

二、脚本

# cat mysql_bask.sh 
#!/bin/bash
# MariaDB 10.3.35 Backup Script
# 支持全量备份 + 增量备份 + 自动清理
# 使用前请配置以下变量

# ===== 配置区域 =====
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"  # 日志文件路径
# ===================

# 创建必要目录
mkdir -p ${BACKUP_DIR}/{full,incr} &> /dev/null

# 日志记录函数
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}

# 数据库连接检查
check_db_connection() {
    if ! mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} -e "SHOW STATUS;" &> /dev/null; then
        log "错误:无法连接到MariaDB服务器!"
        exit 1
    fi
}

# 全量备份函数
full_backup() {
    local backup_name="full-$(date +%Y%m%d_%H%M%S)"
    local target_dir="${BACKUP_DIR}/full/${backup_name}"
    
    log "开始全量备份: ${backup_name}"
    mariabackup --backup \
        --user=${MYSQL_USER} \
        --password=${MYSQL_PASSWORD} \
        --target-dir=${target_dir} 2>> $LOG_FILE
    
    if [ $? -eq 0 ]; then
        log "全量备份成功: ${backup_name}"
        echo "${target_dir}" > ${BACKUP_DIR}/last_full_backup
    else
        log "全量备份失败!"
        rm -rf ${target_dir}
        exit 1
    fi
}

# 增量备份函数
incremental_backup() {
    local base_dir=$(cat ${BACKUP_DIR}/last_full_backup)
    if [ -z "$base_dir" ]; then
        log "未找到基准备份,执行全量备份..."
        full_backup
        return
    fi

    local backup_name="incr-$(date +%Y%m%d_%H%M%S)"
    local target_dir="${BACKUP_DIR}/incr/${backup_name}"
    
    log "开始增量备份: ${backup_name}"
    log "基准备份: $(basename ${base_dir})"
    
    mariabackup --backup \
        --user=${MYSQL_USER} \
        --password=${MYSQL_PASSWORD} \
        --target-dir=${target_dir} \
        --incremental-basedir=${base_dir} 2>> $LOG_FILE
    
    if [ $? -eq 0 ]; then
        log "增量备份成功: ${backup_name}"
    else
        log "增量备份失败!"
        rm -rf ${target_dir}
        exit 1
    fi
}

# 清理旧备份
clean_old_backups() {
    log "清理超过${RETENTION_DAYS}天的备份..."
    find ${BACKUP_DIR}/full -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} +
    find ${BACKUP_DIR}/incr -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} +
}

# 主执行逻辑
main() {
    log "===== 备份开始 ====="
    check_db_connection
    
    # 检查是否需要全量备份
    if [ ! -f "${BACKUP_DIR}/last_full_backup" ] || \
       [ $(find "${BACKUP_DIR}/last_full_backup" -mtime +${FULL_BACKUP_INTERVAL}) ]; then
        full_backup
    else
        incremental_backup
    fi

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

# 执行主函数
main

三、添加执行权限

# chmode +x mysql_bask.sh

四、配置任务计划

# crontab -l
0 4 * * * /usr/bin/sh /opt/scripts/mysql_bask.sh

五、恢复步骤

5.1 全量备份恢复

mariabackup --copy-back --target-dir=/backup/mariadb/full/full-YYYYMMDD_HHMMSS

5.2 增量备份恢复

# 先恢复全量备份
mariabackup --copy-back --target-dir=/backup/mariadb/full/base_backup

# 再应用增量备份
mariabackup --copy-back --target-dir=/backup/mariadb/full/base_backup \
    --incremental-dir=/backup/mariadb/incr/incr_backup_dir

六、脚本说明

  1. 备份类型

    • 全量备份:每 FULL_BACKUP_INTERVAL 天执行一次

    • 增量备份:基于上次全量备份进行增量备份

  2. 自动清理

    • 自动删除超过 RETENTION_DAYS 天的旧备份

  3. 日志记录

    • 详细记录备份过程到日志文件

    • 控制台和文件双重输出

  4. 安全机制

    • 数据库连接检查

    • 备份失败自动清理残留文件

    • 错误退出机制

 七、配置脚本

  • 修改脚本顶部的配置参数(用户名、密码、目录等)

  • 设置合适的备份保留策略

八、首次备份后的目录结构

 


网站公告

今日签到

点亮在社区的每一天
去签到