一.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编写定时任务
- 定义类实现SchedulingConfigurer 接口, 重写 public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) 方法.
- 定义定时执行时间cron, 获取properties文件基本数据
- 编写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();
}
}
}