Skip to content

MariaDB 备份实施与验证

备份工具选择与使用

mariabackup

工具简介

mariabackup 是 MariaDB 官方推荐的物理备份工具,基于 Percona XtraBackup 开发,支持热备份、增量备份和压缩备份,适用于大规模数据库。

版本差异

  • MariaDB 10.1+:内置 mariabackup 工具
  • MariaDB 10.5+:支持 Zstandard (zstd) 压缩
  • MariaDB 10.6+:支持并行备份和恢复

全量备份实施

bash
# 创建备份目录
mkdir -p /backup/mariadb/full/$(date +%Y%m%d_%H%M%S)

# 执行全量备份
mariabackup --backup \
  --target-dir=/backup/mariadb/full/$(date +%Y%m%d_%H%M%S) \
  --user=backup_user \
  --password=backup_password \
  --parallel=4 \
  --compress=zstd \
  --compress-threads=4

# 准备备份(用于恢复前的一致性检查)
mariabackup --prepare \
  --target-dir=/backup/mariadb/full/$(date +%Y%m%d_%H%M%S) \
  --parallel=4

增量备份实施

bash
# 创建增量备份目录
mkdir -p /backup/mariadb/incremental/$(date +%Y%m%d_%H%M%S)

# 基于最近的全量备份创建增量备份
mariabackup --backup \
  --target-dir=/backup/mariadb/incremental/$(date +%Y%m%d_%H%M%S) \
  --incremental-basedir=/backup/mariadb/full/latest \
  --user=backup_user \
  --password=backup_password \
  --parallel=4 \
  --compress=zstd

# 准备增量备份(合并到全量备份)
mariabackup --prepare \
  --target-dir=/backup/mariadb/full/latest \
  --incremental-dir=/backup/mariadb/incremental/$(date +%Y%m%d_%H%M%S) \
  --parallel=4

mysqldump

工具简介

mysqldump 是 MariaDB 自带的逻辑备份工具,生成 SQL 格式的备份文件,适用于小型数据库和单表备份。

版本差异

  • MariaDB 10.2+:支持并行导出(--parallel 选项)
  • MariaDB 10.5+:支持压缩输出直接写入文件

全量备份实施

bash
# 备份所有数据库
mysqldump --single-transaction \
  --routines --triggers --events \
  --user=backup_user \
  --password=backup_password \
  --all-databases \
  | gzip > /backup/mariadb/full_$(date +%Y%m%d_%H%M%S).sql.gz

# 备份单个数据库
mysqldump --single-transaction \
  --routines --triggers --events \
  --user=backup_user \
  --password=backup_password \
  mydatabase \
  | gzip > /backup/mariadb/mydatabase_$(date +%Y%m%d_%H%M%S).sql.gz

# 使用并行导出(10.2+)
mysqldump --single-transaction \
  --routines --triggers --events \
  --user=backup_user \
  --password=backup_password \
  --parallel=4 \
  mydatabase \
  > /backup/mariadb/mydatabase_parallel_$(date +%Y%m%d_%H%M%S).sql

mydumper

工具简介

mydumper 是一个高性能的逻辑备份工具,支持并行备份和恢复,适用于中大型数据库。

安装方法

bash
# CentOS/RHEL
yum install mydumper -y

# Ubuntu/Debian
apt-get install mydumper -y

备份实施

bash
# 执行并行备份
mydumper \
  --user=backup_user \
  --password=backup_password \
  --outputdir=/backup/mariadb/mydumper_$(date +%Y%m%d_%H%M%S) \
  --threads=8 \
  --compress \
  --lock-all-tables \
  --build-empty-files \
  --verbose=3

备份实施流程

1. 备份前准备

  • 检查数据库状态:确保数据库运行正常,无严重错误
  • 验证备份用户权限:确保备份用户具有所需权限
  • 检查磁盘空间:确保备份目标位置有足够空间
  • 测试网络连接:如果备份到远程服务器,确保网络稳定

2. 执行备份

  • 选择合适的备份类型:根据 RTO/RPO 要求选择全量、增量或差异备份
  • 使用正确的备份工具:根据数据库大小和需求选择 mariabackup、mysqldump 或 mydumper
  • 设置合理的并行度:根据 CPU 核心数设置并行备份线程数
  • 启用压缩:减少备份文件大小,节省存储空间

3. 备份后处理

  • 验证备份完整性:执行备份验证操作
  • 记录备份信息:记录备份时间、大小、类型、状态等信息
  • 更新备份元数据:更新备份目录的符号链接(如 latest 指向最新备份)
  • 清理过期备份:根据备份保留策略清理旧备份

备份验证方法

物理备份验证

1. 一致性检查

bash
# 使用 mariabackup 验证备份完整性
mariabackup --prepare \
  --target-dir=/backup/mariadb/full/latest \
  --check

# 检查备份文件大小和数量
ls -la /backup/mariadb/full/latest

2. 恢复测试

bash
# 创建测试恢复目录
mkdir -p /restore/test

# 解压备份(如果压缩)
mariabackup --decompress \
  --target-dir=/backup/mariadb/full/latest \
  --parallel=4

# 恢复到测试目录
mariabackup --copy-back \
  --target-dir=/backup/mariadb/full/latest \
  --datadir=/restore/test \
  --parallel=4

# 检查恢复后的文件
ls -la /restore/test

逻辑备份验证

1. SQL 文件语法检查

bash
# 使用 mysqlcheck 检查 SQL 文件语法
mysql --force < /backup/mariadb/mydatabase_20231227_120000.sql > /dev/null

# 检查返回值
if [ $? -eq 0 ]; then
  echo "SQL 文件语法正确"
else
  echo "SQL 文件语法错误"
fi

2. 表结构验证

bash
# 提取备份文件中的表结构
grep -A 20 "CREATE TABLE" /backup/mariadb/mydatabase_20231227_120000.sql | head -50

# 比较表数量
backup_table_count=$(grep -c "CREATE TABLE" /backup/mariadb/mydatabase_20231227_120000.sql)
live_table_count=$(mysql -u backup_user -pbackup_password -e "USE mydatabase; SHOW TABLES;" | wc -l)

if [ $((backup_table_count)) -eq $((live_table_count-1)) ]; then
  echo "表数量一致"
else
  echo "表数量不一致:备份 $backup_table_count 个,在线 $((live_table_count-1)) 个"
fi

3. 数据量验证

bash
# 检查关键表的数据行数
# 方法1:从备份文件中统计INSERT语句数
grep -c "INSERT INTO `users`" /backup/mariadb/mydatabase_20231227_120000.sql

# 方法2:恢复到测试库后验证
mysql -u test_user -ptest_password -e "USE test_mydatabase; SELECT COUNT(*) FROM users;"

备份自动化脚本

全量备份脚本

bash
#!/bin/bash

# 配置参数
BACKUP_USER="backup_user"
BACKUP_PASSWORD="backup_password"
BACKUP_DIR="/backup/mariadb"
DATE=$(date +%Y%m%d_%H%M%S)
FULL_BACKUP_DIR="$BACKUP_DIR/full/$DATE"
LOG_FILE="$BACKUP_DIR/backup_$DATE.log"
PARALLEL=4
COMPRESS_TYPE="zstd"

# 创建备份目录
mkdir -p $FULL_BACKUP_DIR

# 执行全量备份
echo "$(date) - 开始全量备份" >> $LOG_FILE

mariabackup --backup \
  --target-dir=$FULL_BACKUP_DIR \
  --user=$BACKUP_USER \
  --password=$BACKUP_PASSWORD \
  --parallel=$PARALLEL \
  --compress=$COMPRESS_TYPE \
  --compress-threads=$PARALLEL >> $LOG_FILE 2>&1

if [ $? -eq 0 ]; then
  echo "$(date) - 全量备份成功" >> $LOG_FILE
  
  # 准备备份
  mariabackup --prepare \
    --target-dir=$FULL_BACKUP_DIR \
    --parallel=$PARALLEL >> $LOG_FILE 2>&1
  
  if [ $? -eq 0 ]; then
    echo "$(date) - 备份准备成功" >> $LOG_FILE
    
    # 更新latest链接
    rm -f $BACKUP_DIR/full/latest
    ln -s $FULL_BACKUP_DIR $BACKUP_DIR/full/latest
    
    # 清理7天前的全量备份
    find $BACKUP_DIR/full -type d -mtime +7 -exec rm -rf {} \;
    echo "$(date) - 旧备份清理完成" >> $LOG_FILE
  else
    echo "$(date) - 备份准备失败" >> $LOG_FILE
    exit 1
  fi
else
  echo "$(date) - 全量备份失败" >> $LOG_FILE
  exit 1
fi

echo "$(date) - 全量备份任务完成" >> $LOG_FILE

增量备份脚本

bash
#!/bin/bash

# 配置参数
BACKUP_USER="backup_user"
BACKUP_PASSWORD="backup_password"
BACKUP_DIR="/backup/mariadb"
DATE=$(date +%Y%m%d_%H%M%S)
INCR_BACKUP_DIR="$BACKUP_DIR/incremental/$DATE"
FULL_BACKUP_DIR="$BACKUP_DIR/full/latest"
LOG_FILE="$BACKUP_DIR/backup_$DATE.log"
PARALLEL=4
COMPRESS_TYPE="zstd"

# 创建增量备份目录
mkdir -p $INCR_BACKUP_DIR

# 执行增量备份
echo "$(date) - 开始增量备份" >> $LOG_FILE

mariabackup --backup \
  --target-dir=$INCR_BACKUP_DIR \
  --incremental-basedir=$FULL_BACKUP_DIR \
  --user=$BACKUP_USER \
  --password=$BACKUP_PASSWORD \
  --parallel=$PARALLEL \
  --compress=$COMPRESS_TYPE \
  --compress-threads=$PARALLEL >> $LOG_FILE 2>&1

if [ $? -eq 0 ]; then
  echo "$(date) - 增量备份成功" >> $LOG_FILE
  
  # 合并到全量备份
  mariabackup --prepare \
    --target-dir=$FULL_BACKUP_DIR \
    --incremental-dir=$INCR_BACKUP_DIR \
    --parallel=$PARALLEL >> $LOG_FILE 2>&1
  
  if [ $? -eq 0 ]; then
    echo "$(date) - 增量备份合并成功" >> $LOG_FILE
    
    # 清理3天前的增量备份
    find $BACKUP_DIR/incremental -type d -mtime +3 -exec rm -rf {} \;
    echo "$(date) - 旧增量备份清理完成" >> $LOG_FILE
  else
    echo "$(date) - 增量备份合并失败" >> $LOG_FILE
    exit 1
  fi
else
  echo "$(date) - 增量备份失败" >> $LOG_FILE
  exit 1
fi

echo "$(date) - 增量备份任务完成" >> $LOG_FILE

备份监控与告警

监控指标

指标名称监控方法告警阈值
备份成功率检查备份日志和返回值连续2次备份失败
备份完成时间检查备份结束时间超过预期时间2倍
备份文件大小对比历史备份大小与平均值差异超过30%
备份验证结果检查验证日志验证失败
备份保留数量检查备份目录文件数少于预期保留数量

告警方式

  • 邮件告警:通过 cron 作业和 mail 命令发送告警邮件
  • 监控系统集成:将备份状态推送到 Prometheus、Zabbix 等监控系统
  • 即时通讯告警:通过 Slack、钉钉、企业微信等发送告警通知

常见问题(FAQ)

Q1: mariabackup 备份失败,提示权限不足?

A: 确保备份用户具有以下权限:

sql
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, PROCESS ON *.* TO 'backup_user'@'localhost' IDENTIFIED BY 'backup_password';

同时确保备份目录的权限正确:

bash
chown -R mysql:mysql /backup/mariadb
chmod -R 700 /backup/mariadb

Q2: mysqldump 备份大数据库时占用太多内存?

A: 可以使用以下参数优化内存使用:

bash
mysqldump --single-transaction \
  --quick \
  --max_allowed_packet=128M \
  --net_buffer_length=8K \
  mydatabase > backup.sql

Q3: 如何验证压缩备份的完整性?

A: 对于 gzip 压缩的备份,可以使用以下命令:

bash
gzip -t backup.sql.gz

对于 mariabackup 的压缩备份,可以使用 --decompress 参数解压验证:

bash
mariabackup --decompress --target-dir=/backup/mariadb/full/latest

Q4: 备份过程中如何减少对生产数据库的影响?

A: 可以采取以下措施:

  • 在业务低峰期执行备份
  • 使用增量备份减少备份时间
  • 限制备份工具的并行度和资源使用
  • 使用从库进行备份,避免影响主库
  • 调整 innodb_io_capacity 参数优化 I/O 性能

Q5: 如何自动验证备份的有效性?

A: 可以在备份脚本中添加验证步骤:

  • 对于物理备份,执行 mariabackup --prepare --check
  • 对于逻辑备份,使用 mysql --force 检查 SQL 语法
  • 定期执行恢复测试,验证备份可以正常恢复
  • 使用校验和工具验证备份文件完整性

最佳实践

  1. 定期备份:根据业务需求制定合理的备份频率
  2. 混合备份策略:结合全量备份和增量备份,平衡备份时间和恢复时间
  3. 备份验证:每次备份后都要验证备份的完整性和可用性
  4. 多重存储:将备份存储在不同位置,避免单点故障
  5. 自动化管理:使用脚本自动化备份、验证、清理和监控
  6. 文档化:详细记录备份策略、实施步骤和恢复流程
  7. 定期演练:至少每季度进行一次恢复演练,确保备份可用于生产环境
  8. 权限控制:严格控制备份文件的访问权限,避免数据泄露

通过以上备份实施与验证流程,可以确保 MariaDB 数据库的备份数据可靠、可用,为数据库的灾难恢复提供有力保障。