Springboot使用ProcessBuilder创建系统进程执行shell命令备份数据库

news/2025/2/1 15:46:41/

文章目录

    • 概要
    • 1、查看mysql版本
    • 2、相关依赖
    • 3、具体代码
    • 技术细节

概要

Springboot执行shell命令备份数据库。

1、查看mysql版本

mysql --version

在这里插入图片描述

2、相关依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.20</version>
</dependency>

3、具体代码

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.time.LocalDate;
import org.springframework.core.io.ResourceLoader;@Component
@Slf4j
public class BackupJob {//数据库连接地址@Value("${spring.datasource.url}")private String dbUrl;//数据库名@Value("${spring.datasource.name}")private String dbName;//用户名@Value("${spring.datasource.username}")private String dbUserName;//密码@Value("${spring.datasource.password}")private String dbPassWord;//存放路径@Value("${backup.path}")private String filePath;// 在你的类中注入ResourceLoader,用来获取备份的sql文件@Autowiredprivate ResourceLoader resourceLoader;/*** 数据库版本是否为 8.0 + (false=否  true=是), mysql8+ 需要参数  --column-statistics=0  , mysql8- 不需要* 新版的mysqldump默认启用了一个新标志,通过--column-statistics=0来禁用*/boolean isDbVersion8 = true;@SneakyThrowspublic void backup() {log.info("【备份数据库】--START");String dbUrl2 = dbUrl.replace("jdbc:mysql://", "");// 获取数据库地址String[] serverPath = dbUrl2.substring(0, dbUrl2.indexOf("/")).split(":");String ip = serverPath[0];String port = serverPath[1];// 数据库账号String username = dbUserName;// 数据库密码String password = dbPassWord;String dbParam = "";// 备份文件目录+名称  备份文件存放目录+名称(名称 = 数据库名+时间字符串.sql)String timeStr = LocalDate.now().toString();String pathFileName = filePath + dbName + "_" + timeStr + ".sql";String newCmd = "mysqldump -h{SERVER-PATH} -P{SERVER-PORT} -u{USERNAME} -p{PASSWORD} {DBNAME} {DB-PARAM} > {FILEPATH}";if(isDbVersion8){dbParam = "--column-statistics=0";}// 执行命令newCmd =  newCmd.replace("{USERNAME}", username).replace("{PASSWORD}", password).replace("{SERVER-PATH}", ip).replace("{DBNAME}", dbName).replace("{SERVER-PORT}", port).replace("{FILEPATH}", pathFileName).replace("{DB-PARAM}", dbParam);//这里打印出来的命令是可以直接在 终端执行的。System.out.println(newCmd);System.out.println(pathFileName);// 创建进程构建器ProcessBuilder processBuilder = new ProcessBuilder();// 设置命令和参数processBuilder.command(getOsShell(), "-c" , newCmd);
//        processBuilder.command(getOsShell(), "/c" , newCmd);// 启动进程Process process = processBuilder.start();// 获取命令执行的输出流InputStream inputStream = process.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));// 读取输出String line;while ((line = reader.readLine()) != null) {log.info(line);}// 等待命令执行完成int exitCode = process.waitFor();System.out.println("命令执行完成,退出码:" + exitCode);if (exitCode == 0) {log.info("数据库备份成功!");} else {log.info("数据库备份失败!");}//TODO 获取文件备份的文件、上传到云服务。
//        Resource resource = resourceLoader.getResource("file:" + pathFileName);
//        InputStream inputStream = resource.getInputStream();
//        byte[] bytes = IoUtil.readBytes(resource.getInputStream());//TODO 同步备份记录到数据库//TODO 删除指定文件
//        FileUtil.del(pathFileName);}public String getOsShell() {String osName = System.getProperty("os.name");// TODO Windows未测试if (osName.toLowerCase().contains("windows")) {return "cmd.exe";} else if (osName.toLowerCase().contains("mac")) {return "/bin/bash";} else if (osName.toLowerCase().contains("linux")) {return "/bin/bash";}return "";}}

技术细节

主要就是使用ProcessBuilder创建系统进程,执行终端命令。


http://www.ppmy.cn/news/1140415.html

相关文章

第85步 时间序列建模实战:CNN回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们介绍CNN回归。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndrome i…

Maven聚合项目配合Springcloud案例

创建maven项目 导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache…

194、SpringBoot --- 下载和安装 Erlang 、 RabbitMQ

本节要点&#xff1a; 一些命令&#xff1a; 小黑窗输入&#xff1a; rabbitmq-plugins enable rabbitmq_management 启动控制台插件 rabbitmq-server 启动rabbitMQ服务器 管理员启动小黑窗&#xff1a; rabbitmq-service install 添加rabbitMQ为本地服务 启动浏览器访问 htt…

搭建spring+dubbo环境踩坑小记

springdubbo环境搭建网上汗牛充栋&#xff0c;但是实践过程中遇到种种麻烦&#xff0c;小记一篇&#xff0c;免得自己或者别人再次踩坑。 主要的问题是&#xff0c;项目需要引入哪些包&#xff0c;对有些版本过时的配置该如何修正&#xff0c;遇到异常如何处理&#xff08;hell…

问卷调查中常见问题及解决方法

随着技术和市场的日益发展&#xff0c;问卷调查已经成为了人们了解客户需求和反馈的一种必要手段。但是&#xff0c;问卷调查也面临着一些问题。在本文中&#xff0c;我们将探讨一些常见问题&#xff0c;问卷调查会遇到什么问题&#xff1f;怎么解决&#xff1f;并提供一些解决…

【golang】go 空结构体 详解 空结构体内容占用及大小

一、空结构体基础 空结构实例 和 空结构体变量 本质是一样的 1、所有空结构体地址都是一样的2、大小都为0&#xff08;最独特的&#xff09; package mainimport ("fmt""time""unsafe" )type EST struct { }func main() {// 一、基础// 空结构…

力扣、每日一练:删除并获得点数

文章目录 一、题目&#xff1a;二、这个题的解题思路&#xff1a;三、考察的知识点&#xff1a;四、使用Python语言巧妙实现&#xff1a;五、总结一下收获 一、题目&#xff1a; 给你一个整数数组 nums &#xff0c;你可以对它进行一些操作。 每次操作中&#xff0c;选择任意…

论文笔记 A theory of learning from different domains

domain adaptation 领域理论方向的重要论文. 这篇笔记主要是推导文章中的定理, 还有分析定理的直观解释. 笔记中的章节号与论文中的保持一致. 1. Introduction domain adaptation 的设定介绍: 有两个域, source domain 与 target domain. source domain: 一组从 source dist.…