7步实现Mybatis Mapper全自动数据备份:从定时任务到异常监控
【免费下载链接】Mapper Mybatis Common Mapper - Easy to use 项目地址: https://gitcode.com/gh_mirrors/ma/Mapper
你是否遇到过这些数据风险?业务高峰手动导出CSV时误操作删除数据、运维脚本漏执行导致备份断层、恢复时才发现备份文件损坏——使用Mybatis Common Mapper结合Spring定时任务,可构建零代码侵入的数据备份体系。本文将通过7个实操步骤,带你完成从依赖配置到监控告警的全流程实现,最终达成"配置即备份,异常自恢复"的运维目标。
环境准备:依赖配置与参数说明
实现自动备份需引入两个核心依赖:Spring Boot Starter提供定时任务能力,Mybatis Mapper处理数据访问。在spring-boot-starter/pom.xml中确认以下配置:
<dependencies>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
</dependencies>
配置文件application.properties需设置备份路径、保留天数等核心参数,参数说明可参考Spring Boot Starter模块的配置说明图:
关键参数说明:
backup.path=/data/backups- 备份文件存储路径backup.retention-days=7- 文件保留天数backup.cron=0 0 2 * * ?- 每日凌晨2点执行
数据访问层:通用Mapper接口设计
基于Mybatis Common Mapper的BaseMapper.java扩展备份专用接口,支持全量/增量两种导出模式:
public interface BackupMapper<T> extends BaseMapper<T> {
// 全量备份:查询所有记录
@SelectProvider(type = SqlProvider.class, method = "dynamicSQL")
List<T> selectAllForBackup();
// 增量备份:按时间戳查询
@SelectProvider(type = SqlProvider.class, method = "dynamicSQL")
List<T> selectByUpdateTimeAfter(@Param("updateTime") Date updateTime);
}
两种备份策略的对比选择:
| 模式 | 适用场景 | Mapper方法 | 性能特点 |
|---|---|---|---|
| 全量 | 数据量<100万 | selectAllForBackup | 简单可靠,耗时长 |
| 增量 | 数据量大/更新频繁 | selectByUpdateTimeAfter | 需时间戳字段,效率高 |
定时任务实现:Spring Scheduler配置
通过Spring的@Scheduled注解实现定时触发,在spring/src/main/java/tk/mybatis/spring/annotation/MapperScan.java扫描路径下创建任务类:
@Service
public class DataBackupService {
@Autowired
private BackupMapper<Country> countryMapper;
@Autowired
private FileStorageService storageService;
@Scheduled(cron = "${backup.cron}")
public void executeBackup() {
// 1. 获取上次备份时间
Date lastBackupTime = backupRecordService.getLastSuccessTime();
// 2. 执行增量查询
List<Country> data = countryMapper.selectByUpdateTimeAfter(lastBackupTime);
// 3. 存储为CSV文件
String fileName = storageService.saveAsCsv(data);
// 4. 记录备份状态
backupRecordService.save(new BackupRecord(fileName, data.size()));
}
}
任务执行流程如图所示:
异常处理与重试机制
使用MapperException.java捕获数据访问异常,结合Spring的重试注解实现失败自动恢复:
@Retryable(value = MapperException.class, maxAttempts = 3, backoff = @Backoff(delay = 5000))
public void executeBackup() {
try {
// 备份逻辑
} catch (Exception e) {
log.error("备份失败", e);
throw new MapperException("数据备份异常", e);
}
}
@Recover
public void recover(MapperException e) {
alertService.send("备份最终失败", e.getMessage());
}
异常类型及处理策略:
| 异常类型 | 重试次数 | 处理方式 | 告警级别 |
|---|---|---|---|
| 数据库连接超时 | 3次 | 5秒后重试 | P2 |
| 查询超时 | 2次 | 10秒后重试 | P1 |
| 文件写入失败 | 1次 | 切换备用目录 | P0 |
备份监控:日志与校验体系
集成core/src/main/java/tk/mybatis/mapper/util/工具类实现全方位监控:
- 日志记录:使用框架提供的日志工具记录关键节点
log.info("备份开始: {}", new Date());
log.info("备份完成: {}条记录, 文件大小: {}KB", count, fileSize);
- 文件校验:实现备份文件有效性检查
public boolean validateBackupFile(File file) {
// 1. 检查文件大小 > 0
// 2. 验证CSV格式正确性
// 3. 抽样检查数据完整性
return FileUtil.checkSize(file) && CsvUtil.validateFormat(file);
}
- 监控指标:暴露Prometheus指标
@Timed(value = "backup.duration", description = "备份执行时长")
public void executeBackup() { ... }
完整实现案例参考
完整示例代码可参考spring-boot-starter/mapper-spring-boot-samples/模块,包含:
- 多数据源备份配置
- 分表场景处理方案
- 备份文件压缩实现
对于高频更新表,推荐结合weekend/src/main/java/tk/mybatis/mapper/weekend/的Weekend查询构造器实现更灵活的增量策略:
Weekend<Country> weekend = Weekend.of(Country.class);
weekend.weekendCriteria()
.andGreaterThan(Country::getUpdateTime, lastBackupTime);
List<Country> data = countryMapper.selectByExample(weekend);
运维最佳实践与常见问题
最佳实践:
- 备份文件采用"表名_时间戳.csv.gz"命名规范
- 定期执行恢复演练(建议每月一次)
- 跨区域备份(可结合OSS等对象存储)
常见问题:
-
Q: 大表全量备份导致OOM?
A: 使用base/src/main/java/tk/mybatis/mapper/common/RowBoundsMapper.java实现分页查询 -
Q: 如何实现备份文件加密?
A: 集成extra/src/main/java/tk/mybatis/mapper/additional/的加密工具类
通过以上7个步骤,已构建起完整的数据备份体系。下期我们将探讨分库分表场景下的分布式备份方案,敬请关注!如有实施问题,可参考README.md的 troubleshooting 章节或提交issue。
【免费下载链接】Mapper Mybatis Common Mapper - Easy to use 项目地址: https://gitcode.com/gh_mirrors/ma/Mapper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




