package com.doumee.api;
|
|
import com.doumee.biz.system.SystemDictDataBiz;
|
import com.doumee.core.model.ApiResponse;
|
import com.doumee.core.utils.Constants;
|
import com.doumee.core.utils.Date;
|
import com.doumee.core.utils.DateUtil;
|
import com.doumee.service.business.PlatformJobService;
|
import io.swagger.annotations.Api;
|
import io.swagger.annotations.ApiOperation;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RestController;
|
|
import java.io.BufferedReader;
|
import java.io.File;
|
import java.io.IOException;
|
import java.io.InputStreamReader;
|
import java.sql.Connection;
|
import java.sql.DriverManager;
|
import java.sql.Statement;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
|
/**
|
* @author 江蹄蹄
|
* @date 2023/11/30 15:33
|
*/
|
@Api(tags = "月台作业定时")
|
@RestController
|
@Slf4j
|
@RequestMapping("/timer/db")
|
public class DatabaseController extends BaseController {
|
|
@Autowired
|
private PlatformJobService platformJobService;
|
@Autowired
|
private SystemDictDataBiz systemDictDataBiz;
|
|
|
@ApiOperation("数据库备份,保留最近7个备份sql")
|
@GetMapping("/backupDatabase")
|
public ApiResponse backupDatabase() {
|
try {
|
String timestamp = DateUtil.getNowLongTime();
|
// String path = "/usr/local/jars/db/";
|
// String backupPath = path + timestamp + ".sql";
|
String path = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.MYSQL_BACKUP_DIR).getCode();
|
String code = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.MYSQL_BACKUP_CDOE).getCode() ;
|
String backupPath = path + timestamp + ".sql";
|
code= code.replace("${param}",backupPath);
|
log.error("数据库备份================: " + code);
|
ProcessBuilder builder = new ProcessBuilder(code);
|
// 重定向错误流到标准输出流
|
builder.redirectErrorStream(true);
|
// stdout
|
Process process = builder.start();
|
new Thread(new ProcessHandleRunnable(process)).start();
|
process.waitFor(); // wait if needed
|
|
/* // 使用mysqldump命令进行数据库备份
|
Process process = Runtime.getRuntime().exec(code);
|
process.getErrorStream();
|
process.getInputStream();
|
process.waitFor();*/
|
|
// 检查备份是否成功
|
if (new File(backupPath).exists()) {
|
log.info("数据库备份成功: " + backupPath);
|
return ApiResponse.success("数据库备份成功: " + backupPath);
|
} else {
|
log.error("数据库备份失败.");
|
}
|
deleteOldFiles(path,7);//保留最近7个文件
|
} catch (Exception e) {
|
e.printStackTrace();
|
|
log.error("数据库备份失败."+e.getMessage());
|
}
|
return ApiResponse.failed("数据库备份失败" );
|
}
|
public void run() {
|
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
|
String currentDateTime = dateFormat.format(new Date());
|
String fileName = "backup_" + currentDateTime + ".sql";
|
|
try {
|
Class.forName("com.mysql.cj.jdbc.Driver");
|
Connection connection = DriverManager.getConnection("localhost:3306/antaiwuliu", "root", "Atwl@2024");
|
Statement statement = connection.createStatement();
|
|
String query = "SELECT * INTO OUTFILE '" + fileName + "' FROM your_table";
|
statement.execute(query);
|
|
System.out.println("Database backup successful to " + fileName);
|
|
statement.close();
|
connection.close();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
public static void main(String[] args) {
|
new DatabaseController().run();;
|
}
|
|
static class ProcessHandleRunnable implements Runnable {
|
private Process process;
|
|
public ProcessHandleRunnable(Process process) {
|
this.process = process;
|
}
|
|
public void run() {
|
BufferedReader br = null;
|
InputStreamReader reader = null;
|
try {
|
System.out.println("start run...");
|
reader = new InputStreamReader(process.getInputStream());
|
br = new BufferedReader(reader);
|
String line = null;
|
while ((line = br.readLine()) != null) {
|
System.out.println(line);
|
}
|
System.out.println("stop run...");
|
} catch (IOException ex) {
|
ex.printStackTrace();
|
} finally {
|
try {
|
if (br != null)
|
br.close();
|
if (reader != null)
|
reader.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
}
|
/**
|
* @param path
|
*/
|
public void deleteOldFiles(String path,int num) {
|
//文件路径
|
List<File> list = getFileSort(path);
|
if(list==null || list.size() <= num){
|
return;
|
}
|
for (int i = 0; i <list.size(); i++) {
|
if(i>=7){
|
list.get(i).delete();
|
}
|
}
|
}
|
|
/**
|
* 获取目录下所有文件(按时间排序)
|
*
|
* @param path
|
* @return
|
*/
|
public static List<File> getFileSort(String path) {
|
|
List<File> list = getFiles(path, new ArrayList<>());
|
|
if (list != null && list.size() > 0) {
|
|
Collections.sort(list, new Comparator<File>() {
|
public int compare(File file, File newFile) {
|
if (file.lastModified() < newFile.lastModified()) {
|
return 1;
|
} else if (file.lastModified() == newFile.lastModified()) {
|
return 0;
|
} else {
|
return -1;
|
}
|
|
}
|
});
|
|
}
|
|
return list;
|
}
|
|
/**
|
*
|
* 获取目录下所有文件
|
*
|
* @param realpath
|
* @param files
|
* @return
|
*/
|
public static List<File> getFiles(String realpath, List<File> files) {
|
File realFile = new File(realpath);
|
if (realFile.isDirectory()) {
|
File[] subfiles = realFile.listFiles();
|
for (File file : subfiles) {
|
if (file.isDirectory()) {
|
getFiles(file.getAbsolutePath(), files);
|
} else {
|
files.add(file);
|
}
|
}
|
}
|
return files;
|
}
|
|
}
|