MySQL windows中的存储备份

数据备份对于经常在运维部署方面的工作者来说,是一件相对简单的事情,都可以通过某一个SQL工具进行备份,但是如果在项目运行当中,我们需要对数据进行实时,或者是每隔一星期,一个月,等等进行数据的备份,这样就需要java工具来操作备份SQL文件,目前可以通过调用mysql安装的命令进行数据备份,另外通过Job任务调度器进行配合使用,这里技术选型为Quartz。

 

在下面代码当中address为SQL脚本文件存放的地址。

其中path为mysql的安装位置:

D:\mysql\mysql-5.6.35-winx64\bin

 

 

public Map<String, Object> exportDatabase(String address) {
    Map<String, Object> resultMap = new HashedMap();
    try {
        String path = PropertiesFileUtil.getInstance("sql").get("path");
        String root = PropertiesFileUtil.getInstance("sql").get("sql.jdbc.username");
        String dataBase = PropertiesFileUtil.getInstance("sql").get("sql.jdbc.dataBase");
        String table = PropertiesFileUtil.getInstance("sql").get("sql.jdbc.table");
        String password = PropertiesFileUtil.getInstance("sql").get("sql.jdbc.password");
        String sqlName = System.currentTimeMillis() + ".sql";
        Runtime rt = Runtime.getRuntime();
        Process child = rt.exec(path + "mysqldump -u" + root + " -p" + password + " -R -c --set-charset=utf8 " + dataBase + " " + table + "");
        InputStream in = child.getInputStream();
        InputStreamReader xx = new InputStreamReader(in, "utf8");
        String inStr;
        StringBuffer sb = new StringBuffer("");
        String outStr;
        BufferedReader br = new BufferedReader(xx);
        while ((inStr = br.readLine()) != null) {
            sb.append(inStr + "\r\n");
        }
        outStr = sb.toString();

        FileOutputStream fout = new FileOutputStream(address + "/" + sqlName);
        OutputStreamWriter writer = new OutputStreamWriter(fout, "utf8");
        writer.write(outStr);
        writer.flush();
        in.close();
        xx.close();
        br.close();
        writer.close();
        fout.close();
        resultMap.put("result", "success");
        resultMap.put("data", address + "/" + sqlName);
        return resultMap;
    } catch (Exception e) {
        e.printStackTrace();
    }
    resultMap.put("result", "fail");
    resultMap.put("data", "地址选择有可能出现问题");
    return resultMap;
}

 

上述代码当中主要的是用到了Runtime,Runtime封装了运行环境,每一个java运行实例都有一个Runtime类为实例,使程序能够与其环境相接。

一般不能实例化一个Runtime对象,应用程序不能创建自己的Runtime实例,但是可以通过getRuntime的方法获取当前Runtime运行时对象的引用。

一旦得到当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制java虚拟机的状态和行为。

 

执行SQL脚本,我们可以通过ant来实现,首先我们引入ant的jar包

<!-- https://mvnrepository.com/artifact/org.apache.ant/ant -->

<dependency>

    <groupId>org.apache.ant</groupId>

    <artifactId>ant</artifactId>

    <version>1.7.1</version>

</dependency>
 

具体代码实现逻辑:

public Map<String, Object> importDatabase(String filepath) {

    Map<String, Object> resultMap = new HashedMap();

    try {

        try {

            String username = PropertiesFileUtil.getInstance("sql").get("sql.jdbc.username");

            String password = PropertiesFileUtil.getInstance("sql").get("sql.jdbc.password");

            String url = PropertiesFileUtil.getInstance("sql").get("sql.jdbc.url");

            String driverClassName =PropertiesFileUtil.getInstance("sql").get("sql.jdbc.driver");

            String filepathName = filepath.substring(0, filepath.lastIndexOf("."));

            String outputPath = filepathName + ".out";



            SQLExec sqlExec = new SQLExec();

            //设置数据库参数

            sqlExec.setDriver(driverClassName);

            sqlExec.setUrl(url);

            sqlExec.setUserid(username);

            sqlExec.setPassword(password);

            //设置字符编码

            sqlExec.setEncoding("UTF-8");

            //要执行的脚本

            sqlExec.setSrc(new File(filepath));

            //有出错的语句该如何处理

            sqlExec.setOnerror((SQLExec.OnError) (EnumeratedAttribute.getInstance(

                    SQLExec.OnError.class, "abort")));

            sqlExec.setPrint(true); //设置是否输出

            //输出到文件 sql.out 中;不设置该属性,默认输出到控制台

            sqlExec.setOutput(new File(outputPath));

            sqlExec.setProject(new Project()); // 要指定这个属性,不然会出错

            sqlExec.execute();

            logger.info("执行sql脚本文件成功");

            resultMap.put("result", "success");

        } catch (Exception e) {

            logger.info("执行sql脚本文件失败");

            e.printStackTrace();

            resultMap.put("result", "fail");

            return resultMap;

        }

    } catch (Exception e) {

        e.printStackTrace();

    }

    return resultMap;

}

欢迎关注微信公众号“摘星族”,我们不仅仅是代码的搬运工,同时也是代码的分享者

posted @ 2019-03-20 16:00  路大师_XA  阅读(442)  评论(0编辑  收藏  举报