一、创建备份用户
[(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; thenlog "错误:无法连接到MariaDB服务器!"exit 1fi
}# 全量备份函数
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_FILEif [ $? -eq 0 ]; thenlog "全量备份成功: ${backup_name}"echo "${target_dir}" > ${BACKUP_DIR}/last_full_backupelselog "全量备份失败!"rm -rf ${target_dir}exit 1fi
}# 增量备份函数
incremental_backup() {local base_dir=$(cat ${BACKUP_DIR}/last_full_backup)if [ -z "$base_dir" ]; thenlog "未找到基准备份,执行全量备份..."full_backupreturnfilocal 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_FILEif [ $? -eq 0 ]; thenlog "增量备份成功: ${backup_name}"elselog "增量备份失败!"rm -rf ${target_dir}exit 1fi
}# 清理旧备份
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}) ]; thenfull_backupelseincremental_backupficlean_old_backupslog "===== 备份完成 ====="
}# 执行主函数
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
六、脚本说明
备份类型:
全量备份:每
FULL_BACKUP_INTERVAL
天执行一次增量备份:基于上次全量备份进行增量备份
自动清理:
自动删除超过
RETENTION_DAYS
天的旧备份
日志记录:
详细记录备份过程到日志文件
控制台和文件双重输出
安全机制:
数据库连接检查
备份失败自动清理残留文件
错误退出机制
七、配置脚本
修改脚本顶部的配置参数(用户名、密码、目录等)
设置合适的备份保留策略
八、首次备份后的目录结构