7步实现Mybatis Mapper全自动数据备份:从定时任务到异常监控

7步实现Mybatis Mapper全自动数据备份:从定时任务到异常监控

【免费下载链接】Mapper Mybatis Common Mapper - Easy to use 【免费下载链接】Mapper 项目地址: 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()));
    }
}

任务执行流程如图所示: mermaid

异常处理与重试机制

使用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/工具类实现全方位监控:

  1. 日志记录:使用框架提供的日志工具记录关键节点
log.info("备份开始: {}", new Date());
log.info("备份完成: {}条记录, 文件大小: {}KB", count, fileSize);
  1. 文件校验:实现备份文件有效性检查
public boolean validateBackupFile(File file) {
    // 1. 检查文件大小 > 0
    // 2. 验证CSV格式正确性
    // 3. 抽样检查数据完整性
    return FileUtil.checkSize(file) && CsvUtil.validateFormat(file);
}
  1. 监控指标:暴露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);

运维最佳实践与常见问题

最佳实践

  1. 备份文件采用"表名_时间戳.csv.gz"命名规范
  2. 定期执行恢复演练(建议每月一次)
  3. 跨区域备份(可结合OSS等对象存储)

常见问题

通过以上7个步骤,已构建起完整的数据备份体系。下期我们将探讨分库分表场景下的分布式备份方案,敬请关注!如有实施问题,可参考README.md的 troubleshooting 章节或提交issue。

【免费下载链接】Mapper Mybatis Common Mapper - Easy to use 【免费下载链接】Mapper 项目地址: https://gitcode.com/gh_mirrors/ma/Mapper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值