wuxw
2022-05-12 9fa4f824a14d293b1be8bb7ed997330220a2f1d4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package com.java110.job.task.backupDatabase;
 
import com.java110.dto.task.TaskDto;
import com.java110.job.quartz.TaskSystemQuartz;
import com.java110.utils.cache.MappingCache;
import com.java110.utils.util.StringUtil;
import org.slf4j.Logger;
import com.java110.core.log.LoggerFactory;
import org.springframework.stereotype.Component;
 
import java.io.File;
import java.io.FileInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
 
/**
 * 备份数据库定时任务
 *
 * @author fqz
 * @date 2021-08-04 14:36
 */
@Component
public class BackupDatabaseTemplate extends TaskSystemQuartz {
 
    private static Logger logger = LoggerFactory.getLogger(BackupDatabaseTemplate.class);
 
    //域
    public static final String DOMAIN_COMMON = "DOMAIN.COMMON";
 
    //键(tt)
    public static final String BACKUP_DATABASE = "TT_BACKUP_DATABASE";
 
    //键(hc_community)
    public static final String HC_COMMUNITY_BACKUP_DATABASE = "HC_COMMUNITY_BACKUP_DATABASE";
 
    //键(备份的数据库文件存储位置)
    public static final String FILE_LOCATION = "FILE_LOCATION";
 
    //键(区分windows和linux操作系统)
    public static final String LINUX_OR_WINDOWS = "LINUX_OR_WINDOWS";
 
    @Override
    protected void process(TaskDto taskDto) throws Exception {
        logger.debug("======开始执行数据库备份======" + taskDto.toString());
        //取出tt库开关映射的值
        String val = MappingCache.getValue(DOMAIN_COMMON, BACKUP_DATABASE);
        //取出hc_community库开关映射的值
        String hcVal = MappingCache.getValue(DOMAIN_COMMON, HC_COMMUNITY_BACKUP_DATABASE);
        //取出数据库文件存储位置
        String fileUrl = MappingCache.getValue(DOMAIN_COMMON, FILE_LOCATION);
        if (StringUtil.isEmpty(fileUrl)) {
            throw new IllegalArgumentException("文件存储位置不能为空!");
        }
        //备份tt库
        if (!StringUtil.isEmpty(val)) {
            String[] split = val.split("&");
            String userName = split[0];
            String password = split[1];
            String databaseName = split[2];
            String port = split[3];
            String backName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + "-tt.sql";
            BackupDatabaseTemplate.dbBackUp(userName, password, databaseName, fileUrl, backName, port);
        }
        //备份hc_community库
        if (!StringUtil.isEmpty(hcVal)) {
            String[] split = val.split("&");
            String userName = split[0];
            String password = split[1];
            String databaseName = split[2];
            String port = split[3];
            String backName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + "-hc_community.sql";
            BackupDatabaseTemplate.dbBackUp(userName, password, databaseName, fileUrl, backName, port);
        }
    }
 
    /**
     * 导出tt数据库
     *
     * @param userName
     * @param password
     * @param dbName
     * @param backPath
     * @param backName
     * @param port
     * @throws Exception
     */
    public static void dbBackUp(String userName, String password, String dbName, String backPath, String backName, String port) throws Exception {
        //获取操作系统区分标识
        String operatingSystem = MappingCache.getValue(DOMAIN_COMMON, LINUX_OR_WINDOWS);
        String pathSql = backPath + backName;
        //创建备份sql文件
        try {
            File file = new File(pathSql);
            System.out.println("======文件位置======:" + file);
            if (!file.exists()) {
                file.createNewFile();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        StringBuffer sb = new StringBuffer();
        sb.append("mysqldump");
        sb.append(" -h" + port);
        sb.append(" -u" + userName);
        sb.append(" -p" + password);
        sb.append(" " + dbName + " >");
        sb.append(" " + pathSql);
        System.out.println("======命令为======:" + sb.toString());
        Runtime runtime = Runtime.getRuntime();
        System.out.println("======开始备份数据库======:" + dbName);
        if (!StringUtil.isEmpty(operatingSystem) && operatingSystem.equals("1")) { //1表示windows操作系统
            Process process = runtime.exec("cmd /c" + sb.toString());
            System.out.println("======返回结果======:" + process.toString());
        } else if (!StringUtil.isEmpty(operatingSystem) && operatingSystem.equals("2")) { //2表示linux操作系统
            Process process = runtime.exec("/home/mysql/mysql/bin/" + sb.toString());
            System.out.println("======返回结果======:" + process.toString());
        }
        System.out.println("======备份数据库" + dbName + "成功!======");
    }
 
}