数据库sql脚本备份/还原工具类

数据库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);


    /**
     * 数据库备份
     *
     * @param dumpPath 备份路径
     * @param dbName   数据库名
     * @param username 数据库用户名
     * @param password 数据库密码
     * @return
     */
    public String dumpSql(String dumpPath, String dbName, String username, String password) {
        return dumpSql(dumpPath, dbName, null, username, password);
    }

    /**
     * 数据库备份
     *
     * @param dumpPath 备份路径
     * @param dbName   数据库名
     * @param username 数据库用户名
     * @param 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;
    }


    /**
     * 还原数据库,使用时需在方法上加事务回滚!!!!!!
     *
     * @param sourcePath 存储文件路径
     * @param dbName     数据库名
     * @param username   数据库用户名
     * @param password   数据库密码
     */
    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")) {
            // Windows
            command = new String[]{"cmd", "/c", String.valueOf(cmd)};
        } else {
            // Linux
            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();
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值