相信很多朋友都经历过数据库出问题的情况,我也同样(见我的上一篇博文:phpmyadmin误删表后的恢复过程(心惊胆跳啊)   )。如果数据很大或者很重要,那么恢复起来是相当困难的,所以我们在做一个相对完善的系统时,数据库的备份/还原功能是必不可少的。本文将在javaEE环境下实现MySQL的自动备份/还原,使用了struts2和hibernate框架,MySQL版本是5.1.16。

  下图展示的是web application的执行流程,

  

  Timer是在一个随着application启动而启动的servlet中初始化,并接受一个名叫‘BACKUP_DEPLY'的参数,它告诉Timer多久去备份一次数据库(单位为小时):

  

   <servlet>
<servlet-name>StartupServlet</servlet-name>
<servlet-class>com.nerve.web.servlet.StartupServlet</servlet-class> <load-on-startup>1</load-on-startup> <init-param>
<param-name>BACKUP_DELAY</param-name>
<param-value>24</param-value><!--自动备份程序执行间隔,单位为小时-->
</init-param>
</servlet>

  每次备份数据库后,会将备份信息保存到数据库中,为此我们定义了一个PO,如下:

 public class Backup{
private int id;
private String name;
private long size;
private Date addDate; //setter and getter
}

  

  

  

  上图是备份过程中主要用到的类,大概过程为:

  1.当Timer开始执行备份操作时,会调用BackupService(BackupServiceImpl为其实现类)中的backup()方法

  2.BackupService会实例化一个BackWorker(MySQLBackupWorker为其实现类),并调用它的backup(boolean isRestore)throws Excetion方法来完成备份

  3.当BackupWorker的isDone()方法返回true时,则表示备份成功(这时可以通过BackupWorker的getFileName()方法获取保存的文件名),否则是失败

  

  BackupWorker接口定义如下:

 public interface BackupWorker {

     public void backup(boolean isRestore) throws Exception;

     public void reload(String path) throws Exception;

     /**
* 是否备份成功
* @method name: isDone
* @return type: boolean
* @return
*/
public boolean isDone(); /**
* 获取备份后文件的名称(不包括目录)
* @method name: getFileName
* @return type: String
* @return
*/
public String getFileName(); /**
* 获取备份后文件的大小
* @method name: getFileSize
* @return type: long
* @return
*/
public long getFileSize(); /**
* 获取配置文件中自动备份的时间间隔,单位为小时
* @method name: getHours
* @return type: int
* @return
*/
public int getHours(); /**
* 更新自动备份的时间间隔
* @method name: setHours
* @return type: void
* @param hours
*/
public void setHours(int hours); /**
* 删除备份文件
* @method name: delete
* @return type: void
* @param fileName
*/
public void delete(String fileName);
}

  MySQLBackupWorker是MySQL的备份/还原类,实现了BackupWorker接口,在构造函数被执行时,会读取我们预设的MySQL相关设置(即上面类图中的MySQLBackup.properties),配置文件中包含如下内容:

(使用时,请将这些配置修改为本机的实际值,当OS为Linux是,mysqlpath可以不用设置,前提是 mysqldump 命令有效)

下面是MySQLBackupWorker中在window环境下的备份实现(默认的编码是utf-8,可以改为本机值):

 public void backup(boolean isRe) throws Exception {
boolean isWindow = isWindowsOS();
isRestore = isRe;
if(isWindow){
this.backupWindow();
}else{
this.backupLinux();
}
} /**
* window下的mysql备份
* @method name: backupWindow
* @return type: void
*/
private void backupWindow(){
try {
String sqlPath = bkPath + getBackupName();
mkDir(sqlPath); StringBuffer sb = new StringBuffer();
sb.append(mysqlPath);
sb.append("mysqldump ");
sb.append("--opt ");
sb.append("-h ");
sb.append(host);
sb.append(" ");
sb.append("--user=");
sb.append(loginName);
sb.append(" ");
sb.append("--password=");
sb.append(loginPass);
sb.append(" ");
sb.append("--lock-all-tables=true ");
sb.append("--result-file=");
sb.append(sqlPath);
sb.append(" ");
sb.append("--default-character-set=utf8 ");
sb.append(dbName); System.out.println(sb.toString());
Runtime cmd = Runtime.getRuntime();
try {
Process p = cmd.exec(sb.toString());
int tag = p.waitFor();
System.out.println("result::: "+tag);
if(tag == 0)
done = true;
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}

获取更多源代码:源代码

【本文为小弟原创文章,引用请注明出处,谢谢】

java实现的MySQL自动备份和还原(struts2+Hibernate)---兼容 window+Linux的更多相关文章

  1. Mysql自动备份与还原 转

    Mysql自动备份与还原 一.自动备份:将以下代码保存为*.bat批处理脚本,然后再添加Windows定时作业,如每天凌晨2点执行:set s=%date:~0,4%%date:~5,2%%date: ...

  2. Java Web 实现Mysql 数据库备份与还原

    前段时间某某删库事故付出的惨重代价告诉我们: 数据备份的必要性是企业数据管理极其重要的一项工作. 1. Mysql备份与还原命令 备份命令: mysqldump -h127.0.0.1 -uroot ...

  3. MySQL的备份和还原

    MySQL的备份和还原 备份:副本    RAID1,RAID10:保证硬件损坏而不会业务中止:        DROP TABLE mydb.tb1; 备份类型:        热备份.温备份和冷备 ...

  4. MySQL的备份与还原以及常用数据库查看命令

    MySQL命令行导出数据库: 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:\Program Files\MySQL\MySQL Serv ...

  5. mysql数据库备份与还原(转)

    MySQL备份和还原,都是利用mysqldump.mysql和source命令来完成的. 1.Linux下MySQL的备份与还原 1.1 备份 [root@localhost ~]# cd /var/ ...

  6. MySQL学习——备份和还原

    MySQL学习——备份和还原 摘要:本文主要学习了如何备份和还原数据库. 部分内容来自以下博客: https://www.cnblogs.com/chenmh/p/5300370.html 常用命令 ...

  7. mysql数据库-备份与还原实操

    目录 备份工具 1 基于 LVM 的快照备份(几乎热备) 2 数据库冷备份和还原 3 mysqldump备份工具 3.1 实战备份策略 3.1.1 全备份 3.1.2 分库分表备份 3.2 mysql ...

  8. mysql 自动备份和nginx自动安装脚本

    一.自动备份Mysql脚本: 如下脚本为mysql自动备份脚本,仅供参考,可以根据实际情况修改. #!/bin/sh #auto backup mysql #wugk #Define PATH定义变量 ...

  9. 转 MySQL 数据备份与还原

    MySQL 数据备份与还原 原贴:http://www.cnblogs.com/kissdodog/p/4174421.html   一.数据备份 1.使用mysqldump命令备份 mysqldum ...

随机推荐

  1. Mac 下 Maven 的命令行安装

    JDK 的安装 系统的“系统偏好设置”中我们可以看到 Java的设置, Java 7(含) 之后的版本在这里可以看到. 点击进去后,可以看到独立的 Java 控制面板 注意,这里是 JRE 的版本, ...

  2. SQLite打开提示database disk image is malformed

    SQLite打开提示database disk image is malformed 网上说产生这种错误的原因有很多种,磁盘空间不足,还有就是写入数据过程中突然掉电等. 这种情况,如果数据还可以导出, ...

  3. ListView之setEmptyView的问题

    使用listView或者gridView时,当列表为空时,有时需要显示一个特殊的empty view来提示用户,一般情况下,如果你是继承ListActivity,只要 <ListView and ...

  4. css 使用background背景实现border边框效果

    css中,我们一般使用border给html元素设置边框,但也可以使用background背景来模拟css边框效果,本文章向大家介绍css 使用background背景实现border边框效果,需要的 ...

  5. PERT(计划评审技术,Program Evaluation an Review Technique)

    如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 PERT(计划评审技术,Program Evaluation an Review T ...

  6. 【测试】在hr用户下自行创建T1和T2表写一条SQL语句,(NL连接)

    SQL> select t1.* from t1,t2 where t1.object_id=t2.object_id; rows selected. Execution Plan ------ ...

  7. JSTL的全称:JSP Standard Tag Library, jsp 标准标签库

    JSTL的全称:JSP Standard Tag Library, jsp 标准标签库 JSTL的作用     提供给Java web开发人员一个标准通过的标签函数库和EL来取代传统直接在页面上嵌入j ...

  8. part 设置

    RCC_AHBENR 中的17.18.19.20. 分别是PORTA,PORTB.PORTC.PORTD 的时钟使能控制位,要A.B.C.D 端口有效,置位. 如: RCC -> AHBENR  ...

  9. pxecfg&kickstart生成脚本

    em tm 00:00:00:00:00:12 10.180.1.12 255.255.255.0 173.45.34.25 255.255.255.225 173.45.34.1 em tm 00: ...

  10. javascript 实现HashTable(哈希表)

    一.javascript哈希表简介 javascript里面是没有哈希表的,一直在java,C#中有时候用到了这一种数据结构,javascript里面若没有,感觉非常不顺手.细细看来,其实javasc ...