数据库sql脚本备份/还原工具类
import lombok.experimental.UtilityClass;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
@UtilityClass
public class SqldumpUtils {
private static final Logger looger = LoggerFactory.getLogger(SqldumpUtils.class);
public String dumpSql(String dumpPath, String dbName, String username, String password) {
return dumpSql(dumpPath, dbName, null, username, password);
}
public String dumpSql(String dumpPath, String dbName, String tableName, String username, String password) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
File uploadDir = new File(dumpPath);
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}
String space = " ";
StringBuffer cmd = new StringBuffer();
String sqlPath = dumpPath + "/" + dbName + (StringUtils.isNotBlank(tableName) ? "." + tableName : "") + sdf.format(new Date()) + ".sql";
cmd.append("mysqldump -u")
.append(username)
.append(space)
.append("-p")
.append(password)
.append(space)
.append(dbName)
.append(space);
if (StringUtils.isNotBlank(tableName)) {
cmd.append(tableName)
.append(space);
}
cmd.append("-r").append(sqlPath);
try {
looger.info("备份数据库sql{{}}", cmd);
Process exec = Runtime.getRuntime().exec(cmd.toString());
try {
if (exec.waitFor() == 0) {
looger.info("数据库备份成功,保存路径:" + dumpPath);
} else {
looger.error("process.waitFor()={}", exec.waitFor());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException e) {
looger.error("数据库备份失败,执行语句{{}},错误日志{{}}", cmd, ExceptionUtils.getErrorStackTrace(e));
e.printStackTrace();
}
return sqlPath;
}
public void sourceSql(String sourcePath, String dbName, String username, String password) {
if (!new File(String.valueOf(sourcePath)).exists()) {
looger.error("数据库文件{}不存在,还原数据库失败!", sourcePath);
return;
}
String space = " ";
StringBuffer cmd = new StringBuffer()
.append("mysql")
.append(space)
.append("-u")
.append(username)
.append(space)
.append("-p")
.append(password)
.append(space)
.append(dbName)
.append(space)
.append("<")
.append(space)
.append(sourcePath);
String[] command = new String[0];
String osName = System.getProperty("os.name").toLowerCase();
looger.info("还原数据库系统:{}", osName);
if (osName.toLowerCase().contains("windows")) {
command = new String[]{"cmd", "/c", String.valueOf(cmd)};
} else {
command = new String[]{"/bin/sh", "-c", String.valueOf(cmd)};
}
try {
Process exec = Runtime.getRuntime().exec(command);
if (exec.waitFor() == 0) {
looger.info("还原sql{{}}成功!", sourcePath);
}
} catch (Exception e) {
looger.error("数据库恢复失败,执行语句{{}},错误日志{{}}", cmd, ExceptionUtils.getErrorStackTrace(e));
e.printStackTrace();
}
}
}