国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Springboot使用ProcessBuilder創(chuàng)建系統(tǒng)進(jìn)程執(zhí)行shell命令備份數(shù)據(jù)庫

這篇具有很好參考價(jià)值的文章主要介紹了Springboot使用ProcessBuilder創(chuàng)建系統(tǒng)進(jìn)程執(zhí)行shell命令備份數(shù)據(jù)庫。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

概要

Springboot執(zhí)行shell命令備份數(shù)據(jù)庫。

1、查看mysql版本

mysql --version

Springboot使用ProcessBuilder創(chuàng)建系統(tǒng)進(jìn)程執(zhí)行shell命令備份數(shù)據(jù)庫,開發(fā)問題收集,spring boot,數(shù)據(jù)庫,后端

2、相關(guān)依賴

<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 {

    //數(shù)據(jù)庫連接地址
    @Value("${spring.datasource.url}")
    private String dbUrl;

    //數(shù)據(jù)庫名
    @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文件
    @Autowired
    private ResourceLoader resourceLoader;

    /**
     * 數(shù)據(jù)庫版本是否為 8.0 + (false=否  true=是), mysql8+ 需要參數(shù)  --column-statistics=0  , mysql8- 不需要
     * 新版的mysqldump默認(rèn)啟用了一個(gè)新標(biāo)志,通過--column-statistics=0來禁用
     */
    boolean isDbVersion8 = true;

    @SneakyThrows
    public void backup() {
        log.info("【備份數(shù)據(jù)庫】--START");
        String dbUrl2 = dbUrl.replace("jdbc:mysql://", "");

        // 獲取數(shù)據(jù)庫地址
        String[] serverPath = dbUrl2.substring(0, dbUrl2.indexOf("/")).split(":");
        String ip = serverPath[0];
        String port = serverPath[1];

        // 數(shù)據(jù)庫賬號
        String username = dbUserName;
        // 數(shù)據(jù)庫密碼
        String password = dbPassWord;
        String dbParam = "";

        // 備份文件目錄+名稱  備份文件存放目錄+名稱(名稱 = 數(shù)據(jù)庫名+時(shí)間字符串.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";
        }

        // 執(zhí)行命令
        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);

        //這里打印出來的命令是可以直接在 終端執(zhí)行的。
        System.out.println(newCmd);
        System.out.println(pathFileName);

        // 創(chuàng)建進(jìn)程構(gòu)建器
        ProcessBuilder processBuilder = new ProcessBuilder();
        // 設(shè)置命令和參數(shù)
        processBuilder.command(getOsShell(), "-c" , newCmd);
//        processBuilder.command(getOsShell(), "/c" , newCmd);
        // 啟動(dòng)進(jìn)程
        Process process = processBuilder.start();

        // 獲取命令執(zhí)行的輸出流
        InputStream inputStream = process.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        // 讀取輸出
        String line;
        while ((line = reader.readLine()) != null) {
            log.info(line);
        }

        // 等待命令執(zhí)行完成
        int exitCode = process.waitFor();
        System.out.println("命令執(zhí)行完成,退出碼:" + exitCode);
        if (exitCode == 0) {
            log.info("數(shù)據(jù)庫備份成功!");
        } else {
            log.info("數(shù)據(jù)庫備份失??!");
        }

        //TODO 獲取文件備份的文件、上傳到云服務(wù)。
//        Resource resource = resourceLoader.getResource("file:" + pathFileName);
//        InputStream inputStream = resource.getInputStream();
//        byte[] bytes = IoUtil.readBytes(resource.getInputStream());

        //TODO 同步備份記錄到數(shù)據(jù)庫

        //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 "";
    }


}

技術(shù)細(xì)節(jié)

主要就是使用ProcessBuilder創(chuàng)建系統(tǒng)進(jìn)程,執(zhí)行終端命令。文章來源地址http://www.zghlxwxcb.cn/news/detail-727956.html

到了這里,關(guān)于Springboot使用ProcessBuilder創(chuàng)建系統(tǒng)進(jìn)程執(zhí)行shell命令備份數(shù)據(jù)庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • springboot通過接口執(zhí)行本地shell腳本

    springboot通過接口執(zhí)行本地shell腳本

    首先創(chuàng)建springboot項(xiàng)目 shell腳本 這里是執(zhí)行本地腳本 然后編寫執(zhí)行shell腳本的util類 最后開發(fā)接口調(diào)用此類 如何執(zhí)行遠(yuǎn)程腳本 在這里我試用了三種方式,實(shí)現(xiàn)遠(yuǎn)程腳本的執(zhí)行 但是使用ssh2時(shí) 會(huì)拋出上述的異常,大體的意思就是密鑰交換算法不匹配,導(dǎo)致連接失敗。 但是老版本

    2024年02月14日
    瀏覽(23)
  • 【Shell 命令集合 系統(tǒng)管理 】Linux 以超級用戶(root)的身份執(zhí)行特權(quán)命令 sudo命令 使用指南

    【Shell 命令集合 系統(tǒng)管理 】Linux 以超級用戶(root)的身份執(zhí)行特權(quán)命令 sudo命令 使用指南

    Shell 命令專欄:Linux Shell 命令全解析 sudo是Linux中的一個(gè)命令,它允許普通用戶以超級用戶(root)的身份執(zhí)行特權(quán)命令。sudo的作用是提供了一種安全的方式,讓授權(quán)用戶執(zhí)行需要特權(quán)的操作,而無需完全切換到超級用戶賬戶。 sudo的主要作用如下: 提高安全性:使用sudo命令可

    2024年02月03日
    瀏覽(91)
  • 【Linux】在服務(wù)器上創(chuàng)建Crontab(定時(shí)任務(wù)),自動(dòng)執(zhí)行shell腳本

    【Linux】在服務(wù)器上創(chuàng)建Crontab(定時(shí)任務(wù)),自動(dòng)執(zhí)行shell腳本

    業(yè)務(wù)場景:該文即為上次編寫shell腳本的姊妹篇,在上文基礎(chǔ)上,將可執(zhí)行的腳本通過linux的定時(shí)任務(wù)自動(dòng)執(zhí)行,節(jié)省人力物力,話不多說,開始操作! 連上服務(wù)器后,在任意位置都可以執(zhí)行: crontab -e 如果沒有進(jìn)入 編輯cron任務(wù)模式 根據(jù)提示查看我們的服務(wù)器上是否未安裝crontab沒有則

    2024年02月14日
    瀏覽(37)
  • 【Shell 命令集合 系統(tǒng)管理 】Linux 創(chuàng)建新用戶的命令 useradd命令 使用指南

    【Shell 命令集合 系統(tǒng)管理 】Linux 創(chuàng)建新用戶的命令 useradd命令 使用指南

    Shell 命令專欄:Linux Shell 命令全解析 useradd命令是Linux系統(tǒng)中用于創(chuàng)建新用戶的命令。它的作用是在系統(tǒng)中創(chuàng)建一個(gè)新的用戶賬號,并指定該用戶的相關(guān)屬性和配置。 通過useradd命令,管理員可以在Linux系統(tǒng)中添加新的用戶賬號。每個(gè)用戶賬號都有一個(gè)唯一的用戶名和用戶ID(

    2024年02月04日
    瀏覽(129)
  • 【Shell 命令集合 系統(tǒng)管理 】Linux 創(chuàng)建一個(gè)新的用戶組 groupadd 命令 使用指南

    【Shell 命令集合 系統(tǒng)管理 】Linux 創(chuàng)建一個(gè)新的用戶組 groupadd 命令 使用指南

    Shell 命令專欄:Linux Shell 命令全解析 groupadd命令用于在Linux系統(tǒng)中創(chuàng)建一個(gè)新的用戶組。它可以創(chuàng)建一個(gè)本地用戶組,也可以創(chuàng)建一個(gè)系統(tǒng)用戶組。 創(chuàng)建一個(gè)用戶組可以幫助管理員更好地管理用戶和文件的權(quán)限。用戶組可以將一組用戶組織在一起,并為他們提供共享的權(quán)限設(shè)

    2024年02月03日
    瀏覽(133)
  • Java進(jìn)程線程介紹創(chuàng)建和執(zhí)行銷毀并理解線程安全和線程池 Native Method

    Java進(jìn)程線程介紹創(chuàng)建和執(zhí)行銷毀并理解線程安全和線程池 Native Method

    進(jìn)程和線程都是一個(gè)控制流程。 一個(gè)進(jìn)程通常對應(yīng)于一個(gè)程序。 一個(gè)程序可以由多個(gè)不同的線程構(gòu)成。 一個(gè)進(jìn)程就是一個(gè)應(yīng)用程序 一個(gè)應(yīng)用程序面對多個(gè)用戶則多個(gè)進(jìn)程 一個(gè)進(jìn)程則多個(gè)線程 多個(gè)線程共享資源且攜帶數(shù)據(jù)操作 多進(jìn)程資源隔離 多線程的核心在于多個(gè)代碼塊

    2024年02月02日
    瀏覽(34)
  • 使用 ProcessBuilder API 優(yōu)化你的流程

    Java 的 Process API 為開發(fā)者提供了執(zhí)行操作系統(tǒng)命令的強(qiáng)大功能,但是某些 API 方法可能讓你有些疑惑,沒關(guān)系,這篇文章將詳細(xì)介紹如何使用 ProcessBuilder API 來方便的操作系統(tǒng)命令。 我們通過演示如何調(diào)用 java -version 命令輸出 JDK 版本號,來演示 ProcessBuilder 的入門用法。 在這

    2024年02月08日
    瀏覽(23)
  • Linux下的系統(tǒng)編程——進(jìn)程的執(zhí)行與回收(八)

    Linux下的系統(tǒng)編程——進(jìn)程的執(zhí)行與回收(八)

    前言: 前面我們對進(jìn)程已經(jīng)有了一個(gè)初步的了解與認(rèn)識(shí),現(xiàn)在讓我們學(xué)習(xí)一下進(jìn)程中一些函數(shù)的具體使用,比如exec可以執(zhí)行一些指定的程序,wait / waitpid可以回收子進(jìn)程,什么是孤兒進(jìn)程,什么是僵尸進(jìn)程,下面讓我們一起對這些進(jìn)行中的操作進(jìn)行學(xué)習(xí)吧 目錄 一、exec函數(shù)族

    2024年02月09日
    瀏覽(26)
  • linux shell pgrep命令使用方法(pgrep指令)獲取進(jìn)程號、統(tǒng)計(jì)進(jìn)程數(shù)量(學(xué)會(huì)區(qū)分Linux進(jìn)程進(jìn)程名)

    linux shell pgrep命令使用方法(pgrep指令)獲取進(jìn)程號、統(tǒng)計(jì)進(jìn)程數(shù)量(學(xué)會(huì)區(qū)分Linux進(jìn)程進(jìn)程名)

    按照我之前,在腳本中,獲取除腳本自身進(jìn)程之外與腳本同名進(jìn)程號的方法: 這種方法有很大問題,莫名奇妙的,它無法正常過濾掉grep的進(jìn)程(這里面還有點(diǎn)復(fù)雜,我一時(shí)半會(huì)也搞不明白咋回事,據(jù)說是grep會(huì)開子進(jìn)程,并非grep那個(gè)子進(jìn)程,而是開了一個(gè)與腳本相同的進(jìn)程,

    2024年02月07日
    瀏覽(21)
  • Linux 環(huán)境使用定時(shí)任務(wù)執(zhí)行shell腳本

    Linux 環(huán)境使用定時(shí)任務(wù)執(zhí)行shell腳本

    前言:Linux添加定時(shí)任務(wù)需要依賴crond服務(wù),如果沒有該服務(wù),需要先安裝:yum -y install crontabs 1、crond服務(wù)相關(guān)命令介紹 ????????啟動(dòng)crond服務(wù): service crond start ????????停止crond服務(wù): service crond stop ????????重啟crond服務(wù): service crond restart ????????重載crond服務(wù)

    2024年02月16日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包