首先,对数据库进行备份,用到的命令:
mysqldump --opt -h 192.168.1.200 --user=root --password=xxx --result-file=E://data//20240911141400.sql --default-character-set=utf8 xxx(数据库名)
直接上代码
配置文件部分代码
代码部分两个类
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Component
public class BackUpDataBaseManager {
@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("${data.url}")
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 + ".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 {
System.out.println("执行语句:" + sb.toString());
Process exec = Runtime.getRuntime().exec(sb.toString());
if (exec.waitFor() == 0) {
//删除前期的文件
this.deleteDir();
System.out.println("数据库备份成功,保存路径:" + sqlPath);
} else {
System.out.println("process.waitFor()=" + exec.waitFor());
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
System.out.println("备份 数据库 出现 线程中断异常 ");
} catch (Exception e) {
System.out.println("备份 数据库 出现 其他异常 ");
}
}
/**
* @Description: 循环文件夹下的文件,删除指定的文件
* @param
* @author zlw
* @date 2024/9/11 11:21
*/
public void deleteDir() {
// 替换为你的文件夹路径
String folderPath = sqlPath;
// 要保留的最新文件数量
int numberToKeep = 8;
File folder = new File(folderPath);
File[] files = folder.listFiles();
if (files != null) {
List<File> fileList = Arrays.asList(files);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
//list倒序排列
fileList.sort((f1, f2) -> {
Date d1 = null;
Date d2 = null;
try {
d1 = sdf.parse(extractDateTime(f1.getName()));
d2 = sdf.parse(extractDateTime(f2.getName()));
} catch (Exception e) {
e.printStackTrace();
}
return d1.compareTo(d2);
});
System.out.println("fileList的数据是"+fileList);
for (int i = 0; i < fileList.size() - numberToKeep; i++) {
fileList.get(i).delete();
}
}
}
private static String extractDateTime(String fileName) {
// 假设文件名的前14个字符包含日期时间信息
return fileName.length() >= 14 ? fileName.substring(0, 14) : "";
}
}
定时任务的类
public class ScheduledTasks {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
@Autowired
private BackUpDataBaseManager backUpDataBaseManager;
/**
* 每天下午4点50分30秒执行
*/
// 每一分钟执行一次
// @Scheduled(cron = "0 0/1 * * * ? ")
//每周三和周日上午9点执行去备份数据库
@Scheduled(cron = "0 0 9 ? * WED,SUN")
public void reportCurrentTime() {
String format = dateFormat.format(System.currentTimeMillis());
System.out.println("The time is now {}"+format);
backUpDataBaseManager.exportSql(format);
}
}
执行结果:
会定时删除一个月前的数据,只保留最近一个月的数据库备份文件