• MySQL windows中的存储备份


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

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

    其中path为mysql的安装位置:

    D:mysqlmysql-5.6.35-winx64in

     

    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 + "
    ");
            }
            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;
    
    }

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

  • 相关阅读:
    妙用sql的统计进行集合的比较
    kissy学习笔记(1)上手kissy
    Ext与现有项目的结合(一)完全封装已有的HTML元素使之成为Ext的组件
    Fix IE6 剪贴板撤销机制CtrlZ,CtrlY功能会在由于Js动态改变页面元素的value后失效的Problem
    Ajax个人开发心得(一)先从一个最简单的ajax功能模块说起,Ajax技术其实很简单
    【转】仅用 []()+! 就足以实现几乎任意Javascript代码
    为什么不用13px字体
    Ajax个人开发心得(二)页面逻辑与页面表现的分离,让你的Ajax编程更加模块化
    纯JS转换Select为Combox,完美实现原select所有功能
    关于window.parent的奇怪问题
  • 原文地址:https://www.cnblogs.com/zhaixingzhu/p/sql.html
Copyright © 2020-2023  润新知