`
忧里修斯
  • 浏览: 425994 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

linux和windows上备份Mysql数据库java代码

阅读更多

以下为实现在windows和linux 上备份Mysql数据库的java代码,它通过动态判断操作体统和动态从链接数据库的

配置文件(本文是用hibernat的配置文件)读出数据库信息生成可执行脚本,再使用java调用此脚本而实现数据

库的备份和恢复,当然你可以根据自己的需要修改扩展,呵呵

/*
 *  
 * TODO 要更改此生成的文件的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
package com.et.yizh.zhp.data;

import javax.servlet.http.HttpServletRequest;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.*;

import com.et.buss.login.Account;
import com.et.util.Log;
import com.et.util.StrUtil;

/**
 * @author zhangpeng
 *
 * TODO 要更改此生成的类型注释的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
public class DatabaseManager {
  
 private String message="";
 private String operateFlag="";
 private Hashtable pageInfo=new Hashtable();
 private Account objAccount=null;
 private String db_tools_path = "";  //执行文件保存路径
 private String db_backup_path= ""; //备份文件保存路径
 private HttpServletRequest request;
 //private ServletContext application;

 //构造及初始化
 public DatabaseManager(HttpServletRequest request){
  this.request=request;
  //this.application=application; 
  this.objAccount=(Account)request.getSession().getAttribute(Account.ACCOUNT_KEY);
  this.db_backup_path= DataFile.getFilepath();  //执行文件保存路径
  this.db_tools_path= DataFile.getBinpath();  //备份文件保存路径
 }
 //构造及初始化
 public DatabaseManager(){

 }
 //获取错误信息
 public String getMessage(){  
  return message; 
 }    
    /**
     * 进行数据备份
     */
 public int backup(){ 
  if(this.objAccount==null){
   message="对不起!请先登录,才能做此操作!";  
   return -1; 
  } 
  boolean flag=true;
  //初始化环境
  String new_id=StrUtil.generalSrid();
  String fileName=new_id+".sql";
  //初始化参数及文件校验
  
  File data_file=new File(db_backup_path,fileName);//备份脚本文件对象
  
  String binname = this.getBackBin(); //获得执行备份的文件名
  
  File bin_file=new File(db_tools_path,binname); //执行文件对象
  
  String para=this.getCommandParameter(); 
  
  String writeMsg = bin_file.getAbsolutePath()+para+" > "+data_file.getAbsoluteFile();
  
  File bat_file=this.writeMsgToFile(writeMsg);   //执行命令的脚本文件
  flag=(bin_file.exists()&&bat_file.exists());   //文件校验如果都存在为真
  if(!flag){
   message="备份数据库失败!提示:未找到相应的文件!";  
   return -1;  
  }  
  //执行备份过程
  CmdUtil cmd=new CmdUtil();
  try{
   cmd.excute(this.getShell()+bat_file.getAbsolutePath());//执行命令脚本
   int i = cmd.waitFor(); //进程退出结果
   //Process process = Runtime.getRuntime().exec(bat_file.getAbsolutePath());//执行命令脚本
   //int i = process.waitFor();

   cmd.kill();//杀死进程
   Log.write("====backup===result======"+i);
   if(i!=0){
    message="备份数据库失败!可能原因:服务器繁忙!请稍后重试!";
    this.delFile(data_file);//非正常退出而失败时,删除已经生成的不完整文件
    return -1;  
   }
  }catch(Exception e){
   this.delFile(data_file);//非正常退出而失败时,删除已经生成的不完整文件
   message = "备份数据库失败!可能原因:服务器繁忙!请稍后重试!!";
   Log.write(e.getMessage());
   return -1;
  }
  return 1;
  
 }
 /**
  * 进行数据恢复
  */
 public int restore(){ 
  if(this.objAccount==null){
   message="对不起!请先登录,才能做此操作!";  
   return -1; 
  } 
  boolean flag=true;
  //初始化环境
  String fileName=request.getParameter("id");
  if(fileName.indexOf(".sql")==-1){    //不是sql脚本文件
   message="数据库恢复失败!提示:数据脚本文件格式不正确!";
   return -1; 
  }
  //初始化参数及文件校验
  File data_file=new File(db_backup_path,fileName);//备份脚本文件对象
  
  String binname = this.getRestoreBin(); //获得执行恢复的文件名
  
  File bin_file = new File(db_tools_path,binname); //执行文件对象
  
  String para = this.getCommandParameter(); 
  
  File bat_file=this.writeMsgToFile(bin_file.getAbsolutePath()+para+" < "+data_file.getAbsoluteFile());
  
  flag=(data_file.exists()&&bin_file.exists()&&bat_file.exists());   //文件校验
  if(!flag){
   message="恢复数据库失败!提示:未找到相应的文件!";
   return -1;  
  }  
  //执行恢复过程
  CmdUtil cmd=new CmdUtil();
  try{
   cmd.excute(this.getShell()+bat_file.getAbsolutePath());//执行命令脚本
   int i = cmd.waitFor(); //进程等待 返回退出结果

   cmd.kill();//杀死进程

   Log.write("=====restore==result======"+i);
   if(i!=0){
    message="恢复数据库失败!可能原因:服务器繁忙!请稍后重试!";
    return -1;  
   }
  }catch(Exception e){
   message = "恢复数据库失败!可能原因:服务器繁忙!请稍后重试!!";
   Log.write(e.getMessage());
   return -1;
  }     
  return 1;
 }  
 
  //删除文件
 public void delFile(File file){
  if(file.exists()){
   file.delete();//删除文件
  }
 }
   /**
 * 判断操作系统,给出相应执行脚本
 */
 public String getShell(){
  return DataFile.isLinux()?"/bin/sh ":""; 
 }
   /**
 * 判断操作系统,使用相应的备份执行文件
 */
 public String getBackBin(){
  return DataFile.isLinux()?"mysqldump":"mysqldump.exe"; 
 }
   /**
 * 判断操作系统,使用相应的恢复执行文件
 */
 public String getRestoreBin(){
  return DataFile.isLinux()?"mysql":"mysql.exe"; 
 } 
  /**
 * 从hibernate中获取备份和恢复的参数
 */ 
 private String getCommandParameter(){
  net.sf.hibernate.cfg.Configuration cfg=new net.sf.hibernate.cfg.Configuration();
  try{
   cfg.configure("/hibernate.cfg.xml");       
  }catch (Exception e) {
   Log.write("%%%%====解析/hibernate.cfg.xml失败!! Error Creating SessionFactory %%%%");
   Log.write(e.getMessage());
  } 
  
  String url=cfg.getProperty("connection.url");
  String s=url.replaceAll("jdbc:mysql://","");
  s=s.replaceAll("/",":"); 

  String pare[]=s.split(":");
  
  StringBuffer sb=new StringBuffer(""); 
  
  //2获得备份或恢复的参数
  String host=pare[0];
  String port=pare[1];
  String user=cfg.getProperty("connection.username");;
  String passwd=cfg.getProperty("connection.password");
  String database=pare[2];     
  
   sb.append("  -h"+host);
   sb.append("  -P"+port);  
   sb.append("  -u"+user);        
   sb.append("  -p"+passwd);
  // sb.append(" --skip-comments -q ");//不要注释 只能在备份时用
   sb.append("  -B "+database); //存储多个数据库 

  return sb.toString();  
 }
   /**
 *   写一段字符串到执行文件中
 */
 private File writeMsgToFile(String msg){
  String shellfile = DataFile.isLinux()?"temp.txt":"temp.bat";//根据操作系统
  File bat_file=new File(db_tools_path,shellfile);
  if(bat_file.exists()){
   bat_file.delete();
  }  
  try{   
   BufferedWriter out=new BufferedWriter(new FileWriter(bat_file)); 
   out.write(msg); 
   out.close();
  }catch(Exception e){
   bat_file.delete();
   return null;  
  }
  return bat_file;   
 }

}
下面是上面类中用的CmdUtil类:

/**
 * 创建日期 2007-01-26
 *
 */
package com.et.yizh.zhp.data;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

import com.et.util.Log;

/**
 * @author zhangpeng
 * 
 */
public class CmdUtil {
 private Process p = null;

 /**
  * @return
  */
 public InputStream getErrorStream() {
  return p.getErrorStream();
 }

 /**
  * @return
  */
 public InputStream getInputStream() {
  return p.getInputStream();
 }

 /**
  * @return
  */
 public OutputStream getOutputStream() {
  return p.getOutputStream();
 }

 /**
  * 清除运行外部命令的线程
  * 
  */
 public final void kill() {
  if (p != null) {
   p.destroy();
  }
  p = null;
 }

 /**
  * 
  */
 public void destroy() {
  p.destroy();
 }

 /**
  * @return
  */
 public int exitValue() {
  return p.exitValue();
 }
 /**
  * @return
  */
 public int waitFor() {
  try {
   return  p.waitFor();
  } catch (InterruptedException e) {
   // TODO 自动生成 catch 块
   e.printStackTrace();
   return -1;
  }
 }

 /**
  * 执行一个外部命令
  *
  * @param shellCmd
  * @return
  */
 public final boolean excute(String shellCmd) {
  try {
   if (p != null) {
    kill();
   }
   Runtime run = Runtime.getRuntime();
   p = run.exec(shellCmd);

  } catch (Exception e) {
   Log.write(e.getMessage());
   return false;
  }
  return true;
 }

 public final StringBuffer cmd(String shellCmd, boolean isGetCmdOutPut) {
  this.excute(shellCmd);
  if (!isGetCmdOutPut)
   return null;
  StringBuffer sb = new StringBuffer(2048);
  try {
   //InputStream error=p.getErrorStream();
   //OutputStream out = p.getOutputStream();
   DataInputStream in = new DataInputStream(p.getInputStream());
   BufferedReader reader = new BufferedReader(
     new InputStreamReader(in));
   String line;
   do {
    line = reader.readLine();
    if (line == null) {
     break;
    } else {
     ////System.out.println(line);
     sb.append(line);
     sb.append("\n");
    }
   } while (true);
   reader.close();

  } catch (Exception e) {
   return null;
  }
  return sb;
 }
}

分享到:
评论
1 楼 xseven 2009-12-23  
正好要用到这个,下下来看看! 有问题再来请教。

相关推荐

    Java实现对Mysql数据库的备份还原

    java实现对mysql数据库的备份与还原,可跨平台,windows与Linux通用,代码内含有利用注册表信息获取mysqldump命令实例

    MySQL可以运用在哪些项目场景中?MySQL数据库开发过程说明.docx

    MySQL支持多种操作系统,包括Windows、Linux和macOS等,同时也支持多种编程语言,如PHP、Java、Python等。这使得MySQL具有极高的灵活性和可扩展性,可以轻松地集成到各种应用程序中。 除此之外,MySQL还提供了丰富...

    MySQL基于java实现备份表操作

    所需的配置信息是从配置文件读取的,也要注意在Windows和linux下路径问题。 配置文件如下: Java代码 收藏代码 # 数据库地址 dbAddress=localhost # 要备份的数据库名称 databaseName=nms # 数据库用户名 ...

    MySQL是一款开源的关系型数据库管理系统,能够解决许多数据存储和管理方面的问题

    包含 MySQL 数据库的基础知识,涵盖了 MySQL 的安装和配置、SQL 基础语法、索引和查询优化、事务和锁等内容,并提供了大量的案例代码和实践练习,方便学习和掌握 MySQL 的使用方法。以下是MySQL可以解决的一些问题:...

    文件数据PHP版MySQL数据库分卷备份工具-mysql-bakup-tool.rar

    对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步...

    Java项目04-天天生鲜订菜管理系统云数据库&SpringTemplate;实现&Linux;演示.rar

    Java项目04-天天生鲜订菜管理系统阿里云mysql...实现并提供利用Xshell在Linux环境下答辩展示视频,这里提供源码和数据库sql备份文件及展示视频下载,另外后续还有java swing实现项目及html-js/jsp/css实现项目上线。

    [文件数据]PHP版MySQL数据库分卷备份工具_mysql_bakup_tool.rar

    对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步...

    一个基于vue的pc端网上购物商城,包括前台商城和后台管理系统,后端采用Java,数据库采用mysql.zip

    此外,MySQL支持多种操作系统,包括Windows、Linux、macOS、Solaris等,确保了其在不同环境下的兼容性和部署灵活性。 关系型模型与SQL支持 MySQL基于关系型数据库模型,数据以表格形式组织,并通过预定义的键(如...

    MYSQL定时清除备份数据的具体操作

    由于项目需要,每个月的历史存量数据需要进行一个归档和备份操作,以及一些日志表需要进行一个明细字段清除,让mysql数据库磁盘节省空间。则需要一些定时任务来定时清理这些数据。 2|0技术选型 Java 可以基于...

    Java网上书店管理系统(基于MVC模式编写:前端jsp页面、数据库MySQL、服务器Tomcat).zip

    此外,MySQL支持多种操作系统,包括Windows、Linux、macOS、Solaris等,确保了其在不同环境下的兼容性和部署灵活性。 关系型模型与SQL支持 MySQL基于关系型数据库模型,数据以表格形式组织,并通过预定义的键(如...

    Linux环境数据库管理员指南

    第5章 在Linux上安装和使用 Sybase 136 5.1 引言 136 5.2 安装 136 5.2.1 安装 SQL Server 11.0.3 137 5.2.2 安装可选的客户机软件 141 5.3 配置 142 5.3.1 配置Sybase Database Server 143 5.3.2 配置Sybase Backup...

    这是一个基于java和mysql 的学生成绩管理系统.zip

    此外,MySQL支持多种操作系统,包括Windows、Linux、macOS、Solaris等,确保了其在不同环境下的兼容性和部署灵活性。 关系型模型与SQL支持 MySQL基于关系型数据库模型,数据以表格形式组织,并通过预定义的键(如...

    MySQL 5.1中文手冊

    2.3. 在Windows上安装MySQL 2.3.1. Windows系统要求 2.3.2. 选择安装软件包 2.3.3. 用自动安装器安装MySQL 2.3.4. 使用MySQL安装向导 2.3.5. 使用配置向导 2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案...

    18个Linux Shell脚本经典案例视频.zip

    MySQL数据库备份单循环 MySQL数据库备份多循环 nginx 访问访问日志按天切割 nginx nginx访问日志分析脚本 一键查看服务器资源利用率 一键部署LNMP网站平台脚本 批量主机远程执行命令脚本 批量创建100用户并设置密码...

    MySQL 5.1参考手册

    2.3. 在Windows上安装MySQL 2.3.1. Windows系统要求 2.3.2. 选择安装软件包 2.3.3. 用自动安装器安装MySQL 2.3.4. 使用MySQL安装向导 2.3.5. 使用配置向导 2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案...

    MySQL 5.1参考手册中文版

    2.3. 在Windows上安装MySQL 2.3.1. Windows系统要求 2.3.2. 选择安装软件包 2.3.3. 用自动安装器安装MySQL 2.3.4. 使用MySQL安装向导 2.3.5. 使用配置向导 2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取...

    MYSQL

    9.4 MySQL数据库表类型 10 从 MySQL 得到最大的性能 10.1 优化概述 10.2 系统/编译时和启动参数的调节 10.2.1 编译和链接如何影响 MySQL 的速度 10.2.2 磁盘问题 10.2.2.1 为数据库和...

Global site tag (gtag.js) - Google Analytics