开心哥教你用SpringBoot轻松备份数据库
springboot实现备份数据库

首页 2025-09-02 19:17:26

今天,开心哥在小米科技园里溜达,突然接到运维小伙伴的紧急呼叫:“哥!数据库要备份,线上数据嗷嗷待哺!”开心哥一听,嘴角不由自主上扬——这事儿,太简单!他三步并作两步冲进工位,啪地一声合上保温杯,打开IDEA,手指在键盘上飞舞,像极了发布会上的激光笔。
“兄弟们,看好了,SpringBoot实现备份数据库,只要五分钟,咱们不加班!”开心哥一边说着,一边在pom.xml里潇洒地落下几行依赖:
xml
复制

[/span>dependency
    [/span>groupIdorg.apache.commonsgroupId
    [/span>artifactIdcommons-execartifactId
    [/span>version1.3version
dependency
接着,他在application.yml里潇洒地配置:
yaml
复制
backup:
  host: 127.0.0.1
  port: 3306
  user: root
  password: 123456
  database: mydb
  path: /data/backup
代码更简洁,开心哥撸起袖子,新建BackupService,十行代码搞定核心逻辑:
java
复制
@Service
public class BackupService {
    @Value("${backup.host}") private String host;
    @Value("${backup.user}") private String user;
    @Value("${backup.password}") private String pwd;
    @Value("${backup.database}") private String db;
    @Value("${backup.path}") private String path;

    public String backup() throws IOException {
        String file = path + "/" + db + "_" + LocalDate.now() + ".sql";
        String cmd = String.format("mysqldump -h%s -u%s -p%s %s > %s",
                                   host, user, pwd, db, file);
        CommandLine cli = CommandLine.parse(cmd);
        DefaultExecutor exec = new DefaultExecutor();
        exec.execute(cli);
        return "备份成功,文件路径:" + file;
    }
}
开心哥再顺手写个REST接口,方便前端点点按钮就能触发:
java
复制
@RestController
@RequestMapping("/db")
@RequiredArgsConstructor
public class BackupController {
    private final BackupService backupService;

    @PostMapping("/backup")
    public String backup() {
        try {
            return backupService.backup();
        } catch (IOException e) {
            return "备份失败:" + e.getMessage();
        }
    }
}
项目一启动,开心哥打开Postman,轻轻一点“Send”,终端里刷地跑起mysqldump。十秒后,备份文件乖乖躺在/data/backup目录,文件名还带着日期,像极了给数据拍了一张高清证件照。开心哥一拍桌子:“稳了!”运维小伙伴在旁边鼓掌,整个办公室都洋溢着下班的气息。
开心哥最后补了一句:“记住,核心就两步——配好命令、调通接口。剩下的,就是让代码自己跑,咱们去喝酸奶!”众人哄堂大笑,仿佛又听见那句熟悉的“Are you OK?”——虽然今天的主角不是那首神曲,但快乐依旧传染了整层楼。

教程:SpringBoot实现备份数据库的完整步骤
目标
在SpringBoot项目里,通过调用系统命令mysqldump,把MySQL数据库定时或手动备份到本地磁盘。
一、准备工作
  1. 安装MySQL并确保mysqldump可用(命令行输入mysqldump -V能看到版本)。
  2. 新建SpringBoot项目(Spring Initializr勾选Web模块即可)。
  3. 在服务器或本机创建备份目录,如/data/backup
二、引入依赖
pom.xml加入Apache Commons Exec,用于安全地执行外部命令:
xml
复制
[/span>dependency
    [/span>groupIdorg.apache.commonsgroupId
    [/span>artifactIdcommons-execartifactId
    [/span>version1.3version
dependency
三、配置文件
application.yml中集中管理数据库与备份路径:
yaml
复制
backup:
  host: 127.0.0.1
  port: 3306
  user: root
  password: 123456
  database: testdb
  path: /data/backup
四、核心服务类
创建BackupService.java,负责拼接mysqldump命令并执行:
java
复制
@Service
public class BackupService {

    @Value("${backup.host}")
    private String host;
    @Value("${backup.user}")
    private String user;
    @Value("${backup.password}")
    private String password;
    @Value("${backup.database}")
    private String database;
    @Value("${backup.path}")
    private String backupPath;

    public String backup() throws IOException {
        String date = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE); // yyyyMMdd
        String fileName = String.format("%s/%s_%s.sql", backupPath, database, date);
        String cmd = String.format("mysqldump -h%s -u%s -p%s %s --result-file=%s",
                                   host, user, password, database, fileName);
        CommandLine commandLine = CommandLine.parse(cmd);
        DefaultExecutor executor = new DefaultExecutor();
        executor.execute(commandLine);
        return "备份完成,文件:" + fileName;
    }
}
五、暴露接口
创建BackupController.java,通过POST请求触发备份:
java
复制
@RestController
@RequestMapping("/api/db")
@RequiredArgsConstructor
public class BackupController {
    private final BackupService backupService;

    @PostMapping("/backup")
    public Map[/span>String, String backup() {
        Map[/span>String, String result = new HashMap[/span>();
        try {
            String msg = backupService.backup();
            result.put("status", "success");
            result.put("message", msg);
        } catch (Exception e) {
            result.put("status", "fail");
            result.put("message", e.getMessage());
        }
        return result;
    }
}
六、测试
  1. 启动项目。
  2. 打开Postman或curl:curl -X POST http://localhost:8080/api/db/backup
  3. 查看/data/backup目录,应生成testdb_20250902.sql(日期以当天为准)。
七、定时任务(可选)
如果想每天凌晨2点自动备份,在启动类上加@EnableScheduling,再新建:
java
复制
@Component
@RequiredArgsConstructor
public class BackupTask {
    private final BackupService backupService;

    @Scheduled(cron = "0 0 2 * * ?")
    public void autoBackup() throws IOException {
        backupService.backup();
    }
}
八、常见问题
  • 中文乱码:在mysqldump命令后加--default-character-set=utf8mb4
  • 权限不足:确保运行SpringBoot的系统账号对/data/backup有读写权限。
  • mysqldump找不到:在Windows需把MySQL bin目录加入PATH,或在命令里写绝对路径。
至此,一个可手动、可定时、可扩展的数据库备份功能就全部跑通。打开浏览器,一键备份,再也不用熬夜敲命令行,让数据安全与下班自由同时拥有!
MySQL连接就这么简单!本地远程、编程语言连接方法一网打尽
还在为MySQL日期计算头疼?这份加一天操作指南能解决90%问题
MySQL日志到底在哪里?Linux/Windows/macOS全平台查找方法在此
MySQL数据库管理工具全景评测:从Workbench到DBeaver的技术选型指南
MySQL密码忘了怎么办?这份重置指南能救急,Windows/Linux/Mac都适用
你的MySQL为什么经常卡死?可能是锁表在作怪!快速排查方法在此
MySQL单表卡爆怎么办?从策略到实战,一文掌握「分表」救命技巧
清空MySQL数据表千万别用错!DELETE和TRUNCATE这个区别可能导致重大事故
你的MySQL中文排序一团糟?记住这几点,轻松实现准确拼音排序!
别再混淆Hive和MySQL了!读懂它们的天壤之别,才算摸到大数据的门道