diff --git a/lab-service/lab-system/src/main/java/org/springblade/system/util/SqlBackup.java b/lab-service/lab-system/src/main/java/org/springblade/system/util/SqlBackup.java new file mode 100644 index 0000000..13ab1f7 --- /dev/null +++ b/lab-service/lab-system/src/main/java/org/springblade/system/util/SqlBackup.java @@ -0,0 +1,127 @@ +package org.springblade.system.util; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; + +import java.io.File; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.logging.Logger; + +/** + * @Description 数据库备份工具类 + * @Author ytl + * @Date 2022/9/28 0028 8:52 + */ + +@Slf4j +public class SqlBackup { + + /** + * 获取操作系统类型,window 返回true,linux返回false + * @return + */ + public static boolean isWindowsSystem() { + String osName = System.getProperty("os.name").toLowerCase(); + Boolean flag = null; + if (osName.startsWith("windows")) { + flag = true; + } else if (osName.startsWith("linux")) { + flag = false; + } + return flag; + } + + /** + * 获取数据库名 + */ + public static String getDataBaseName(String url) { + return url.substring(url.indexOf("3306"), url.indexOf("?")).replaceAll("/", "").replaceAll("3306", ""); + } + + /** + * 获取主机地址,ip:port + */ + public static String getHost(String url) { + String s = url.substring(url.indexOf("mysql"), url.indexOf("?")).replace("//", "").replace("mysql", "") + .split("/")[0]; + return s.substring(1,s.length()); + } + + /** + * 备份数据库 + * @param url + * @param name + * @param password + * @param path + */ + public static void backup(String url,String name,String password,String path){ + + String host = getHost(url); + String[] split = host.split(":"); + // 获取ip + String ip = split[0]; + // 获取端口号 + String port = split[1]; + // 获取数据库名称 + String database_name = getDataBaseName(url); + + // 最终保存到磁盘中的数据库文件名称 + StringBuilder mysqlFileName = new StringBuilder() + .append(database_name) + .append("_") + .append(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))) + .append(".sql"); + // 备份命令 + StringBuilder cmd = new StringBuilder() + .append("mysqldump ") + .append("--no-tablespaces ") + .append("-h") + .append(ip) + .append(" -u") + .append(name) + .append(" -p") + .append(password) + // 排除MySQL备份表 + .append(" --ignore-table ") + .append(database_name) + .append(".mysql_backups ") + .append(database_name) + .append(" > ") + .append(path) + .append(mysqlFileName); + + // 判断文件夹是否存在 + File saveFile = new File(path); + if (!saveFile.exists()) { + saveFile.mkdirs(); + } + + // 获取操作系统名称 + String osName = System.getProperty("os.name").toLowerCase(); + String[] command = new String[0]; + if (isWindowsSystem()) { + // Windows + command = new String[]{"cmd", "/c", String.valueOf(cmd)}; + } else { + // Linux + command = new String[]{"/bin/sh", "-c", String.valueOf(cmd)}; + } + + // 获取Runtime实例 + Process process = null; + try { + process = Runtime.getRuntime().exec(command); + if (process.waitFor() == 0) { + log.info("Mysql 数据库备份成功,备份文件名:{}", mysqlFileName); + } else { + int value = HttpStatus.INTERNAL_SERVER_ERROR.value(); + log.error( "网络异常,数据库备份失败1"); + } + } catch (Exception e) { + e.printStackTrace(); + int value = HttpStatus.INTERNAL_SERVER_ERROR.value(); + log.error( "网络异常,数据库备份失败2"); + } + } +}