?
數據備份對于經常在運維部署方面的工作者來說,是一件相對簡單的事情,都可以通過某一個SQL工具進行備份,但是如果在項目運行當中,我們需要對數據進行實時,或者是每隔一星期,一個月,等等進行數據的備份,這樣就需要java工具來操作備份SQL文件,目前可以通過調用mysql安裝的命令進行數據備份,另外通過Job任務調度器進行配合使用,這里技術選型為Quartz。
在下面代碼當中address為SQL腳本文件存放的地址。
其中path為mysql的安裝位置:
D:\mysql\mysql-5.6.35-winx64\bin
public MapexportDatabase(String address) {
Map resultMap = newHashedMap();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= newBufferedReader(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);returnresultMap;
}catch(Exception e) {
e.printStackTrace();
}
resultMap.put("result", "fail");
resultMap.put("data", "地址選擇有可能出現問題");returnresultMap;
}
上述代碼當中主要的是用到了Runtime,Runtime封裝了運行環境,每一個java運行實例都有一個Runtime類為實例,使程序能夠與其環境相接。
一般不能實例化一個Runtime對象,應用程序不能創建自己的Runtime實例,但是可以通過getRuntime的方法獲取當前Runtime運行時對象的引用。
一旦得到當前的Runtime對象的引用,就可以調用Runtime對象的方法去控制java虛擬機的狀態和行為。
執行SQL腳本,我們可以通過ant來實現,首先我們引入ant的jar包
org.apache.ant
ant
1.7.1
public MapimportDatabase(String filepath) {
Map resultMap = newHashedMap();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= newSQLExec();//設置數據庫參數
sqlExec.setDriver(driverClassName);
sqlExec.setUrl(url);
sqlExec.setUserid(username);
sqlExec.setPassword(password);//設置字符編碼
sqlExec.setEncoding("UTF-8");//要執行的腳本
sqlExec.setSrc(newFile(filepath));//有出錯的語句該如何處理
sqlExec.setOnerror((SQLExec.OnError) (EnumeratedAttribute.getInstance(
SQLExec.OnError.class, "abort")));
sqlExec.setPrint(true); //設置是否輸出//輸出到文件 sql.out 中;不設置該屬性,默認輸出到控制臺
sqlExec.setOutput(newFile(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");returnresultMap;
}returnresultMap;
}
歡迎關注微信公眾號:摘星族,我們在等待您的加入。
?