package com.doumee.api; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.service.business.third.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.PostMapping; 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") @PostMapping("/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 list = getFileSort(path); if(list==null || list.size() <= num){ return; } for (int i = 0; i =7){ list.get(i).delete(); } } } /** * 获取目录下所有文件(按时间排序) * * @param path * @return */ public static List getFileSort(String path) { List list = getFiles(path, new ArrayList<>()); if (list != null && list.size() > 0) { Collections.sort(list, new Comparator() { 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 getFiles(String realpath, List 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; } }