From f78ecae2003ce4eb8ab61a98bfa685d86ead9f7c Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 31 八月 2026 16:41:44 +0800
Subject: [PATCH] feat(system): 添加数据库备份配置和实现自动备份功能
---
yudao-server/src/main/resources/application-dev.yaml | 7 +
yudao-server/src/main/resources/application-jhhg.yaml | 7 +
yudao-server/src/main/resources/application-wtxc.yaml | 7 +
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/database/DatabaseBackupServiceImpl.java | 244 +++++++++++++++++++++++++++++++++++++++++-------
yudao-server/src/main/resources/application-test.yaml | 7 +
yudao-server/src/main/resources/application-local.yaml | 7 +
yudao-server/src/main/resources/application-yzfx.yaml | 7 +
7 files changed, 248 insertions(+), 38 deletions(-)
diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/database/DatabaseBackupServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/database/DatabaseBackupServiceImpl.java
index 28bf9bd..b78f3d1 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/database/DatabaseBackupServiceImpl.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/database/DatabaseBackupServiceImpl.java
@@ -3,24 +3,38 @@
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
+import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
-import jakarta.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
import java.util.Date;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Service
@Slf4j
public class DatabaseBackupServiceImpl implements DatabaseBackupService {
+
+ /** 澶囦唤瓒呮椂鏃堕棿锛堝垎閽燂級 */
+ private static final long BACKUP_TIMEOUT_MINUTES = 10;
+ /** MySQL 瀹瑰櫒鍐呴儴绔彛 */
+ private static final String DOCKER_MYSQL_PORT = "3306";
@Value("${spring.datasource.dynamic.datasource.master.url:}")
private String dbUrl;
@@ -31,54 +45,145 @@
@Value("${spring.datasource.dynamic.datasource.master.password:}")
private String dbPassword;
+ /** 澶囦唤鍛戒护锛屽彲鏄惧紡鎸囧畾锛堝 docker exec mysql8 mysqldump锛夛紱鐣欑┖鍒欒嚜鍔ㄦ娴嬫湰鍦� mysqldump 鎴� Docker MySQL 瀹瑰櫒 */
+ @Value("${yudao.database-backup.command:}")
+ private String backupCommand;
+
+ /** 澶囦唤鐩爣鏁版嵁搴� host锛岀暀绌哄垯浠庢暟鎹簮 JDBC URL 瑙f瀽 */
+ @Value("${yudao.database-backup.host:}")
+ private String backupHost;
+
+ /** 澶囦唤鐩爣鏁版嵁搴� port锛岀暀绌哄垯浠庢暟鎹簮 JDBC URL 瑙f瀽 */
+ @Value("${yudao.database-backup.port:}")
+ private String backupPort;
+
+ /** 澶囦唤鐩爣鏁版嵁搴撳悕锛岀暀绌哄垯浠庢暟鎹簮 JDBC URL 瑙f瀽 */
+ @Value("${yudao.database-backup.database:}")
+ private String backupDatabase;
+
+ /** 澶囦唤璐﹀彿锛岀暀绌哄垯浣跨敤鏁版嵁婧愯处鍙� */
+ @Value("${yudao.database-backup.username:}")
+ private String backupUsername;
+
+ /** 澶囦唤瀵嗙爜锛岀暀绌哄垯浣跨敤鏁版嵁婧愬瘑鐮� */
+ @Value("${yudao.database-backup.password:}")
+ private String backupPassword;
+
@Override
public void backupDatabase(HttpServletResponse response) throws Exception {
- if (dbUrl == null || dbUrl.isEmpty()) {
+ if (StrUtil.isEmpty(dbUrl)) {
throw new ServiceException(500, "鏈壘鍒版暟鎹簱杩炴帴閰嶇疆");
}
- // 瑙f瀽 JDBC URL锛屾彁鍙� host, port, dbname
- // 鏍煎紡: jdbc:mysql://localhost:3306/ruoyi-vue-pro?useSSL=false
- Pattern pattern = Pattern.compile("jdbc:mysql://([^:]+):(\\d+)/([^?]+)");
- Matcher matcher = pattern.matcher(dbUrl);
- String host = "127.0.0.1";
- String port = "3306";
- String dbName = "";
-
- if (matcher.find()) {
- host = matcher.group(1);
- port = matcher.group(2);
- dbName = matcher.group(3);
- } else {
- // fallback
- log.warn("鏃犳硶瑙f瀽 JDBC URL: {}, 浣跨敤榛樿閰嶇疆", dbUrl);
- dbName = "ruoyi-vue-pro"; // 榛樿鍚嶏紝濡傛灉鏈夌殑璇�
+ // 澶囦唤杩炴帴鐨勬暟鎹簱淇℃伅锛氫紭鍏堜娇鐢� yudao.database-backup 閰嶇疆锛屾湭閰嶇疆鐨勯儴鍒嗕粠鏁版嵁婧� JDBC URL 瑙f瀽鍏滃簳
+ String dbHost = backupHost;
+ String dbPort = backupPort;
+ String dbName = backupDatabase;
+ if (StrUtil.isEmpty(dbHost) || StrUtil.isEmpty(dbPort) || StrUtil.isEmpty(dbName)) {
+ Matcher matcher = Pattern.compile("jdbc:mysql://([^:]+):(\\d+)/([^?]+)").matcher(dbUrl);
+ if (matcher.find()) {
+ if (StrUtil.isEmpty(dbHost)) {
+ dbHost = matcher.group(1);
+ }
+ if (StrUtil.isEmpty(dbPort)) {
+ dbPort = matcher.group(2);
+ }
+ if (StrUtil.isEmpty(dbName)) {
+ dbName = matcher.group(3);
+ }
+ }
}
+ if (StrUtil.isEmpty(dbHost) || StrUtil.isEmpty(dbPort) || StrUtil.isEmpty(dbName)) {
+ log.warn("鏃犳硶浠庨厤缃垨 JDBC URL 瑙f瀽瀹屾暣鐨勬暟鎹簱淇℃伅: host={}, port={}, db={}", dbHost, dbPort, dbName);
+ throw new ServiceException(500, "鏃犳硶瑙f瀽鏁版嵁搴撳浠借繛鎺ヤ俊鎭紝璇峰湪 yudao.database-backup 涓厤缃� host/port/database");
+ }
+ String username = StrUtil.isEmpty(backupUsername) ? dbUsername : backupUsername;
+ String password = StrUtil.isEmpty(backupPassword) ? dbPassword : backupPassword;
+
+ // 妫�娴嬮儴缃茬幆澧冿紝鏋勫缓澶囦唤鍛戒护
+ List<String> commandParts = new ArrayList<>();
+ String connectHost = dbHost;
+ String connectPort = dbPort;
+ if (StrUtil.isNotEmpty(backupCommand)) {
+ // 鎵嬪姩鎸囧畾鍛戒护锛屼紭鍏堜娇鐢�
+ for (String token : backupCommand.trim().split("\\s+")) {
+ commandParts.add(token);
+ }
+ log.info("浣跨敤鎵嬪姩閰嶇疆鐨勫浠藉懡浠�: {}", backupCommand);
+ } else if (isLocalMysqldumpAvailable()) {
+ // 鏈湴閮ㄧ讲锛氭湰鏈哄凡瀹夎 mysqldump
+ commandParts.add("mysqldump");
+ log.info("妫�娴嬪埌鏈満 mysqldump锛屼娇鐢ㄦ湰鍦板浠藉懡浠�");
+ } else {
+ // Docker 閮ㄧ讲锛氭煡鎵捐繍琛屼腑鐨� MySQL 瀹瑰櫒锛岄�氳繃 docker exec 璋冪敤瀹瑰櫒鍐� mysqldump
+ String container = findMysqlDockerContainer(dbPort);
+ if (StrUtil.isEmpty(container)) {
+ throw new ServiceException(500, "鏈娴嬪埌鍙敤鐨� mysqldump 鐜锛氭湰鏈烘湭瀹夎 MySQL 瀹㈡埛绔紝"
+ + "涔熸湭鍙戠幇杩愯涓殑 MySQL Docker 瀹瑰櫒銆傚彲閫氳繃閰嶇疆 yudao.database-backup.command 鎵嬪姩鎸囧畾澶囦唤鍛戒护");
+ }
+ commandParts.add("docker");
+ commandParts.add("exec");
+ // docker exec 涓嶄細杞彂瀹夸富鏈虹幆澧冨彉閲忥紝瀵嗙爜闇�閫氳繃 -e 鏄惧紡浼犲叆瀹瑰櫒
+ if (StrUtil.isNotEmpty(password)) {
+ commandParts.add("-e");
+ commandParts.add("MYSQL_PWD=" + password);
+ }
+ commandParts.add(container);
+ commandParts.add("mysqldump");
+ // 瀹瑰櫒鍐呭浐瀹氫娇鐢� 127.0.0.1:3306 璧� TCP 杩炴帴鑷韩锛岀粫寮� socket 璁よ瘉宸紓
+ connectHost = "127.0.0.1";
+ connectPort = DOCKER_MYSQL_PORT;
+ log.info("妫�娴嬪埌 Docker 閮ㄧ讲锛屼娇鐢ㄥ鍣� [{}] 鎵ц mysqldump", container);
+ }
+ commandParts.add("-h" + connectHost);
+ commandParts.add("-P" + connectPort);
+ commandParts.add("-u" + username);
+ if (StrUtil.isEmpty(password)) {
+ commandParts.add("--skip-password");
+ }
+ commandParts.add(dbName);
String timestamp = DateUtil.format(new Date(), "yyyyMMdd_HHmmss");
String fileName = "backup_" + timestamp + ".sql";
File tempFile = File.createTempFile("backup_", ".sql");
-
+
try {
- // 鏋勫缓 mysqldump 鍛戒护
- String[] command = {
- "mysqldump",
- "-h" + host,
- "-P" + port,
- "-u" + dbUsername,
- "-p" + dbPassword,
- dbName,
- "-r", tempFile.getAbsolutePath()
- };
-
- ProcessBuilder pb = new ProcessBuilder(command);
+ ProcessBuilder pb = new ProcessBuilder(commandParts);
+ // 鏁版嵁搴撳瘑鐮侀�氳繃鐜鍙橀噺浼犻�掞紝閬垮厤鍑虹幇鍦ㄥ懡浠よ鍙婅繘绋嬪垪琛�
+ if (StrUtil.isNotEmpty(password)) {
+ pb.environment().put("MYSQL_PWD", password);
+ }
Process process = pb.start();
- int exitCode = process.waitFor();
- if (exitCode != 0) {
- String error = IoUtil.read(process.getErrorStream(), StandardCharsets.UTF_8);
- log.error("鏁版嵁搴撳浠藉け璐�, exitCode: {}, error: {}", exitCode, error);
- throw new ServiceException(500, "鏁版嵁搴撳浠藉け璐�: " + error);
+ // 鍚庡彴璇诲彇 stderr锛岄槻姝㈢閬撶紦鍐插尯鍐欐弧瀵艰嚧杩涚▼闃诲
+ StringBuilder stderr = new StringBuilder();
+ Thread stderrThread = new Thread(() -> {
+ try (BufferedReader reader = new BufferedReader(
+ new InputStreamReader(process.getErrorStream(), StandardCharsets.UTF_8))) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ stderr.append(line).append(System.lineSeparator());
+ }
+ } catch (IOException ignored) {
+ }
+ });
+ stderrThread.start();
+
+ // stdout 鍐欏叆鏈湴涓存椂鏂囦欢锛坉ocker exec 鍦烘櫙杈撳嚭涓嶄細钀藉湪瀹瑰櫒鍐呮枃浠剁郴缁燂級
+ try (InputStream in = process.getInputStream();
+ OutputStream out = new FileOutputStream(tempFile)) {
+ IoUtil.copy(in, out);
+ }
+
+ boolean finished = process.waitFor(BACKUP_TIMEOUT_MINUTES, TimeUnit.MINUTES);
+ stderrThread.join();
+ if (!finished) {
+ process.destroyForcibly();
+ throw new ServiceException(500, "鏁版嵁搴撳浠借秴鏃讹紙瓒呰繃 " + BACKUP_TIMEOUT_MINUTES + " 鍒嗛挓锛�");
+ }
+ if (process.exitValue() != 0) {
+ log.error("鏁版嵁搴撳浠藉け璐�, exitCode: {}, error: {}", process.exitValue(), stderr);
+ throw new ServiceException(500, "鏁版嵁搴撳浠藉け璐�: " + stderr);
}
// 璁剧疆鍝嶅簲澶�
@@ -91,10 +196,73 @@
OutputStream os = response.getOutputStream()) {
IoUtil.copy(fis, os);
}
-
} finally {
// 鍒犻櫎涓存椂鏂囦欢
FileUtil.del(tempFile);
}
}
-}
+
+ /**
+ * 妫�娴嬫湰鏈� mysqldump 鏄惁鍙敤
+ */
+ private boolean isLocalMysqldumpAvailable() {
+ try {
+ Process process = new ProcessBuilder("mysqldump", "--version").redirectErrorStream(true).start();
+ boolean finished = process.waitFor(5, TimeUnit.SECONDS);
+ if (!finished) {
+ process.destroyForcibly();
+ return false;
+ }
+ return process.exitValue() == 0;
+ } catch (IOException e) {
+ return false;
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ return false;
+ }
+ }
+
+ /**
+ * 鏌ユ壘杩愯涓殑 MySQL Docker 瀹瑰櫒锛屼紭鍏堥�夋嫨绔彛鏄犲皠涓庢暟鎹簮绔彛涓�鑷寸殑瀹瑰櫒
+ *
+ * @return 瀹瑰櫒鍚嶏紱鏈壘鍒拌繑鍥� null
+ */
+ private String findMysqlDockerContainer(String dbPort) {
+ try {
+ Process ps = new ProcessBuilder("docker", "ps", "--format", "{{.ID}}|{{.Names}}|{{.Image}}")
+ .redirectErrorStream(true).start();
+ String output = IoUtil.read(ps.getInputStream(), StandardCharsets.UTF_8);
+ if (!ps.waitFor(10, TimeUnit.SECONDS) || ps.exitValue() != 0) {
+ return null;
+ }
+ List<String[]> containers = new ArrayList<>();
+ for (String line : output.split("\n")) {
+ String[] parts = line.trim().split("\\|");
+ if (parts.length == 3 && parts[2].startsWith("mysql")) {
+ containers.add(parts);
+ }
+ }
+ if (containers.isEmpty()) {
+ return null;
+ }
+ // 浼樺厛閫夋嫨绔彛鏄犲皠涓庢暟鎹簮绔彛涓�鑷寸殑瀹瑰櫒
+ for (String[] container : containers) {
+ Process portProcess = new ProcessBuilder("docker", "port", container[0], "3306/tcp")
+ .redirectErrorStream(true).start();
+ String portOutput = IoUtil.read(portProcess.getInputStream(), StandardCharsets.UTF_8);
+ if (portProcess.waitFor(10, TimeUnit.SECONDS) && portProcess.exitValue() == 0
+ && portOutput.contains(dbPort)) {
+ return container[1];
+ }
+ }
+ log.warn("鏈尮閰嶅埌绔彛鏄犲皠鐨� MySQL 瀹瑰櫒锛屼娇鐢ㄧ涓�涓�: {}", containers.get(0)[1]);
+ return containers.get(0)[1];
+ } catch (IOException e) {
+ log.warn("妫�娴� Docker 鐜澶辫触: {}", e.getMessage());
+ return null;
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/yudao-server/src/main/resources/application-dev.yaml b/yudao-server/src/main/resources/application-dev.yaml
index af8ba92..379338f 100644
--- a/yudao-server/src/main/resources/application-dev.yaml
+++ b/yudao-server/src/main/resources/application-dev.yaml
@@ -154,3 +154,10 @@
compress: true # 鏄惁鍘嬬缉鍥剧墖
need-compress-size: 10MB # 瑙﹀彂鍘嬬缉鐨勬枃浠跺ぇ灏忛槇鍊�
compress-quality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
+ database-backup: # 鏁版嵁搴撳浠介厤缃�
+ host: 127.0.0.1 # 澶囦唤鐩爣 MySQL 涓绘満锛岀暀绌鸿嚜鍔ㄤ粠鏁版嵁婧� JDBC URL 瑙f瀽
+ port: 3306 # 澶囦唤鐩爣 MySQL 绔彛锛岀暀绌鸿嚜鍔ㄤ粠鏁版嵁婧� JDBC URL 瑙f瀽
+ database: ruoyi-vue-pro # 澶囦唤鐩爣鏁版嵁搴擄紝鐣欑┖鑷姩浠庢暟鎹簮 JDBC URL 瑙f瀽
+ username: root # 澶囦唤璐﹀彿锛岀暀绌轰娇鐢ㄦ暟鎹簮璐﹀彿
+ password: '123456' # 澶囦唤瀵嗙爜锛岀暀绌轰娇鐢ㄦ暟鎹簮瀵嗙爜
+ command: # mysqldump 鍛戒护锛岀暀绌鸿嚜鍔ㄦ娴嬮儴缃茬幆澧冿紙鏈満 mysqldump 鎴� Docker MySQL 瀹瑰櫒锛夛紱鍙墜鍔ㄦ寚瀹氾紝濡傦細docker exec mysql8 mysqldump
diff --git a/yudao-server/src/main/resources/application-jhhg.yaml b/yudao-server/src/main/resources/application-jhhg.yaml
index 1a4bb4f..a996022 100644
--- a/yudao-server/src/main/resources/application-jhhg.yaml
+++ b/yudao-server/src/main/resources/application-jhhg.yaml
@@ -220,3 +220,10 @@
compress: true # 鏄惁鍘嬬缉鍥剧墖
need-compress-size: 10MB # 瑙﹀彂鍘嬬缉鐨勬枃浠跺ぇ灏忛槇鍊�
compress-quality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
+ database-backup: # 鏁版嵁搴撳浠介厤缃�
+ host: 172.17.0.1 # 澶囦唤鐩爣 MySQL 涓绘満锛岀暀绌鸿嚜鍔ㄤ粠鏁版嵁婧� JDBC URL 瑙f瀽
+ port: 9002 # 澶囦唤鐩爣 MySQL 绔彛锛岀暀绌鸿嚜鍔ㄤ粠鏁版嵁婧� JDBC URL 瑙f瀽
+ database: ruoyi-vue-pro # 澶囦唤鐩爣鏁版嵁搴擄紝鐣欑┖鑷姩浠庢暟鎹簮 JDBC URL 瑙f瀽
+ username: root # 澶囦唤璐﹀彿锛岀暀绌轰娇鐢ㄦ暟鎹簮璐﹀彿
+ password: 'jhhg@123456..' # 澶囦唤瀵嗙爜锛岀暀绌轰娇鐢ㄦ暟鎹簮瀵嗙爜
+ command: # mysqldump 鍛戒护锛岀暀绌鸿嚜鍔ㄦ娴嬮儴缃茬幆澧冿紙鏈満 mysqldump 鎴� Docker MySQL 瀹瑰櫒锛夛紱鍙墜鍔ㄦ寚瀹氾紝濡傦細docker exec mysql8 mysqldump
diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml
index e02b801..45e498f 100644
--- a/yudao-server/src/main/resources/application-local.yaml
+++ b/yudao-server/src/main/resources/application-local.yaml
@@ -198,3 +198,10 @@
compress: true # 鏄惁鍘嬬缉鍥剧墖
need-compress-size: 10MB # 瑙﹀彂鍘嬬缉鐨勬枃浠跺ぇ灏忛槇鍊�
compress-quality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
+ database-backup: # 鏁版嵁搴撳浠介厤缃�
+ host: localhost # 澶囦唤鐩爣 MySQL 涓绘満锛岀暀绌鸿嚜鍔ㄤ粠鏁版嵁婧� JDBC URL 瑙f瀽
+ port: 3306 # 澶囦唤鐩爣 MySQL 绔彛锛岀暀绌鸿嚜鍔ㄤ粠鏁版嵁婧� JDBC URL 瑙f瀽
+ database: ruoyi-vue-pro # 澶囦唤鐩爣鏁版嵁搴擄紝鐣欑┖鑷姩浠庢暟鎹簮 JDBC URL 瑙f瀽
+ username: root # 澶囦唤璐﹀彿锛岀暀绌轰娇鐢ㄦ暟鎹簮璐﹀彿
+ password: '123456' # 澶囦唤瀵嗙爜锛岀暀绌轰娇鐢ㄦ暟鎹簮瀵嗙爜
+ command: # mysqldump 鍛戒护锛岀暀绌鸿嚜鍔ㄦ娴嬮儴缃茬幆澧冿紙鏈満 mysqldump 鎴� Docker MySQL 瀹瑰櫒锛夛紱鍙墜鍔ㄦ寚瀹氾紝濡傦細docker exec mysql8 mysqldump
diff --git a/yudao-server/src/main/resources/application-test.yaml b/yudao-server/src/main/resources/application-test.yaml
index 87685e3..55c7ba0 100644
--- a/yudao-server/src/main/resources/application-test.yaml
+++ b/yudao-server/src/main/resources/application-test.yaml
@@ -220,3 +220,10 @@
compress: true # 鏄惁鍘嬬缉鍥剧墖
need-compress-size: 10MB # 瑙﹀彂鍘嬬缉鐨勬枃浠跺ぇ灏忛槇鍊�
compress-quality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
+ database-backup: # 鏁版嵁搴撳浠介厤缃�
+ host: 172.17.0.1 # 澶囦唤鐩爣 MySQL 涓绘満锛岀暀绌鸿嚜鍔ㄤ粠鏁版嵁婧� JDBC URL 瑙f瀽
+ port: 11101 # 澶囦唤鐩爣 MySQL 绔彛锛岀暀绌鸿嚜鍔ㄤ粠鏁版嵁婧� JDBC URL 瑙f瀽
+ database: ruoyi-vue-pro # 澶囦唤鐩爣鏁版嵁搴擄紝鐣欑┖鑷姩浠庢暟鎹簮 JDBC URL 瑙f瀽
+ username: root # 澶囦唤璐﹀彿锛岀暀绌轰娇鐢ㄦ暟鎹簮璐﹀彿
+ password: 'xd@123456..' # 澶囦唤瀵嗙爜锛岀暀绌轰娇鐢ㄦ暟鎹簮瀵嗙爜
+ command: # mysqldump 鍛戒护锛岀暀绌鸿嚜鍔ㄦ娴嬮儴缃茬幆澧冿紙鏈満 mysqldump 鎴� Docker MySQL 瀹瑰櫒锛夛紱鍙墜鍔ㄦ寚瀹氾紝濡傦細docker exec mysql8 mysqldump
diff --git a/yudao-server/src/main/resources/application-wtxc.yaml b/yudao-server/src/main/resources/application-wtxc.yaml
index 674f67a..2f1a522 100644
--- a/yudao-server/src/main/resources/application-wtxc.yaml
+++ b/yudao-server/src/main/resources/application-wtxc.yaml
@@ -220,3 +220,10 @@
compress: true # 鏄惁鍘嬬缉鍥剧墖
need-compress-size: 10MB # 瑙﹀彂鍘嬬缉鐨勬枃浠跺ぇ灏忛槇鍊�
compress-quality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
+ database-backup: # 鏁版嵁搴撳浠介厤缃�
+ host: 172.17.0.1 # 澶囦唤鐩爣 MySQL 涓绘満锛岀暀绌鸿嚜鍔ㄤ粠鏁版嵁婧� JDBC URL 瑙f瀽
+ port: 9002 # 澶囦唤鐩爣 MySQL 绔彛锛岀暀绌鸿嚜鍔ㄤ粠鏁版嵁婧� JDBC URL 瑙f瀽
+ database: mom-wtxc # 澶囦唤鐩爣鏁版嵁搴擄紝鐣欑┖鑷姩浠庢暟鎹簮 JDBC URL 瑙f瀽
+ username: root # 澶囦唤璐﹀彿锛岀暀绌轰娇鐢ㄦ暟鎹簮璐﹀彿
+ password: 'wtxc@123456..' # 澶囦唤瀵嗙爜锛岀暀绌轰娇鐢ㄦ暟鎹簮瀵嗙爜
+ command: # mysqldump 鍛戒护锛岀暀绌鸿嚜鍔ㄦ娴嬮儴缃茬幆澧冿紙鏈満 mysqldump 鎴� Docker MySQL 瀹瑰櫒锛夛紱鍙墜鍔ㄦ寚瀹氾紝濡傦細docker exec mysql8 mysqldump
diff --git a/yudao-server/src/main/resources/application-yzfx.yaml b/yudao-server/src/main/resources/application-yzfx.yaml
index d97275e..a9c5d64 100644
--- a/yudao-server/src/main/resources/application-yzfx.yaml
+++ b/yudao-server/src/main/resources/application-yzfx.yaml
@@ -220,3 +220,10 @@
compress: true # 鏄惁鍘嬬缉鍥剧墖
need-compress-size: 10MB # 瑙﹀彂鍘嬬缉鐨勬枃浠跺ぇ灏忛槇鍊�
compress-quality: 0.5 # 鍘嬬缉璐ㄩ噺(0.0-1.0)
+ database-backup: # 鏁版嵁搴撳浠介厤缃�
+ host: 172.17.0.1 # 澶囦唤鐩爣 MySQL 涓绘満锛岀暀绌鸿嚜鍔ㄤ粠鏁版嵁婧� JDBC URL 瑙f瀽
+ port: 9002 # 澶囦唤鐩爣 MySQL 绔彛锛岀暀绌鸿嚜鍔ㄤ粠鏁版嵁婧� JDBC URL 瑙f瀽
+ database: ruoyi-vue-pro # 澶囦唤鐩爣鏁版嵁搴擄紝鐣欑┖鑷姩浠庢暟鎹簮 JDBC URL 瑙f瀽
+ username: root # 澶囦唤璐﹀彿锛岀暀绌轰娇鐢ㄦ暟鎹簮璐﹀彿
+ password: 'yzfx@123456..' # 澶囦唤瀵嗙爜锛岀暀绌轰娇鐢ㄦ暟鎹簮瀵嗙爜
+ command: # mysqldump 鍛戒护锛岀暀绌鸿嚜鍔ㄦ娴嬮儴缃茬幆澧冿紙鏈満 mysqldump 鎴� Docker MySQL 瀹瑰櫒锛夛紱鍙墜鍔ㄦ寚瀹氾紝濡傦細docker exec mysql8 mysqldump
--
Gitblit v1.9.3