package cn.xd.dcol.railway.business.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableScheduling;
import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
@SpringBootApplication
@EnableScheduling
@Async
@Slf4j
public class BackupUtils {
public static String username="";//数据库名称
public static String password="";//数据库密码
public static String backupPath="/home";//备份数据输出路径
public static String backFilePrefix="";//备份数据输出文件名前缀
public static String mysqldumpPath="mysqldump";//直接写mysqldump
public static String dbName="";//数据库名称
public static String port="";//端口号
//@Scheduled(cron = "0 0 18 * * ?")
public static void backup() {
//删除文件信息
try {
del(backupPath);
} catch (IOException e) {
e.printStackTrace();
}
File file = new File(backupPath);
if (!file.exists()) {
file.mkdirs();
}
String fileName = backupPath + "/" + backFilePrefix + LocalDate.now() + ".sql";
/** 默认使用linux*/
//String cmdPrefix = "/bin/sh -c ";
String c1 = "/bin/sh";
String c2 = "-c";
String os_name = System.getProperty("os.name");
// 判断是否是windows系统
if (os_name.toLowerCase().startsWith("win")){
//cmdPrefix = "cmd /c ";
c1 = "cmd";
c2 = "/c";
}
//参考示例:# /usr/local/mysql/bin/mysqldump -uroot -p123456 -P3306 shuju > shuju.sql
String cmd = mysqldumpPath // mysqldump的绝对路径,配置环境变量,直接写mysqldump即可
+ " -u" + username // 数据库用户名
+ " -p" + password // 数据库密码
+ " -P" + port // 数据库端口号
+ " " + dbName // 数据库名
+ " > " + fileName; // 最终写入的文件路径
try {
System.out.println("第一个参数 " + c1);
System.out.println("第二个参数 " + c2);
System.out.println("具体命令 " + cmd);
log.error("数据库备份START" + LocalDateTime.now());
/**
* exec重载方法有一个参数的,window下执行正常,linux下无法完成备份。
* 使用多参数重载方法都可以正常备份
*/
Process process = Runtime.getRuntime().exec(new String[]{c1, c2, cmd});
process.waitFor();
log.error("数据库备份END" + LocalDateTime.now());
} catch (Exception e) {
e.printStackTrace();
log.error("数据库备份失败:{}", e.getMessage());
}
}
//删除服务器文件夹
public static void del(String filepath) throws IOException {
File f = new File(filepath);//定义文件路径
if(f.exists() && f.isDirectory()){//判断是文件还是目录
if(f.listFiles().length==0){//若目录下没有文件则直接删除
f.delete();
}else{//若有则把文件放进数组,并判断是否有下级目录
File delFile[]=f.listFiles();
int i =f.listFiles().length;
for(int j=0;j<i;j++){
if(delFile[j].isDirectory()){
del(delFile[j].getAbsolutePath());//递归调用del方法并取得子目录路径
}
delFile[j].delete();//删除文件
}
}
}
}
}
java实现服务器数据库备份
于 2022-09-30 09:44:28 首次发布