spring boot使用Scheduled实现定时备份mysql数据库

5 篇文章 0 订阅
4 篇文章 0 订阅

一.application.properties文件配置

在application.properties文件中保存基本配置

#数据库备份需要配置
#数据库名称
spring.datasource.dbName=xx
#备份文件保存位置
spring.datasource.backupPath=xx
#主机IP
spring.datasource.ip=xx
#端口
spring.datasource.port=xx
#mysql安装目录bin
# D:/04.mysql/mysql-8.0.22-winx64/bin/  bin后需要加 / 分隔符
spring.datasource.mysqlpath=xx

二. application启动类

在启动类中添加 @EnableScheduling 注解开启springboot定时任务
(pom.xml添加定时任务依赖,此处不做提供)

@SpringBootApplication
@EnableScheduling   // 定时任务
public class AskApplication {
    private static final Logger logger = LoggerFactory.getLogger(AskApplication.class);
    public static void main(String[] args) {
        SpringApplication.run(AskApplication.class, args);
        logger.info("========================启动完毕========================");
    }
}

三. 类实现SchedulingConfigurer编写定时任务

  1. 定义类实现SchedulingConfigurer 接口, 重写 public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) 方法.
  2. 定义定时执行时间cron, 获取properties文件基本数据
  3. 编写mysql备份方法.
package com.jz.ask.service;

import com.jz.ask.common.utils.io.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 数据库定时备份service
 * @author ZhaoRenHui
 * @date 2020-11-25 14:41
 */
@Service
public class MysqldumpService  implements SchedulingConfigurer {
// 设置定时cron时间
    private static final String cron = "0 55 * * * ?";
    
// 获取properties文件中 数据备份需要的基本数据
    @Value("${spring.datasource.backupPath}")
    private String backupPath;

    @Value("${spring.datasource.dbName}")
    private String dbName;

    @Value("${spring.datasource.username}")
    private String name;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${spring.datasource.ip}")
    private String ip;

    @Value("${spring.datasource.port}")
    private String port;

    @Value("${spring.datasource.mysqlpath}")
    private String mysqlPath;

// 重写方法, 开启定时任务
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        scheduledTaskRegistrar.addTriggerTask(()->{
            //定时执行的方法 , 定时进行数据库备份
            System.out.println("数据库开始备份...");
            mysqldump(backupPath,dbName,ip,port,name,password,mysqlPath);

        },(triggerContext) -> { // 定时触发器
        // 设置定时任务执行时间
            CronTrigger trigger = new CronTrigger(cron);
            Date nextExecutionTime = trigger.nextExecutionTime(triggerContext);
            System.out.println(nextExecutionTime);
            return nextExecutionTime;
        });
    }

  /**
     *  mysql数据库备份方法
     * @param backupPath  备份文件存放目录
     * @param dbName  数据库名称 (如有多个自行修改添加)
     * @param ip      数据库主机ip
     * @param port    数据库端口
     * @param name    用户
     * @param password  密码
     * @param mysqlPath   mysql安装bin目录
     */
    public void  mysqldump(String backupPath,String dbName,String ip,String port,String name,String password,String mysqlPath){
//        1,判断备份文件目录是否存在
        File file = new File(backupPath);
        if(!file.exists()){
            file.mkdir();
        }
//        2, 创建需要保存的文件
        String dateStr = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
//        File.separator  文件路径分隔符
        File dataFile = new File(file + File.separator + dateStr + dbName + ".sql");
        if(dataFile.exists()){
            System.out.println("文件名已存在");
            return;
        }
//   3, 进行数据库备份
//        拼接cmd命令
        try {
//            3.1 获取cmd并执行备份语句
            String smtp = mysqlPath + "mysqldump --column-statistics=0 -h"+ip+"  -P"+port +
                    "  -u"+name+"  -p"+password+"   "+dbName+"  >  " + dataFile;
            String[] comment = {"cmd","/c",smtp};
            Process exec = Runtime.getRuntime().exec(comment);
//            3.2 如果有错误进行语句输出查看
            InputStream errorStream = exec.getErrorStream();
            System.out.println(IOUtils.toString(errorStream,"UTF-8"));
//            3.3 判断数据库是否备份完毕
            if(exec.waitFor() == 0){
                System.out.println("数据库备份完毕,路径为:  "+dataFile);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值