您的位置 首页 java

java代码定时备份mysql数据库及注意事项——基于 springboot

一、需求:

定时备份数据库数据

二、分析:

1. 定时任务

2. 备份数据库表结构和数据

三、实现:

1. pom 文件:

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="#34;
         xmlns:xsi="#34;
         xsi:schemaLocation=" #34;>
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.kevin</groupId>
    <artifactId>backupdatabase</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>jar</packaging>
    <properties>
        < java .version>1.8</java.version>
    </properties>

    <dependencies>
        <!--  -->
        <dependency>
            <groupId> mysql </groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>
        <!--  -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.20</version>
        </dependency>
        <!--  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.awaitility</groupId>
            <artifactId>awaitility</artifactId>
            <version>3.1.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</art if actId>
            </plugin>
        </plugins>
    </build>
</project>  

 2. application.yml 文件
  

1

2

3

4

5

6

7

8

9

spring:

datasource:

driver-class-name: com.mysql. jdbc .Driver

url: jdbc:mysql://192.168.100.120:3306/test01?useSSL=false&autoReconnect=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8

username: kevin02

password: Kevin123!

sqlbackup:

path: /export/servers/db_backup/

 
3. BackUpDataBaseManager —— 具体操作数据库备份  

 package com.kevin.manager;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory. annotation .Value;
import org.springframework.stereotype.Service;

import java.io. File ;
import java.io.IO Exception ;

/**
 * @author dell
 * @version: task.java v 1.0, 2020年01月18日 12:47
 * @Description 数据库操作
 **/@Service
public class BackUpDataBaseManager {

     private   static  final Logger log = LoggerFactory.getLogger(BackUpDataBaseManager.class);

    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String userName;
    @Value("${spring.datasource.password}")
    private String password;

    @Value("${sqlbackup.path}")
    private String sqlPath;

    /**
     * 获取数据库名
     */    public String getDataBaseName() {
        return url.substring(url.indexOf("3306"), url.indexOf("?")).replaceAll("/", "").replaceAll("3306", "");
    }

    /**
     * 获取主机地址
     */    private String getHost() {
        return url.substring(url.indexOf("mysql"), url.indexOf("3306")).replace(":", "").replace("//", "").replace("mysql", "");
    }

    /**
     * 导出  sql  并返回相关信息
     */    public  void  exportSql(String time) {
        // 指定导出的 sql 存放的文件夹
        File saveFile = new File(sqlPath);
        if (!saveFile. exists ()) {
            saveFile.mkdirs();
        }

         String  host = getHost();
        String dataBaseName = getDataBaseName();
        String fileName = time + "_" + "cloudpm.sql";

         StringBuilder  sb = new StringBuilder();
        // 拼接备份命令
        sb.append("mysqldump").append(" --opt").append(" -h ").append(host).append(" --user=").append(userName).append(" --password=").append(password);
        sb.append(" --result-file=").append(sqlPath + fileName).append(" --default-character-set=utf8 ").append(dataBaseName);

        try {
            Process exec = Runtime.getRuntime().exec(sb.toString());
            if (exec.waitFor() == 0) {
                log.info("数据库备份成功,保存路径:" + sqlPath);
            } else {
                System.out.println("process.waitFor()=" + exec.waitFor());
            }
        } catch (IOException e) {
            log.error("备份 数据库 出现 IO异常 ", e);
        } catch (InterruptedException e) {
            log.error("备份 数据库 出现 线程中断异常 ", e);
        } catch (Exception e) {
            log.error("备份 数据库 出现 其他异常 ", e);
        }
    }
}  

3. 定时任务

 package com.kevin.schedule;

import com.kevin.manager.BackUpDataBaseManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;

/**
 * @author dell
 * @version: ScheduledTasks.java v 1.0, 2020年02月11日 11:38
 * @Description 定时任务
 **/@Component
public class ScheduledTasks {

    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSS");

    @Autowired
    private BackUpDataBaseManager backUpDataBaseManager;

    /**
     * 每天下午4点50分30秒执行
     */    @Scheduled(cron = "30 50 16 * * ?")
    public void reportCurrentTime() {
        String format = dateFormat.format(System.currentTimeMillis());
        log.info("The time is now {}", format);
        backUpDataBaseManager.exportSql(format);
    }
}  

4. 启动类

 package com.kevin;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

/**
 * @author dell
 * @version: TaskAppliacation.java v 1.0, 2020年02月11日 12:12
 * @Description
 **/@SpringBootApplication
@EnableScheduling
public class TaskApplication {

    public static void main(String[] args) {
        SpringApplication.run(TaskApplication.class);
    }
}  

5. 执行:

启动程序:

执行结果(文件名 _ 前面为 时间戳):

sz 命令下载

默认下载到 下载目录

文件内容:

思路:使用

mysqldump –opt -h hostname –user=username –password=password –result-file=/dir/filename –default-character-set=utf8 dbname

命令

hostname :数据库所在主机

username:数据库连接用户名

password:数据库连接密码

result-file:结果文件。指定目录+文件名

dbname:需要导出的数据库名

如:

mysqldump –opt -h 192.168.100.120 –user=kevin –password=Kevin123! –result-file=/export/servers/db_backup/2020021216503001_cloudpm.sql –default-character-set=utf8 test01

注意事项:

网上有说 加个 锁表的参数 — lock -all-tables=true

但报 无 reload 权限,直接拿 语句执行,也报相同的问题:

mysqldump : Couldn’t execute ‘FLUSH TABLES’: Access denied; you need (at leas……)

通过 grant 进行授权也不行

直到看到

然后 去掉了 –lock-all-tables=true

就可以执行成功了

文章来源:智云一二三科技

文章标题:java代码定时备份mysql数据库及注意事项——基于 springboot

文章地址:https://www.zhihuclub.com/176348.shtml

关于作者: 智云科技

热门文章

网站地图