我们在开发项目的时候,肯定会备份数据库这种操作。所以我们需要把数据定时备份下来这样我们可以防止某些数据丢失,减少损失。
首先:需要引入相应的jar包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
其次:在配置文件application.properties
spring.datasource.url=jdbc:mysql://数据库地址:3306/Knowdege?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=username
spring.datasource.password=password
###需要备份的数据库名称
spring.datasource.dbName=Knowdege
###数据库备份存在的地址
spring.datasource.backupPath=D://pic//
接着:准备相应的操作类。BackUpDataBaseManager
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
/**
* @Description 数据库操作
**/
@Component
public class BackUpDataBaseManager {
private static final Logger log = LoggerFactory.getLogger(BackUpDataBaseManager.class);
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String userName;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.backupPath}")
private String sqlPath;
/**
* 获取数据库名
*/
public String getDataBaseName() {
return url.substring(url.indexOf("3306"), url.indexOf("?")).replaceAll("/", "").replaceAll("3306", "");
}
/**
* 获取主机地址
*/
private String getHost() {
return url.substring(url.indexOf("mysql"), url.indexOf("3306")).replace(":", "").replace("//", "").replace("mysql", "");
}
/**
* 导出 sql 并返回相关信息
*/
public void exportSql(String time) {
// 指定导出的 sql 存放的文件夹
File saveFile = new File(sqlPath);
if (!saveFile.exists()) {
saveFile.mkdirs();
}
String host = getHost();
String dataBaseName = getDataBaseName();
String fileName = time + "_" + "cloudpm.sql";
StringBuilder sb = new StringBuilder();
// 拼接备份命令
sb.append("mysqldump").append(" --opt").append(" -h ").append(host).append(" --user=").append(userName).append(" --password=").append(password);
sb.append(" --result-file=").append(sqlPath + fileName).append(" --default-character-set=utf8 ").append(dataBaseName);
try {
log.info("执行语句:"+sb.toString());
Process exec = Runtime.getRuntime().exec(sb.toString());
if (exec.waitFor() == 0) {
log.info("数据库备份成功,保存路径:" + sqlPath);
} else {
System.out.println("process.waitFor()=" + exec.waitFor());
}
} catch (IOException e) {
log.error("备份 数据库 出现 IO异常 ", e);
} catch (InterruptedException e) {
log.error("备份 数据库 出现 线程中断异常 ", e);
} catch (Exception e) {
log.error("备份 数据库 出现 其他异常 ", e);
}
}
}
最后,设置定时任务定时来执行
import com.iflytek.service.BackUpDataBaseManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
/**
* @Description 数据库备份定时任务
**/
@Component
public class ScheduledTasks {
private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSS");
@Autowired
private BackUpDataBaseManager backUpDataBaseManager;
/**
* 每天下午4点50分30秒执行
*/
// 每一分钟执行一次
//@Scheduled(cron="0 0/1 * * * ?")
@Scheduled(cron = "30 50 16 * * ?")
public void reportCurrentTime() {
String format = dateFormat.format(System.currentTimeMillis());
log.info("The time is now {}", format);
backUpDataBaseManager.exportSql(format);
}
}
引用:java代码定时备份mysql数据库及注意事项——基于 springboot - WTX106 -