当前位置: 代码网 > it编程>编程语言>Java > springboot项目实现定时备份数据库导出sql文件方式

springboot项目实现定时备份数据库导出sql文件方式

2025年03月28日 Java 我要评论
之所以做这个功能的原因是我的服务器上的数据库被攻击了,还好服务器上没有什么重要的数据,但是数据没了就很肉疼,因此做了这个功能,用来定时备份数据库数据添加依赖这里用到了 hutool 工具包 这个包挺好

之所以做这个功能的原因是我的服务器上的数据库被攻击了,还好服务器上没有什么重要的数据,但是数据没了就很肉疼,因此做了这个功能,用来定时备份数据库数据

添加依赖

这里用到了 hutool 工具包 这个包挺好用的,推荐大家可以多看看他的官方文档

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

<!-- hutool工具类-->
<dependency>
    <groupid>cn.hutool</groupid>
    <artifactid>hutool-all</artifactid>
    <version>5.3.3</version>
</dependency>

添加配置文件和配置

因为这里只是需要导出sql 所以就使用了hutool工具中的db

resources目录下创建db.setting数据库配置文件

文件中内容:

## url 数据库连接地址
## user 连接数据库账号
## pass 连接数据库密码
url = jdbc:mysql://localhost:3306/test
user = root
pass = 123456

紧接着在application.yml文件中添加sql文件的存放的路径

# 导出sql文件的位置
sql:
  dbname: notepad # 数据库名
  filepath: /data/sql/ # 导出sql文件的位置 win下会直接在项目所在磁盘下建立 data/sql文件

编写导出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 {
    // 用于打印执行日志
    private static final logger logger = loggerfactory.getlogger(exportsql.class);

    // 存储的路径
    @value("${sql.filepath}")
    private string filepath;

    // 数据库名
    @value("${sql.dbname}")
    private string database_name;

    // 需要导出的表名
    private final list<tempbean> tempbeanlist = collectionutil.newarraylist(
            // 这里写需要存储的表名 有几张表就new几个
            new tempbean().settable("n_note"),
            new tempbean().settable("n_user")
    );

    @sneakythrows
    public void export() {
        //获取默认数据源
        datasource ds = dsfactory.get();
        // 获取数据库连接对象
        connection connection = ds.getconnection();
        // 获取连接信息
        databasemetadata metadata = connection.getmetadata();
        // 创建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语句,默认需要 (表中数据)
        public boolean insert = true;
    }
}

创建定时任务

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;

/**
 * 定时导出数据库sql功能
 */
@configuration
@enablescheduling // 开启定时任务
public class exporttask {
    @autowired
    private exportsql exportsql;

    //@scheduled(cron = "0 0 1 * * ?") // 每天凌晨1点触发一次
    @scheduled(cron = "*/5 * * * * ?") // 5秒触发一次
    public void task() {
        exportsql.export();
    }
}

编写完成 运行测试一下

我这里项目在d盘中,因此d盘d:\data\sql 默认会有生成的文件

成功,我这边测试了一下,数据库是可以导入的

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com