最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot項目實現(xiàn)定時備份數(shù)據(jù)庫導(dǎo)出sql文件方式

 更新時間:2025年03月28日 09:16:05   作者:想太多會累i  
這篇文章主要介紹了springboot項目實現(xiàn)定時備份數(shù)據(jù)庫導(dǎo)出sql文件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

之所以做這個功能的原因是我的服務(wù)器上的數(shù)據(jù)庫被攻擊了,還好服務(wù)器上沒有什么重要的數(shù)據(jù),但是數(shù)據(jù)沒了就很肉疼,因此做了這個功能,用來定時備份數(shù)據(jù)庫數(shù)據(jù)

添加依賴

這里用到了 hutool 工具包 這個包挺好用的,推薦大家可以多看看他的官方文檔

官方文檔:https://www.hutool.cn/docs/#/

<!-- hutool工具類-->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.3.3</version>
</dependency>

添加配置文件和配置

因為這里只是需要導(dǎo)出sql 所以就使用了hutool工具中的DB

resources目錄下創(chuàng)建db.setting數(shù)據(jù)庫配置文件

文件中內(nèi)容:

## url 數(shù)據(jù)庫連接地址
## user 連接數(shù)據(jù)庫賬號
## pass 連接數(shù)據(jù)庫密碼
url = jdbc:mysql://localhost:3306/test
user = root
pass = 123456

緊接著在application.yml文件中添加sql文件的存放的路徑

# 導(dǎo)出sql文件的位置
sql:
  dbname: notepad # 數(shù)據(jù)庫名
  filePath: /data/sql/ # 導(dǎo)出sql文件的位置 win下會直接在項目所在磁盤下建立 data/sql文件

編寫導(dǎo)出SQL的方法

方法直接貼在下面:

package com.an.notepad.task;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.io.file.FileWriter;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import cn.hutool.db.ds.DSFactory;
import lombok.Data;
import lombok.SneakyThrows;
import lombok.experimental.Accessors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.io.File;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.util.List;

@Configuration
public class ExportSQL {
    // 用于打印執(zhí)行日志
    private static final Logger logger = LoggerFactory.getLogger(ExportSQL.class);

    // 存儲的路徑
    @Value("${sql.filePath}")
    private String filePath;

    // 數(shù)據(jù)庫名
    @Value("${sql.dbname}")
    private String database_name;

    // 需要導(dǎo)出的表名
    private final List<TempBean> tempBeanList = CollectionUtil.newArrayList(
            // 這里寫需要存儲的表名 有幾張表就new幾個
            new TempBean().setTable("n_note"),
            new TempBean().setTable("n_user")
    );

    @SneakyThrows
    public void export() {
        //獲取默認數(shù)據(jù)源
        DataSource ds = DSFactory.get();
        // 獲取數(shù)據(jù)庫連接對象
        Connection connection = ds.getConnection();
        // 獲取連接信息
        DatabaseMetaData metaData = connection.getMetaData();
        // 創(chuàng)建sql文件對象
        FileWriter sqlFileWriter = FileWriter.create(new File(filePath + database_name + ".sql"));
        sqlFileWriter.write("");
        sqlFileWriter.append("USE " + database_name + ";\n");
        sqlFileWriter.append("/*\n");
        sqlFileWriter.append(" --------------------------------------------------\n");
        sqlFileWriter.append(" Target Server Type    : " + metaData.getDatabaseProductName() + ";\n");
        sqlFileWriter.append(" Target Server Version : " + metaData.getDatabaseProductVersion() + ";\n");
        sqlFileWriter.append(" \n");
        sqlFileWriter.append(" Target Server Date : " + DateTime.now() + ";\n");
        sqlFileWriter.append(" \n");
        sqlFileWriter.append(" --------------------------------------------------\n");
        sqlFileWriter.append("*/\n");
        sqlFileWriter.append("SET NAMES utf8mb4;\n");
        sqlFileWriter.append("SET FOREIGN_KEY_CHECKS = 0;\n");
        for (TempBean tempBean : tempBeanList) {
            String table = tempBean.table;
            sqlFileWriter.append("\n\n\n");
            // DROP TABLE
            sqlFileWriter.append("DROP TABLE IF EXISTS `" + table + "`;\n");
            // CREATE TABLE
            Entity createTableEntity = Db.use().queryOne("SHOW CREATE TABLE " + table);
            sqlFileWriter.append((String) createTableEntity.get("Create Table"));
            sqlFileWriter.append(";\n");
            // 看配置,是否需要insert語句
            if (!tempBean.insert) {
                continue;
            }
            // INSERT INTO
            List<Entity> dataEntityList = Db.use().query("SELECT * FROM " + table);
            for (Entity dataEntity : dataEntityList) {
                StrBuilder field = StrBuilder.create();
                StrBuilder data = StrBuilder.create();

                dataEntity.forEach((key, value) -> {
                    field.append(key).append(", ");
                    if (ObjectUtil.isNotNull(value)) {
                        if (StrUtil.equals("true", String.valueOf(value))) {
                            data.append("b'1'");
                        } else if (StrUtil.equals("false", String.valueOf(value))) {
                            data.append("b'0'");
                        } else {
                            data.append("'").append(value).append("'");
                        }
                    } else {
                        data.append("NULL");
                    }
                    data.append(", ");
                });

                sqlFileWriter.append("INSERT INTO `" + table + "`(");
                String fieldStr = field.subString(0, field.length() - 2);
                sqlFileWriter.append(fieldStr);
                sqlFileWriter.append(") VALUES (");
                String dataStr = data.subString(0, data.length() - 2);
                sqlFileWriter.append(dataStr);
                sqlFileWriter.append(");\n");
            }
        }
        sqlFileWriter.append("\n\n\n");
        sqlFileWriter.append("SET FOREIGN_KEY_CHECKS = 1;\n");
        logger.info(">>>>>>>>>> 存儲sql成功" + DateTime.now());
    }

    @Data
    @Accessors(chain = true)
    static class TempBean {
        // 表名
        public String table;
        // 是否需要insert語句,默認需要 (表中數(shù)據(jù))
        public Boolean insert = true;
    }
}

創(chuàng)建定時任務(wù)

package com.an.notepad.task;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

/**
 * 定時導(dǎo)出數(shù)據(jù)庫sql功能
 */
@Configuration
@EnableScheduling // 開啟定時任務(wù)
public class ExportTask {
    @Autowired
    private ExportSQL exportSQL;

    //@Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1點觸發(fā)一次
    @Scheduled(cron = "*/5 * * * * ?") // 5秒觸發(fā)一次
    public void task() {
        exportSQL.export();
    }
}

編寫完成 運行測試一下

我這里項目在D盤中,因此D盤D:\data\sql 默認會有生成的文件

成功,我這邊測試了一下,數(shù)據(jù)庫是可以導(dǎo)入的

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot中讀取配置的七種方法總結(jié)

    SpringBoot中讀取配置的七種方法總結(jié)

    在Spring Boot應(yīng)用中,讀取配置是一項基礎(chǔ)且重要的任務(wù),Spring Boot提供了多種靈活的方式來讀取配置,以滿足不同場景下的需求,本文將詳細介紹Spring Boot中讀取配置的幾種常用方法,需要的朋友可以參考下
    2024-08-08
  • Java獲取文件ContentType案例

    Java獲取文件ContentType案例

    這篇文章主要介紹了Java獲取文件ContentType案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Spring事務(wù)傳播行為問題解決

    Spring事務(wù)傳播行為問題解決

    這篇文章主要介紹了Spring事務(wù)傳播行為問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • springboot-dubbo cannot be cast to問題及解決

    springboot-dubbo cannot be cast to問題及解決

    這篇文章主要介紹了springboot-dubbo cannot be cast to問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 解決Mybatis返回update后影響的行數(shù)問題

    解決Mybatis返回update后影響的行數(shù)問題

    這篇文章主要介紹了解決Mybatis返回update后影響的行數(shù)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Java OpenCV實現(xiàn)圖像鏡像翻轉(zhuǎn)效果

    Java OpenCV實現(xiàn)圖像鏡像翻轉(zhuǎn)效果

    這篇文章主要為大家詳細介紹了Java OpenCV實現(xiàn)圖像鏡像翻轉(zhuǎn)效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • java中多線程的超詳細介紹

    java中多線程的超詳細介紹

    這篇文章主要給大家介紹了關(guān)于java中多線程的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • JDK8的lambda方式List轉(zhuǎn)Map的操作方法

    JDK8的lambda方式List轉(zhuǎn)Map的操作方法

    account是一個返回本身的lambda表達式,其實還可以使用Function接口中的一個默認方法代替,使整個方法更簡潔優(yōu)雅,這篇文章主要介紹了JDK8的lambda方式List轉(zhuǎn)Map,需要的朋友可以參考下
    2022-07-07
  • Java設(shè)計模式之原型模式詳細解讀

    Java設(shè)計模式之原型模式詳細解讀

    這篇文章主要介紹了Java設(shè)計模式之原型模式詳細解讀,原型模式屬于創(chuàng)建型設(shè)計模式,用于創(chuàng)建重復(fù)的對象,且同時又保證了性能,該設(shè)計模式的好處是將對象的創(chuàng)建與調(diào)用方分離,需要的朋友可以參考下
    2023-12-12
  • Java 創(chuàng)建URL的常見問題及解決方案

    Java 創(chuàng)建URL的常見問題及解決方案

    這篇文章主要介紹了Java 創(chuàng)建URL的常見問題及解決方案的相關(guān)資料,需要的朋友可以參考下
    2016-10-10

最新評論

乾安县| 和平县| 长春市| 凤凰县| 平远县| 广安市| 绵竹市| 昆明市| 钟山县| 保靖县| 新蔡县| 长岛县| 韶山市| 光泽县| 东辽县| 玛纳斯县| 清水河县| 武清区| 巩留县| 丹巴县| 潜山县| 皮山县| 唐河县| 鄂尔多斯市| 胶州市| 光山县| 搜索| 宁明县| 汝阳县| 泰州市| 甘肃省| 揭阳市| 潍坊市| 古浪县| 禹城市| 砚山县| 杭锦后旗| 子长县| 宜兴市| 新邵县| 南充市|