zoukankan      html  css  js  c++  java
  • Java实现数据库备份并利用ant导入SQL脚本

    数据备份对于经常在运维部署方面的工作者来说,是一件相对简单的事情,都可以通过某一个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 {
    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;
    }
    return resultMap;
    }

    欢迎关注微信公众号:摘星族,我们在等待您的加入。 

  • 相关阅读:
    mysql基础语句
    .opt,frm,.MYD,.MYI文件如何转为.sql文件?
    如何使用phpstudy本地搭建多站点(每个站点对应不同的端口)
    吐槽下微软的vs code编辑器
    补码的两个重要问题
    注意力不集中是因为你没有紧迫感
    弧度与角度的转换公式推导
    ps图层面板上的【透明度】与【填充】的区别
    【ctrl+A】与【ctrl+单击图层缩略图】有什么区别?
    DRF-认证 权限 频率组件
  • 原文地址:https://www.cnblogs.com/zhaixingzhu/p/12569251.html
Copyright © 2011-2022 走看看