java定时任务备份数据库【sqlserver和mysql】、保留30天内的文件

本文详细介绍了如何使用Java进行SQLServer数据库的定时备份,包括连接数据库、执行备份命令的代码实现。同时,文中还提到了MySQL数据库的备份方法,利用Hutool库和定时任务进行数据库的备份与删除操作,并给出了相关依赖和配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java定时任务备份sqlserver数据库

一、备份本质:
1、连接数据库
2、执行语句备份数据库,语句如下

BACKUP DATABASE primaryedu TO DISK = 'D:\Backup\dataBaseName.bak'
其中:
dataBaseName:备份的数据库名称
D:\Backup : 存储备份文件的路径
dataBaseName.bak : 生成数据库备份文件

二、代码实现:
1、数据库相关配置
###数据库备份#####
#数据库所在的环境
server.ip=localhost 
#需要备份的数据库的名称
backup.database.name=数据库名称
#备份的数据库账户
backup.database.user=账号
#备份的数据库密码
backup.database.password=密码
#备份的数据库存储路径
backup.url=C:/BackupE34
2、代码实现
	@Scheduled(cron = "0 59 23 * * ?")
    public void DataBaseBackup() {

        String databaseName = environment.getProperty("backup.database.name");
        String databaseUser = environment.getProperty("backup.database.user");
        String databasePassword = environment.getProperty("backup.database.password");
    
        String databaseBackupUrl = environment.getProperty("backup.url");
        String serverIp = environment.getProperty("server.ip");
		//判断存储路径文件夹是否存在,不存在则创建
        File file =new File(databaseBackupUrl);
        if  (!file .exists()  && !file .isDirectory()) {
            file .mkdirs();
        }

        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            //拼接数据库连接配置
            String url = "jdbc:sqlserver://" + serverIp + ":1433;" + "databaseName=" + databaseName + ";user=" + databaseUser + ";password=" + databasePassword;
            Connection conn = DriverManager.getConnection(url);
//            Connection conn = DriverManager.getConnection("jdbc:sqlserver://ip:1433;"+
//                    "databaseName=数据库名;user=数据库登录账号;password=数据库登录密码");
            Statement stmt = conn.createStatement();

            //获取当前时间 yyyy-MM-dd HH:mm:ss
            Date date = new Date();
            SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
            String currentTime = df.format(date);
            //拼接备份数据库的命令  BACKUP DATABASE primaryedu TO DISK =  'D:\Backup\备份文件.bak'
            String backupCmd = "BACKUP DATABASE " + databaseName + " TO DISK =  \'" + databaseBackupUrl + "/" + databaseName + currentTime + ".bak\'";
            stmt.execute(backupCmd);

            stmt.close();
            conn.close();

            System.out.println("Backup successful");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

总结

1、MySQL的备份不知道是否可以通过上面的备份命令实现,大佬们可以试一下,注意使用定时任务,项目启动类需要加上@EnableScheduling注解
2、sqlserver的定时删除和下面mysql的一样,可以参考实现

关于mysql备份、定时删除,保留30天【可自定义】

参考链接: https://blog.youkuaiyun.com/luomaCLX/article/details/127630105

需要的依赖
<!-- mysql驱动依赖也需要,这里就不写了 -->

<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.15</version>
        </dependency>
配置文件设置
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
spring.datasource.username=xxx
spring.datasource.password=xxx
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
backup.url=E:/BackupE34
代码实现
1、数据库连接工具类
package com.example.database_bakup.util;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.HashMap;

@Component
public class JdbcUtils {

    @Value("${spring.datasource.url}")
    private String url;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    public HashMap<String, String> getDBInfo() {
        String[] split = url.split(":");
        String host = String.format("%s:%s:%s", split[0], split[1], split[2]);
        String[] portSplit = split[3].split("/");
        String port = portSplit[0];

        String[] databaseSplit = portSplit[1].split("\\?");
        String dbName = databaseSplit[0];
        HashMap<String, String> result = new HashMap<>();
        result.put("url",url);
        result.put("host",host);
        result.put("port",port);
        result.put("dbName",dbName);
        result.put("userName",username);
        result.put("passWord",password);

        return result;
    }
}


2、定时任务代码
@Component
@EnableScheduling
public class ScheduleTask {

    @Autowired
    private JdbcUtils jdbcUtils;

    @Autowired
    private Environment environment;

    @Value("${backup.url}")
    private String resourcePath;

    /**
     * 定时备份数据库信息
     */
//    @Scheduled(cron = "0 0 1 * * ?")
    @Scheduled(cron = "0/6 * * * * ?")
    public void backUpDataBase() {
        System.out.println("定时备份数据库" + LocalDate.now());
//        LoggerUtil.info("======执行定时器:定时备份数据库=======");
        String backUpPath = resourcePath;
//        String backUpPath = resourcePath+"/sql/" + Date.valueOf(LocalDate.now());
        File backUpFile = new File(backUpPath);
        if (!backUpFile.exists()) {
            backUpFile.mkdirs();
        }
        File dataFile = new File(backUpPath+"/备份文件名_"+Date.valueOf(LocalDate.now())+".sql");
        //拼接cmd命令
        StringBuffer sb = new StringBuffer();
        Map<String, String> dbInfo = jdbcUtils.getDBInfo();
        sb.append("mysqldump");
        sb.append(" -u"+dbInfo.get("userName"));
        sb.append(" -p"+dbInfo.get("passWord"));
        sb.append(" "+ dbInfo.get("dbName") +" > ");
        sb.append(dataFile);
//        LoggerUtil.info("======数据库备份cmd命令为:"+sb.toString()+"=======");
        try {
            Process exec = Runtime.getRuntime().exec("cmd /c"+sb.toString());
            if (exec.waitFor() == 0){
//                LoggerUtil.info("======数据库备份成功,路径为:"+dataFile+"=======");
            }
        } catch (Exception e) {
//            LoggerUtil.info("======数据库备份失败,异常为:"+e.getMessage()+"=======");
        }
    }

    /**
     * 定时删除数据库备份文件,只保留最近一个星期
     */
    @Scheduled(cron = "0/6 * * * * ?")
    public void deleteBackUpDataBase() {
//        LoggerUtil.info("======执行定时器:定时删除备份数据库文件=======");
        String backUpPath = resourcePath;
//        String backUpPath = resourcePath+"/sql";
        File backUpFile = new File(backUpPath);
        if (backUpFile.exists()) {
            File[] files = backUpFile.listFiles();
            for (File file : files) {
                String fileName = file.getName(); //primaryedu_2023-06-28.bak
                String[] split = fileName.split("_");
                int length = split.length; //文件名称不对劲
                if(length == 1) {
                    file.delete();
                    continue;
                }
                String strDate = split[1].substring(0, 10);
                Date date1 = Date.valueOf(strDate);
                Date date2 = Date.valueOf(LocalDate.now());
                long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);
                if (betweenDay > 30) {
                    file.delete();
                }
            }
        }
    }







}

<think>嗯,用户给了三个不同的项目需求,需要分别处理。首先,我需要弄清楚每个项目的具体要求是什么,然后逐步分析如何解决这些问题。 第一个是江阴采纳WCS项目的华电生产环境部署。WCS通常是仓库控制系统,可能涉及自动化设备的集成系统配置。用户提到环境部署,可能需要安装服务器、配置网络、部署软件,还有可能涉及与其他系统(比如WMS)的集成。需要考虑操作系统的兼容性、依赖库的安装、权限设置,以及如何验证部署是否成功。可能需要使用自动化部署工具,比如Ansible或者Docker,来确保一致性。另外,生产环境的安全性也很重要,需要配置防火墙访问控制。 接下来是东成2期的数据库维护需求,要求每月定时删除数据库中的某些表。这里需要确定具体是哪些表,删除的条件是什么,比如保留最近三个月的数据。然后编写SQL脚本,可能使用DELETE或者DROP TABLE语句,但要注意数据备份日志记录,避免误删。定时任务可以用操作系统的crontab或者数据库自带的作业调度功能,比如MySQL的事件或者SQL Server Agent。还要考虑执行脚本时的数据库负载,选择低峰时段执行,避免影响业务运行。 第三个是多穿WMS测试环境的PDA流水线发布分支更改。测试环境通常需要频繁更新,所以可能需要使用持续集成/持续部署(CI/CD)工具,比如Jenkins或GitLab CI。需要确认当前的分支结构,是否需要创建新的分支,或者切换现有流水线的代码源。发布时要确保代码合并正确,进行自动化测试,避免引入错误。PDA部分可能涉及移动设备的应用程序部署,可能需要特定的打包分发流程,比如使用企业签名或者测试平台分发。 在回答时,需要分点说明每个项目的处理步骤,强调注意事项最佳实践,比如备份、测试、权限控制。同时要使用用户指定的LaTeX格式,确保数学表达式公式正确,比如在提到版本号或技术术语时是否需要用到。可能还需要考虑用户的技术水平,避免使用过于专业的术语,或者适当解释。 需要检查每个步骤的可行性,比如数据库删除脚本是否会有外键约束,如何处理。环境部署是否需要回滚计划,测试环境的发布是否有自动化测试环节。确保每个解决方案都结构清晰,用户能够按照步骤操作,同时提到可能遇到的问题解决办法。 最后,确保整个回答符合用户的中文要求,格式正确,没有Markdown,使用分点列表,关键术语用斜体或加粗突出(但根据用户要求,可能不需要)。同时注意LaTeX的正确使用,比如独立公式用$$,行内用$,但用户的问题中可能没有太多数学内容,所以可能只需要注意变量或代码部分是否需要用LaTeX,比如表名、版本号等可能需要用代码格式,但用户指定的是数学表达式,所以可能不需要。需要确认用户的需求,可能更多是技术步骤,而不是数学公式,所以LaTeX部分可能较少,但需遵循用户的系统级指令。</think>一、江阴采纳WCS项目——华电生产环境部署 1. *华电生产WCS环境部署* - **部署框架**: $$\text{WCS系统架构} = \text{应用服务器} + \text{数据库集群} + \text{通信中间件}$$ 需基于$CentOS 7.6$操作系统,部署$Java 11$运行环境及$Tomcat 9.0$容器。 - **关键步骤**: 1. **网络配置**:绑定静态IP(如$192.168.1.100$),开放$8080$(应用)及$3306$(数据库)端口。 2. **依赖安装**:通过$yum install -y libxml2$安装系统级依赖库。 3. **权限控制**:使用$chmod 755 /opt/wcs/bin/startup.sh$设置脚本可执行权限。 4. **集成验证**:通过$curl -X GET http://localhost:8080/wcs/health$检查服务状态。 - **注意事项**:需预留$8GB$内存,避免与现有$WMS$服务端口冲突。 二、东成2期环境——数据库表定时清理 1. *每月表数据删除脚本配置* - **脚本逻辑**: ```sql -- 删除30天前数据(示例表:tb_order_archive) DELETE FROM tb_order_archive WHERE create_time < DATE_SUB(NOW(), INTERVAL 1 MONTH); ``` - **调度实现**: - 通过$crontab -e$添加任务: $$0 0 1 * * /usr/bin/mysql -u root -pP@ssw0rd -e "CALL clean_old_data();"$$ - **安全措施**: 1. 前置备份:执行前调用$mysqldump$全量备份。 2. 事务回滚:脚本需包含$BEGIN...ROLLBACK$异常处理。 3. 日志记录:输出到$/var/log/db_clean.log$,记录影响行数。 三、多穿WMS测试环境——PDA流水线分支发布 1. *PDA流水线发布分支变更* - **分支管理**: - 原分支:$git checkout release/v2.3-pda$ - 新分支:$git checkout -b release/v2.4-pda$ - **发布流程**: 1. **代码合并**:通过$git merge feature/pda-enhance$集成新功能。 2. **镜像构建**:执行$docker build -t wms-pda:2.4 .$生成测试镜像。 3. **流水线验证**: $$\text{测试覆盖率} = \frac{\text{通过用例数}}{\text{总用例数}} \geq 95\%$$ - **回滚方案**: - 异常时切换至$release/v2.3-pda$标签: $$kubectl rollout undo deployment/wms-pda --to-revision=3$$ --- **附:共性风险防控** 1. 环境隔离:生产与测试环境需通过$VLAN$划分(如$VLAN 100$ vs $VLAN 200$)。 2. 版本基线:所有变更需关联$JIRA$工单(如$WCS-245$),禁止热修复直接推送。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值