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

一、需求:

定时备份数据库数据

二、分析:

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.error("数据库备份成功,保存路径:" + 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. 执行:

启动程序:

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

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

就可以执行成功了

参考:

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

原文地址:https://www.cnblogs.com/wtx106/p/12298798.html

时间: 2024-10-20 23:04:53

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

java实现定时备份mysql数据库-----已通过测试

配置文件中的信息 sqlurl=C://Program Files (x86)//MySQL//MySQL Server 5.0//bin//mysqldump -h localhost -uroot -pwjg user      path=F:/test.sql      backuptime=16:34:00 备份数据库 public class TestMysql {                   //读取配置文件中的信息                   //MySql的安装b

Linux下定时备份MySQL数据库的Shell脚本

Linux下定时备份MySQL数据库的Shell脚本 对任何一个已经上线的网站站点来说,数据备份都是必须的.无论版本更新还是服务器迁移,备份数据的重要性不言而喻.人工备份数据的方式不单耗费大量时间和精力,还灰常不专业的说.于是,有了下面这段脚本的出现.参考了网上的很多教程,外加自己的测试,以下脚本经测试可用.#!/bin/bash#Shell Command For Backup MySQL Database Everyday Automatically By Crontab#Author :

centos7-每天定时备份 mysql数据库

centos7-每天定时备份 mysql数据库 第一步:编写数据库备份脚本database_mysql_shell.sh #!/bin/bash DATE=`date +%Y%m%d%H%M` #every minute DATABASE=springboot-admin #database name DB_USERNAME=root #database username DB_PASSWORD="mysql" #database password BACKUP_PATH=/backu

定时备份mysql数据库的shell脚本

最近项目需要定时备份mysql数据库的数据,根据需求写了一份定时备份mysql数据库的脚本. -h mysql的地址  默认为localhost -P 端口号  默认为3306 -u 用户  默认为root -p 密码 默认为123456 -f  备份存放地址  默认为 /bak 下面 -n 指定数据库  默认为所有数据库(除开mysql系统自带数据库) #!/bin/bash now=`date "+%Y-%m-%d_%H:%M:%S" ` echo "==========

商城系统在linux系统中定时备份MySQL数据库并删除七天前的备份文件

数据库是商城软件中重要的组成部分,定时任务能周期性地自动执行中的程序必要的业务逻辑,以DSMall开源商城系统每日店铺结算的业务逻辑为例:!/bin/bash?Name:bakmysql.sh?This?is?a?ShellScript?For?Auto?DB?Backup?and?Delete?old?Backup备份地址backupdir=/home/mysqlbackup备份文件后缀时间time=`?date?+%Y%m%d%H%M%S?<br/>需要备份的数据库名称<br/>

使用Navicat定时备份mysql数据库和创建报表并邮件自动发送

数据库备份在现代计算机高速发展的今日变得日益重要,程序员往往因为不重视而忽略备份数据,导致数据丢失,造成非常严重的后果.定时备份无疑是解决备份的最好的途径,本文主要使用Navicat来自动备份数据库和创建相关的计划任务. (一)使用Navicat自动备份数据库: 1,打开navicat客户端,连上mysql后,双击左边你想要备份的数据库.点击"计划",再点击"新建批处理作业"具体如下图. 2,双击上面的可用任务,它就会到下面的列表里去,也代表你选择了这个任务 3,点

linux设置定时备份mysql数据库

最近写自己的项目,买了阿里云服务器,可以在云上根据自己想到的需求随意使用技术,感觉很爽.备份mysql流程如下: 环境:CentOS Linux release 7.2.1511 (Core) mysql5.6.34 创建存放备份文件的文件夹mkmir /backup/mysql 创建备份脚本vi backup.shmysqldump -u root -p888 familytree | gzip > /backup/mysql/familytree_$(date +%Y%m%d_%H%M%S)

linux定时备份MySQL数据库并删除七天前的备份文件

#!/bin/bash # Name:bakmysql.sh # This is a ShellScript For Auto DB Backup and Delete old Backup #备份地址 backupdir=/home/mysqlbackup #备份文件后缀时间 time=_` date +%Y_%m_%d_%H_%M_%S ` #需要备份的数据库名称 db_name=test #mysql 用户名 db_user=root #mysql 密码 db_pass=123456 my

linux 定时备份mysql数据库

首先要先搞清楚两个概念: ①.mysqldump,mysqldump是mysql的逻辑备份工具,它不是linux的命令,工作原理类似产生一些列sql语句,对数据库进行指定的逻辑备份. 最简洁的形式是:mysqldump  -uuserName -ppassWord --databasesName 当然,可以通过配置参数实现更多功能(请原理我厚颜无耻复制来的配置列表,见附录1).,多唠叨一句,进行数据库操作时请注意是否有相应的数据库权限. ②crontab 这是个linux系统命令,是用来定期执行