备份使用的方法:
public class SqlBackupUtil {
private static final Logger log = LoggerFactory.getLogger(SqlBackupUtil.class);
public static void dbBackUp(String ip, String uname, String pwd, String dbName) {
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd-HH-mm-sss");
String backName = dateFormat.format(date) + ".sql";
String pathSql = "";
File fileSql;
boolean inDocker = false;
try {
String osName = System.getProperties().getProperty("os.name");
if (osName.equals("Linux")) {
pathSql = SalishConfig.getBackupPath() + "/" + dbName + "/" + backName;
Path path = Paths.get("/proc/1/cgroup");
if (Files.exists(path)) {
String content = new String(Files.readAllBytes(path));
inDocker = content.contains("docker");
}
} else {
pathSql = SalishConfig.getWinProfile() + "\\" + dbName + "\\" + backName;
}
fileSql = new File(pathSql);
if (!fileSql.exists()) {
if (!fileSql.getParentFile().exists()) {
fileSql.getParentFile().mkdirs();
}
fileSql.createNewFile();
}
StringBuffer sb = new StringBuffer();
if (inDocker) {
sb.append("docker exec mysql sh -c ");
sb.append("\'mysqldump");
sb.append(" -h" + ip);
sb.append(" " + dbName);
sb.append(" -u" + uname);
sb.append(" -p" + pwd + " 2>/dev/null\'");
sb.append(" -r ");
sb.append(pathSql);
} else {
sb.append("mysqldump");
sb.append(" -h " + ip);
sb.append(" -u " + uname);
sb.append(" -p " + pwd);
sb.append(" " + dbName + " ");
sb.append(" -r ");
sb.append(pathSql);
}
log.error(sb.toString());
Process process = null;
if (osName.equals("Linux")) {
BufferedReader bufferedReader = null;
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(fileSql), "utf8"));
if (inDocker) {
process = new ProcessBuilder("/bin/sh", "-c", sb.toString()).start();
} else {
process = Runtime.getRuntime().exec(sb.toString());
}
InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), "utf8");
bufferedReader = new BufferedReader(inputStreamReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
printWriter.println(line);
}
printWriter.flush();
log.info("-==[ 备份结束! ]==-");
} else {
System.out.println("cmd命令为:" + "cmd /c " + sb.toString());
process = Runtime.getRuntime().exec("cmd /c " + sb.toString());
}
process.waitFor();
InputStream is = process.getErrorStream();
InputStreamReader isr = new InputStreamReader(is, "gbk");
System.out.println(isr.getEncoding());
BufferedReader bufr = new BufferedReader(isr);
String line = null;
while ((line = bufr.readLine()) != null) {
System.out.println("error:" + line);
}
isr.close();
log.info("数据库备份结束,备份结果:{}", process.exitValue() == 0 ? "success" : "fail");
} catch (Exception e) {
log.error("数据库备份失败:{}", e.getMessage());
}
}
}
public SqlBackupServiceImpl(Scheduler scheduler) {
this.scheduler = scheduler;
}
public void init() throws SchedulerException, TaskException
{
List<SqlBackup> jobList = this.baseMapper.selectList(new QueryWrapper<>());
for (SqlBackup job : jobList)
{
ScheduleUtils.createScheduleJoGeneral(scheduler, toJob(job), "sqlTask");
}
}
public void updateSchedulerJob(SysJob job, String jobGroup ,String key) throws SchedulerException, TaskException
{
String jobId = key + job.getJobId();
JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup);
if (scheduler.checkExists(jobKey))
{
scheduler.deleteJob(jobKey);
}
ScheduleUtils.createScheduleJoGeneral(scheduler, job, "sqlTask");
}
@Override
@Transactional(rollbackFor = Exception.class)
public void run(SqlBackup backup) throws SchedulerException
{
String jobId = "sqlTask" + backup.getId();
SqlBackup sqlBackup = this.getById(backup.getId());
JobDataMap dataMap = new JobDataMap();
dataMap.put(ScheduleConstants.TASK_PROPERTIES, toJob(sqlBackup));
scheduler.triggerJob(ScheduleUtils.getJobKey(jobId, "SQL"), dataMap);
}