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.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; 
 | 
    } 
 | 
  
 | 
} 
 |