文档章节

MySQL windows中的存储备份

o
 osc_y8yehimr
发布于 2019/03/20 16:00
字数 748
阅读 27
收藏 0

精选30+云产品,助力企业轻松上云!>>>

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

}

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

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

es集群笔记

es 集群的默认配置是当集群中的某个节点磁盘达到使用率为 85% 的时候, 就不会在该节点进行创建副本, 当磁盘使用率达到 90% 的时候, 尝试将该节点的副本重分配到其他节点. 当磁盘使用率达到 ...

gaolongquan
12分钟前
4
0
VS Code编写Vue过程中出现空格不规范报错的问题

报错内容: 解决办法: 1.注释或删除这些代码 注释掉之后(重启vue服务),再进行编写的时候,空格不规范的情况下就不会再报错了。 2.如果没在webpack.dev.conf.js文件中找到注释代码就在webpack...

安然_oschina
14分钟前
9
0
域名防封_域名防红_微信域名防拦截

最近微信开始大封杀,不知道原因是什么,可能是因为违规网站太多了吧,很多网站都被错杀了,下面我们聊一下怎样才能避免域名被封杀呢。 在各种不同的域名当中,能够做出了更适合的选择,这些...

戚馨逸
18分钟前
13
0
数据结构(六)——循环链表

一、循序链表简介 1、循环链表的定义 循环链表的任意元素都有一个前驱和一个后继,所有数据元素在关系上构成逻辑上的环。 循环链表是一种特殊的单链表,尾结点的指针指向首结点的地址。 循环...

rainbowcode
21分钟前
13
0
六边形寻路格子绘制

using System.Collections;using System.Collections.Generic;using UnityEngine;public class AdventureIsland : MonoBehaviour{ static AdventureIsland instante; pu......

江湖令
22分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部