日期:2014-05-16 浏览次数:20501 次
import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import java.util.Date; import com.jysd.ms.exception.BaseException; import com.jysd.ms.util.ReadSystemConfig; import com.jysd.ms.util.TimeCountUtil; import com.opensymphony.xwork2.ActionSupport; public class IEEM060501Action extends ActionSupport { private static final long serialVersionUID = 1L; private Runtime runtime = Runtime.getRuntime(); private Process process = null ; //返回前台数据 private String message; //备份文件地址 private String backupUrl ; //备份文件名 private String dmpName; //备份方式 private int backupMode; //备份类型 private int backupType; /** * @方法名称: execute * @描述: 数据备份管理初始化方法 * 创建人: * @return String * @param @return */ public String execute()throws BaseException{ backupUrl = ReadSystemConfig.getValue("backupPath"); return SUCCESS; } /** * @方法名称: backup * @描述: 备份数据库 * 创建人: * @return String * @param @return * @param @throws BaseException */ public String backup()throws BaseException{ //从配置文件中读取数据库信息,并备份数据库 boolean backupFlag = backupOracleDB(getExpString()); if(backupFlag){ message="备份成功!"; }else{ message="备份失败!"; } return "backJson"; } /** * @方法名称: backupOracleDB * @描述: 备份、还原 mysql数据库的方法 * 创建人: * @return boolean * @param @param cmdStr 备份命令 ( 即导出 ) * @param @return */ public boolean backupOracleDB(String cmdStr) { boolean isSuccess = true; try { process = runtime .exec(cmdStr); String line = null; BufferedReader br = new BufferedReader(new InputStreamReader(process.getErrorStream())); //读取ErrorStream很关键,这个解决了挂起的问题。 while ((line = br.readLine()) != null){ System.out.println(line); } br = new BufferedReader(new InputStreamReader(process.getInputStream())); while ((line = br.readLine()) != null){ System.out.println(line); } //process.waitFor(); if(process.waitFor()!=0){ isSuccess = false; } }catch (Exception e) { e.printStackTrace(); isSuccess = false; } return isSuccess ; } /** * @方法名称: getLeftMenu * @描述: 获取备份数据库的执行语句,备份文件名称,以当前时间命名 * @创建人: * @return String * @param @throws BaseException */ private String getExpString()throws BaseException{ StringBuffer sbu = new StringBuffer(); try { sbu.append(ReadSystemConfig.getValue("mysqlPath")); sbu.append("mysqldump "); sbu.append("-h "); sbu.append(ReadSystemConfig.getValue("ipaddress")); sbu.append(" "); sbu.append("-u"); sbu.append(ReadSystemConfig.getValue("username")); sbu.append(" "); sbu.append("-p"); sbu.append(ReadSystemConfig.getValue("password")); sbu.append(" "); /* * 这只是一个快捷选项,等同于同时添加 * --add-drop-table,--add-locks,--create-options,--quick,--extended-insert, * --lock-tables,--set-charset,--disable-keys选项。 * 本选项能让 mysqldump 很快的导出数据,并且导出的数据能很快导回。 * 该选项默认开启,但可以用 --skip-opt 禁用。 */ sbu.append("--opt "); //该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中 sbu.append("-q "); // //sbu.append("--lock-all-tables=true "); // //sbu.append("--complete-insert=false "); //每条记录对应一个insert语句 sbu.append("--extended-insert=false "); sbu.append("--result-file="); String filePath = ReadSystemConfig.getValue("backupPath"); File file = new File(filePath); if(!file.exists()){ file.mkdirs(); } sbu.append(filePath); //-start-数据库备份文件名称---------------------- //用户备份的名称为空时,以当前系统时间为备份名称;不为空时,在后面缀上系统时间 Date date = new Date(); if(dmpName==null){ dmpName = TimeCountUtil.dateToString(date,"yyyyMMddHHmmss"); }else{ dmpNa