?
数据备份对于经常在运维部署方面的工作者来说,是一件相对简单的事情,都可以通过某一个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 {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;}
欢迎关注微信公众号:摘星族,我们在等待您的加入。
?