java定时任务备份sqlserver数据库
一、备份本质:
1、连接数据库
2、执行语句备份数据库,语句如下
BACKUP DATABASE primaryedu TO DISK = 'D:\Backup\dataBaseName.bak'
其中:
dataBaseName:备份的数据库名称
D:\Backup : 存储备份文件的路径
dataBaseName.bak : 生成数据库备份文件
二、代码实现:
1、数据库相关配置
###数据库备份#####
#数据库所在的环境
server.ip=localhost
#需要备份的数据库的名称
backup.database.name=数据库名称
#备份的数据库账户
backup.database.user=账号
#备份的数据库密码
backup.database.password=密码
#备份的数据库存储路径
backup.url=C:/BackupE34
2、代码实现
@Scheduled(cron = "0 59 23 * * ?")
public void DataBaseBackup() {
String databaseName = environment.getProperty("backup.database.name");
String databaseUser = environment.getProperty("backup.database.user");
String databasePassword = environment.getProperty("backup.database.password");
String databaseBackupUrl = environment.getProperty("backup.url");
String serverIp = environment.getProperty("server.ip");
//判断存储路径文件夹是否存在,不存在则创建
File file =new File(databaseBackupUrl);
if (!file .exists() && !file .isDirectory()) {
file .mkdirs();
}
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//拼接数据库连接配置
String url = "jdbc:sqlserver://" + serverIp + ":1433;" + "databaseName=" + databaseName + ";user=" + databaseUser + ";password=" + databasePassword;
Connection conn = DriverManager.getConnection(url);
// Connection conn = DriverManager.getConnection("jdbc:sqlserver://ip:1433;"+
// "databaseName=数据库名;user=数据库登录账号;password=数据库登录密码");
Statement stmt = conn.createStatement();
//获取当前时间 yyyy-MM-dd HH:mm:ss
Date date = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
String currentTime = df.format(date);
//拼接备份数据库的命令 BACKUP DATABASE primaryedu TO DISK = 'D:\Backup\备份文件.bak'
String backupCmd = "BACKUP DATABASE " + databaseName + " TO DISK = \'" + databaseBackupUrl + "/" + databaseName + currentTime + ".bak\'";
stmt.execute(backupCmd);
stmt.close();
conn.close();
System.out.println("Backup successful");
} catch (Exception e) {
e.printStackTrace();
}
}
总结
1、MySQL的备份不知道是否可以通过上面的备份命令实现,大佬们可以试一下,注意使用定时任务,项目启动类需要加上@EnableScheduling注解
2、sqlserver的定时删除和下面mysql的一样,可以参考实现
关于mysql备份、定时删除,保留30天【可自定义】
参考链接: https://blog.youkuaiyun.com/luomaCLX/article/details/127630105
需要的依赖
<!-- mysql驱动依赖也需要,这里就不写了 -->
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.15</version>
</dependency>
配置文件设置
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
spring.datasource.username=xxx
spring.datasource.password=xxx
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
backup.url=E:/BackupE34
代码实现
1、数据库连接工具类
package com.example.database_bakup.util;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashMap;
@Component
public class JdbcUtils {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
public HashMap<String, String> getDBInfo() {
String[] split = url.split(":");
String host = String.format("%s:%s:%s", split[0], split[1], split[2]);
String[] portSplit = split[3].split("/");
String port = portSplit[0];
String[] databaseSplit = portSplit[1].split("\\?");
String dbName = databaseSplit[0];
HashMap<String, String> result = new HashMap<>();
result.put("url",url);
result.put("host",host);
result.put("port",port);
result.put("dbName",dbName);
result.put("userName",username);
result.put("passWord",password);
return result;
}
}
2、定时任务代码
@Component
@EnableScheduling
public class ScheduleTask {
@Autowired
private JdbcUtils jdbcUtils;
@Autowired
private Environment environment;
@Value("${backup.url}")
private String resourcePath;
/**
* 定时备份数据库信息
*/
// @Scheduled(cron = "0 0 1 * * ?")
@Scheduled(cron = "0/6 * * * * ?")
public void backUpDataBase() {
System.out.println("定时备份数据库" + LocalDate.now());
// LoggerUtil.info("======执行定时器:定时备份数据库=======");
String backUpPath = resourcePath;
// String backUpPath = resourcePath+"/sql/" + Date.valueOf(LocalDate.now());
File backUpFile = new File(backUpPath);
if (!backUpFile.exists()) {
backUpFile.mkdirs();
}
File dataFile = new File(backUpPath+"/备份文件名_"+Date.valueOf(LocalDate.now())+".sql");
//拼接cmd命令
StringBuffer sb = new StringBuffer();
Map<String, String> dbInfo = jdbcUtils.getDBInfo();
sb.append("mysqldump");
sb.append(" -u"+dbInfo.get("userName"));
sb.append(" -p"+dbInfo.get("passWord"));
sb.append(" "+ dbInfo.get("dbName") +" > ");
sb.append(dataFile);
// LoggerUtil.info("======数据库备份cmd命令为:"+sb.toString()+"=======");
try {
Process exec = Runtime.getRuntime().exec("cmd /c"+sb.toString());
if (exec.waitFor() == 0){
// LoggerUtil.info("======数据库备份成功,路径为:"+dataFile+"=======");
}
} catch (Exception e) {
// LoggerUtil.info("======数据库备份失败,异常为:"+e.getMessage()+"=======");
}
}
/**
* 定时删除数据库备份文件,只保留最近一个星期
*/
@Scheduled(cron = "0/6 * * * * ?")
public void deleteBackUpDataBase() {
// LoggerUtil.info("======执行定时器:定时删除备份数据库文件=======");
String backUpPath = resourcePath;
// String backUpPath = resourcePath+"/sql";
File backUpFile = new File(backUpPath);
if (backUpFile.exists()) {
File[] files = backUpFile.listFiles();
for (File file : files) {
String fileName = file.getName(); //primaryedu_2023-06-28.bak
String[] split = fileName.split("_");
int length = split.length; //文件名称不对劲
if(length == 1) {
file.delete();
continue;
}
String strDate = split[1].substring(0, 10);
Date date1 = Date.valueOf(strDate);
Date date2 = Date.valueOf(LocalDate.now());
long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);
if (betweenDay > 30) {
file.delete();
}
}
}
}
}