java代碼定時備份mysql數據庫及注意事項——基於 springboot


 

源碼地址: https://gitee.com/kevin9401/BackUpDataBase

git 拉取: https://gitee.com/kevin9401/BackUpDataBase.git

 

一、需求:

定時備份數據庫數據

二、分析:

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. application.yml 文件
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.IOException;

/**
* @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 

就可以執行成功了 

 

參考:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM