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

Wesley13
• 阅读 157

一、需求:

定时备份数据库数据

二、分析:

1. 定时任务

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

 三、实现: 

1. pom 文件:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <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>        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>8.0.15</version>        </dependency>        <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>druid</artifactId>            <version>1.1.20</version>        </dependency>        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->        <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</artifactId>            </plugin>        </plugins>    </build></project>

2. 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.IOException;/** * @author dell * @version: task.java v 1.0, 2020年01月18日 12:47 * @Description 数据库操作 **/@Servicepublic 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;    @Value("${sqlbackup.staticPath}")    private String sqlStaticPath;    /**     * 获取数据库名     */    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 定时任务 **/@Componentpublic 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. 执行:

启动程序:

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

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

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

 sz 命令下载

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

 默认下载到 下载目录

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

文件内容:

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

思路:使用

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……)

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

通过 grant 进行授权也不行

直到看到

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

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

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

就可以执行成功了

参考:

spring 官网 关于 schedule 的 demo:https://spring.io/guides/gs/scheduling-tasks/

备份数据库需要的权限:https://blog.csdn.net/Enjolras_fuu/article/details/87603634

RDS for MySQL Mysqldump常见问题及处理:https://my.oschina.net/HeAlvin/blog/849035

点赞
收藏
评论区
推荐文章
秃头王路飞 秃头王路飞
4个月前
webpack5手撸vue2脚手架
webpack5手撸vue相信工作个12年的小伙伴们在面试的时候多多少少怕被问到关于webpack方面的知识,本菜鸟最近闲来无事,就尝试了手撸了下vue2的脚手架,第一次发帖实在是没有经验,望海涵。languageJavaScript"name":"vuecliversion2","version":"1.0.0","desc
技术小男生 技术小男生
4个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi/etc/profile2:按字母键i进入编辑模式,在最底部添加内容:JAVAHOME/opt/jdk1.8.0152CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jarPATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
4个月前
Java面向对象试题
1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
刚刚好 刚刚好
4个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
小森森 小森森
4个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本欢迎添加左边的微信一起探讨!项目地址:(https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n)\2.Bug修复更新日历2.情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意),\\和注意
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
1年前
cobol学习之十数据库的增删改查模板
这次连接数据库使用的是ODBC连接access数据库,里面主要是一个增删改查的模板备份,方便以后查询。000001IDENTIFICATIONDIVISION.000002PROGRAMID.SAMPLEDB2.00
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序selectfromtable_nameorderiddesc;2.按照指定(多个)字段排序selectfromtable_nameorderiddesc,statusdesc;3.按照指定字段和规则排序selec
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
helloworld_34035044 helloworld_34035044
7个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为