一、为什么需要备份MariaDB数据
数据库是业务系统的核心资产,数据丢失可能导致:
– 业务中断和服务停机
– 用户数据永久丢失
– 法律合规风险
– 经济损失和声誉损害
常见的导致数据丢失的原因包括硬件故障、人为误操作(DROP TABLE)、软件Bug、勒索病毒攻击、自然灾害等。制定完善的备份策略是数据安全的第一道防线。
二、备份方式对比
| 备份方式 | 类型 | 速度 | 占用空间 | 一致性 | 适用场景 |
|---|---|---|---|---|---|
| mysqldump | 逻辑备份 | 较慢 | 小 | 一致 | 小中型数据库 |
| mariabackup | 物理备份 | 快 | 大 | 一致 | 大型数据库 |
| LVM快照 | 物理备份 | 最快 | 大 | 一致 | 需LVM支持 |
| 文件系统复制 | 物理备份 | 快 | 大 | 不一致 | 不推荐 |
三、使用mysqldump逻辑备份
3.1 基本备份命令
# 备份所有数据库
mysqldump -u root -p --all-databases --single-transaction \
--routines --triggers --events | \
gzip > /backup/mariadb/all_db_$(date +%Y%m%d_%H%M%S).sql.gz
# 备份单个数据库
mysqldump -u root -p --single-transaction mydb | \
gzip > /backup/mariadb/mydb_$(date +%Y%m%d).sql.gz
# 备份多个数据库
mysqldump -u root -p --databases db1 db2 db3 | \
gzip > /backup/mariadb/multi_db_$(date +%Y%m%d).sql.gz
# 仅备份表结构
mysqldump -u root -p --no-data mydb > /backup/mariadb/mydb_schema.sql
# 仅备份数据(不含表结构)
mysqldump -u root -p --no-create-info mydb > /backup/mariadb/mydb_data.sql
3.2 关键参数详解
| 参数 | 说明 |
|---|---|
--single-transaction |
InnoDB一致性快照,不锁表 |
--routines |
备份存储过程和函数 |
--triggers |
备份触发器 |
--events |
备份事件调度器 |
--master-data=2 |
记录binlog位置(从库备份) |
--flush-logs |
切换binlog文件 |
--max-allowed-packet=512M |
设置最大包大小 |
3.3 恢复数据
# 恢复所有数据库
gunzip < /backup/mariadb/all_db_20260514.sql.gz | mysql -u root -p
# 恢复单个数据库
gunzip < /backup/mariadb/mydb_20260514.sql.gz | mysql -u root -p mydb
# 从SQL文件直接恢复
mysql -u root -p mydb < /backup/mariadb/mydb_20260514.sql
四、使用mariabackup物理备份
4.1 安装mariabackup
sudo apt update
sudo apt install mariadb-backup -y
4.2 全量备份
# 创建全量备份
sudo mariabackup --backup \
--target-dir=/backup/mariadb/full_$(date +%Y%m%d) \
--user=root --password=YourPassword
# 准备备份(使其一致性)
sudo mariabackup --prepare \
--target-dir=/backup/mariadb/full_20260514
4.3 增量备份
# 第一次增量备份(基于全量)
sudo mariabackup --backup \
--target-dir=/backup/mariadb/incr_1 \
--incremental-basedir=/backup/mariadb/full_20260514 \
--user=root --password=YourPassword
# 第二次增量备份(基于第一次增量)
sudo mariabackup --backup \
--target-dir=/backup/mariadb/incr_2 \
--incremental-basedir=/backup/mariadb/incr_1 \
--user=root --password=YourPassword
4.4 恢复物理备份
# 1. 准备全量备份
sudo mariabackup --prepare --apply-log-only \
--target-dir=/backup/mariadb/full_20260514
# 2. 合并增量备份
sudo mariabackup --prepare --apply-log-only \
--target-dir=/backup/mariadb/full_20260514 \
--incremental-dir=/backup/mariadb/incr_1
sudo mariabackup --prepare \
--target-dir=/backup/mariadb/full_20260514 \
--incremental-dir=/backup/mariadb/incr_2
# 3. 停止MariaDB
sudo systemctl stop mariadb
# 4. 清空数据目录
sudo rm -rf /var/lib/mysql/*
# 5. 恢复数据
sudo mariabackup --copy-back \
--target-dir=/backup/mariadb/full_20260514
# 6. 修复权限
sudo chown -R mysql:mysql /var/lib/mysql
# 7. 启动MariaDB
sudo systemctl start mariadb
五、自动化备份脚本
5.1 完整备份脚本
#!/bin/bash
# MariaDB自动备份脚本
# 保存到 /usr/local/bin/mariadb_backup.sh
BACKUP_DIR="/backup/mariadb"
RETAIN_DAYS=7
DB_USER="root"
DB_PASS="YourPassword"
LOG_FILE="/var/log/mariadb_backup.log"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 记录日志
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}
# 全量备份(使用mariabackup)
full_backup() {
log "开始全量备份..."
sudo mariabackup --backup \
--target-dir=$BACKUP_DIR/full_$DATE \
--user=$DB_USER --password=$DB_PASS 2>> $LOG_FILE
if [ $? -eq 0 ]; then
log "全量备份完成: full_$DATE"
# 压缩备份
tar -czf $BACKUP_DIR/full_$DATE.tar.gz \
-C $BACKUP_DIR full_$DATE 2>> $LOG_FILE
rm -rf $BACKUP_DIR/full_$DATE
log "压缩完成: full_$DATE.tar.gz"
else
log "全量备份失败!"
fi
}
# 逻辑备份(使用mysqldump)
logical_backup() {
log "开始逻辑备份..."
mysqldump -u $DB_USER -p$DB_PASS \
--all-databases --single-transaction \
--routines --triggers --events | \
gzip > $BACKUP_DIR/logical_$DATE.sql.gz 2>> $LOG_FILE
if [ $? -eq 0 ]; then
log "逻辑备份完成: logical_$DATE.sql.gz"
else
log "逻辑备份失败!"
fi
}
# 清理过期备份
cleanup() {
log "清理${RETAIN_DAYS}天前的备份..."
find $BACKUP_DIR -name "*.gz" -mtime +$RETAIN_DAYS -delete >> $LOG_FILE 2>&1
find $BACKUP_DIR -name "*.tar.gz" -mtime +$RETAIN_DAYS -delete >> $LOG_FILE 2>&1
log "清理完成"
}
# 执行备份
logical_backup
cleanup
log "备份任务结束"
5.2 设置定时任务
# 编辑crontab
sudo crontab -e
# 每天凌晨2点执行逻辑备份
0 2 * * * /usr/local/bin/mariadb_backup.sh
# 每周日凌晨3点执行全量物理备份
0 3 * * 0 /usr/local/bin/mariadb_backup_full.sh
六、远程备份策略
6.1 通过rsync同步到远程服务器
# 同步备份到远程服务器
rsync -avz --delete \
/backup/mariadb/ user@remote-server:/backup/mariadb/
# 添加到crontab(每天4点同步)
0 4 * * * rsync -avz /backup/mariadb/ user@remote-server:/backup/mariadb/
6.2 上传到云存储
# 上传到S3兼容存储
aws s3 sync /backup/mariadb/ s3://my-bucket/mariadb-backup/
# 上传到本地MinIO
mc mirror /backup/mariadb/ minio/mariadb-backup/
七、备份验证
7.1 自动验证脚本
#!/bin/bash
# 验证备份文件完整性
BACKUP_DIR="/backup/mariadb"
LOG_FILE="/var/log/mariadb_backup_verify.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}
# 验证gzip文件
for f in $BACKUP_DIR/*.sql.gz; do
if gzip -t "$f" 2>/dev/null; then
log "验证通过: $f"
else
log "验证失败: $f"
fi
done
# 验证tar.gz文件
for f in $BACKUP_DIR/*.tar.gz; do
if tar -tzf "$f" > /dev/null 2>&1; then
log "验证通过: $f"
else
log "验证失败: $f"
fi
done
7.2 定期恢复测试
建议每月至少进行一次完整的恢复测试:
1. 在测试环境恢复备份
2. 验证数据完整性
3. 检查存储过程和触发器
4. 记录恢复时间
八、安全建议
-
加密备份文件:使用GPG加密敏感数据
bash
gzip < backup.sql | gpg --symmetric --cipher-algo AES256 -o backup.sql.gz.gpg -
限制备份文件权限:
bash
chmod 600 /backup/mariadb/*.gz
chown root:root /backup/mariadb/*.gz -
3-2-1备份原则:
- 3份数据副本
- 2种不同存储介质
-
1份异地存储
-
定期监控备份状态:检查日志、验证文件大小和时间戳
总结
| 备份方案 | 频率 | 方式 | 保留时间 |
|---|---|---|---|
| 逻辑备份 | 每日 | mysqldump | 7天 |
| 物理全量 | 每周 | mariabackup | 4周 |
| 物理增量 | 每日 | mariabackup | 7天 |
| 远程同步 | 每日 | rsync/S3 | 30天 |
关键原则:
– 备份必须自动化,不能依赖手动操作
– 定期验证备份的可用性
– 遵循3-2-1备份原则
– 加密敏感备份文件
– 记录详细日志
注:本文基于MariaDB 11.4和Debian 12编写,请根据实际环境调整配置。