您好,欢迎访问一九零五行业门户网

java实现的MySQL自动备份和还原(struts2+Hibernate)---兼容 wi_MySQL

hibernatestruts2
相信很多朋友都经历过数据库出问题的情况,我也同样(见我的上一篇博文:phpmyadmin误删表后的恢复过程(心惊胆跳啊)   )。如果数据很大或者很重要,那么恢复起来是相当困难的,所以我们在做一个相对完善的系统时,数据库的备份/还原功能是必不可少的。本文将在javaee环境下实现mysql的自动备份/还原,使用了struts2和hibernate框架,mysql版本是5.1.16。
下图展示的是web application的执行流程,
timer是在一个随着application启动而启动的servlet中初始化,并接受一个名叫‘backup_deply'的参数,它告诉timer多久去备份一次数据库(单位为小时):
1 2 startupservlet 3 com.nerve.web.servlet.startupservlet 4 5 1 6 7 8 backup_delay 9 2410 11
每次备份数据库后,会将备份信息保存到数据库中,为此我们定义了一个po,如下:
1 public class backup{2 private int id;3 private string name;4 private long size;5 private date adddate;6 7 //setter and getter8 }
上图是备份过程中主要用到的类,大概过程为:
1.当timer开始执行备份操作时,会调用backupservice(backupserviceimpl为其实现类)中的backup()方法
2.backupservice会实例化一个backworker(mysqlbackupworker为其实现类),并调用它的backup(boolean isrestore)throws excetion方法来完成备份
3.当backupworker的isdone()方法返回true时,则表示备份成功(这时可以通过backupworker的getfilename()方法获取保存的文件名),否则是失败
backupworker接口定义如下:
1 public interface backupworker { 2 3 public void backup(boolean isrestore) throws exception; 4 5 public void reload(string path) throws exception; 6 7 /** 8 * 是否备份成功 9 * @method name: isdone10 * @return type: boolean11 *@return12*/13 public boolean isdone();14 15 /**16 * 获取备份后文件的名称(不包括目录)17 * @method name: getfilename18 * @return type: string19 *@return20*/21 public string getfilename();22 23 /**24 * 获取备份后文件的大小25 * @method name: getfilesize26 * @return type: long27 *@return28*/29 public long getfilesize();30 31 /**32 * 获取配置文件中自动备份的时间间隔,单位为小时33 * @method name: gethours34 * @return type: int35 *@return36*/37 public int gethours();38 39 /**40 * 更新自动备份的时间间隔41 * @method name: sethours42 * @return type: void43 *@param hours44*/45 public void sethours(int hours);46 47 /**48 * 删除备份文件49 * @method name: delete50 * @return type: void51 *@param filename52*/53 public void delete(string filename);54 }
mysqlbackupworker是mysql的备份/还原类,实现了backupworker接口,在构造函数被执行时,会读取我们预设的mysql相关设置(即上面类图中的mysqlbackup.properties),配置文件中包含如下内容:
(使用时,请将这些配置修改为本机的实际值,当os为linux是,mysqlpath可以不用设置,前提是 mysqldump 命令有效)
下面是mysqlbackupworker中在window环境下的备份实现(默认的编码是utf-8,可以改为本机值):
1 public void backup(boolean isre) throws exception { 2 boolean iswindow = iswindowsos(); 3 isrestore = isre; 4 if(iswindow){ 5 this.backupwindow(); 6 }else{ 7 this.backuplinux(); 8 } 9 }10 11 /**12 * window下的mysql备份13 * @method name: backupwindow14 * @return type: void15*/16 private void backupwindow(){17 try {18 string sqlpath = bkpath + getbackupname();19 mkdir(sqlpath);20 21 stringbuffer sb = new stringbuffer();22 sb.append(mysqlpath);23 sb.append(mysqldump );24 sb.append(--opt );25 sb.append(-h );26 sb.append(host);27 sb.append( );28 sb.append(--user=);29 sb.append(loginname);30 sb.append( );31 sb.append(--password=);32 sb.append(loginpass);33 sb.append( );34 sb.append(--lock-all-tables=true );35 sb.append(--result-file=);36 sb.append(sqlpath);37 sb.append( );38 sb.append(--default-character-set=utf8 );39 sb.append(dbname);40 41 system.out.println(sb.tostring());42 runtime cmd = runtime.getruntime();43 try {44 process p = cmd.exec(sb.tostring());45 int tag = p.waitfor();46 system.out.println(result::: +tag);47 if(tag == 0)48 done = true;49 } catch (ioexception e) {50 e.printstacktrace();51 }52 } catch (exception e) {53 e.printstacktrace();54 }55 }
获取更多源代码:源代码
 【本文为小弟原创文章,引用请注明出处,谢谢】
其它类似信息

推荐信息