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

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

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

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

java实现的MySQL自动备份和还原(struts2+Hibernate)---兼容 window+Linux第1张

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

1   <servlet>
2     <servlet-name>StartupServlet</servlet-name>
3     <servlet-class>com.nerve.web.servlet.StartupServlet</servlet-class>
4     
5     <load-on-startup>1</load-on-startup>
6     
7     <init-param>
8         <param-name>BACKUP_DELAY</param-name>
9         <param-value>24</param-value><!--自动备份程序执行间隔,单位为小时-->
10     </init-param>
11   </servlet>

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

1 public classBackup{
2     private intid;
3     privateString name;
4     private longsize;
5     privateDate addDate;
6     
7     //setter and getter
8 }

java实现的MySQL自动备份和还原(struts2+Hibernate)---兼容 window+Linux第2张

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

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

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

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

BackupWorker接口定义如下:

1 public interfaceBackupWorker {
2 
3     public void backup(boolean isRestore) throwsException;
4     
5     public void reload(String path) throwsException;
6     
7     /**
8 * 是否备份成功
9 * @method name: isDone
10 * @returntype: boolean
11 *    @return
12      */
13     public booleanisDone();
14     
15     /**
16 * 获取备份后文件的名称(不包括目录)
17 * @method name: getFileName
18 * @returntype: String
19 *    @return
20      */
21     publicString getFileName();
22     
23     /**
24 * 获取备份后文件的大小
25 * @method name: getFileSize
26 * @returntype: long
27 *    @return
28      */
29     public longgetFileSize();
30     
31     /**
32 * 获取配置文件中自动备份的时间间隔,单位为小时
33 * @method name: getHours
34 * @returntype: int
35 *    @return
36      */
37     public intgetHours();
38     
39     /**
40 * 更新自动备份的时间间隔
41 * @method name: setHours
42 * @returntype: void
43 *    @paramhours
44      */
45     public void setHours(inthours);
46     
47     /**
48 * 删除备份文件
49 * @method name: delete
50 * @returntype: void
51 *    @paramfileName
52      */
53     public voiddelete(String fileName);
54 }

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

java实现的MySQL自动备份和还原(struts2+Hibernate)---兼容 window+Linux第3张

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

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

1 public void backup(boolean isRe) throwsException {
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: backupWindow
14 * @returntype: void
15  */
16 private voidbackupWindow(){
17     try{
18         String sqlPath = bkPath +getBackupName();
19 mkDir(sqlPath);
20         
21         StringBuffer sb = newStringBuffer();
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 }

获取更多源代码:源代码

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

免责声明:文章转载自《java实现的MySQL自动备份和还原(struts2+Hibernate)---兼容 window+Linux》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇wpf鼠标捕获与控件交互——UIElement.CaptureMouseqs.parse() 和 qs.stringfy() 之 传输数据秘籍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql增删改和学生管理sql

importpymysql #2.建连 conn = pymysql.connect("localhost","root",'root','李森') print(conn) #3.获取游标 cur =conn.cursor() #4.增 sql="insert into student_1 values(default,%s,%s,%s,%s)"cur.e...

MySQL【Delete误操作】回滚

前言:      操作数据库时候难免会因为“大意”而误操作,需要快速恢复的话通过备份来恢复是不太可能的,因为需要还原和binlog差来恢复,等不了,很费时。这里先说明下因为Delete 操作的恢复方法:主要还是通过binlog来进行恢复,前提是binlog_format必须是Row格式,否则只能通过备份来恢复数据了。方法:     条件:开启Binlog,...

Ubuntu18.04完全卸载mysql5.7并安装mysql8.0的安装方法

Ubuntu18.04版本下,如果直接输入: sudo apt install mysql-server 命令,会默认安装mysql5.7版本,安装过程并没有提示输入密码,安装完成后也无法正常登录,这是因为mysql为Ubuntu18.04提供了新版本mysql8.0,所以此时就需要卸载5.7,重新安装8.0版本。 注意:一定要完全卸载并清楚数据,不然等会...

解决cursor未关闭造成的死锁

参考:https://blog.csdn.net/zc474235918/article/details/72731363/ https://blog.csdn.net/zmx729618/article/details/51259135 # import pymysql # conn=pymysql.connect(host='127.0.0.1',...

MySQL外键设置中的的 Cascade、NO ACTION、Restrict、SET NULL

1 . cascade方式  在父表上update/delete记录时,同步update/delete掉子表的匹配记录     2. set null方式 在父表上update/delete记录时,将子表上匹配记录的列设为null要注意子表的外键列不能为not null   3. No action方式 如果子表中有匹配的记录,则不允许对父表对应候选键进行...

oracle数据库date类型和mysql数据库datetime类型匹配

oracle数据库有date类型,但是没有datetime类型 mysql数据库既有date类型也有datetime类型。Oracle数据库的date类型和mysql的date类型是不一样的,Oracle的date类型为YYYY-MM-DD hh:mm:ss和mysql中的datetime类型匹配, 而 mysql 的date类型为 yyyy-mm-dd。...