一、创建备份用户
[(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
六、脚本说明
备份类型:
全量备份:每
FULL_BACKUP_INTERVAL
天执行一次增量备份:基于上次全量备份进行增量备份
自动清理:
自动删除超过
RETENTION_DAYS
天的旧备份
日志记录:
详细记录备份过程到日志文件
控制台和文件双重输出
安全机制:
数据库连接检查
备份失败自动清理残留文件
错误退出机制
七、配置脚本
修改脚本顶部的配置参数(用户名、密码、目录等)
设置合适的备份保留策略
八、首次备份后的目录结构