`
忧里修斯
  • 浏览: 436427 次
  • 性别: 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环境下都能正常工作。 首先,让我们了解备份和还原的基本概念。数据库备份是为了防止数据...

    Linux下的MySQL数据库编程_代码

    通过《Linux下的MySQL数据库编程》这本书,你将能够深入理解上述知识点,并通过书中提供的代码示例实践这些概念。这将有助于你在实际项目中更好地管理和操作MySQL数据库,提升开发效率和系统稳定性。

    java mysql 数据库备份和还原操作(csdn)————程序.pdf

    上述代码展示了如何使用Java来实现MySQL数据库的备份和还原操作。以下是对这些操作的详细解释: 首先,代码导入了多个Java库,包括`java.io`包下的类,用于处理输入/输出流,以及`java.util`包下的类,如`Date`和`...

    Java实现MySQL数据库备份

    在Java编程环境中,实现MySQL数据库备份通常涉及到操作系统命令行调用和文件操作。这段代码提供了一个名为`MySQLDatabaseBackup`的类,该类包含了将MySQL数据库导出为SQL文件的功能。下面将详细解释这个过程: 1. *...

    Linux下的mysql数据库编程

    在Linux环境下进行MySQL数据库编程是一项基础且至关重要的技能,尤其对于系统管理员和开发人员来说。以下将详细探讨这个主题,包括Linux操作系统、MySQL数据库的基本概念、安装与配置、数据库设计、SQL语言、以及...

    Linux下的MySQL数据库编程

    在Linux环境下进行MySQL数据库编程是一项基础且至关重要的技能,尤其对于系统管理员和开发人员来说。MySQL是一种流行的开源关系型数据库管理系统(RDBMS),它以其高效、可靠和易用性而受到广泛赞誉。本讲义将围绕...

    java调用mysql命令 导入导出数据库

    在Java编程中,调用MySQL命令来导入和导出数据库是一种常见的操作,这涉及到数据库管理、数据迁移或者备份恢复等场景。在这个过程中,Java通过JDBC(Java Database Connectivity)接口与MySQL进行交互,利用MySQL...

    Linux下的MySQL数据库编程].赵廷涛等.扫描版

    总的来说,《Linux下的MySQL数据库编程》这本书将涵盖以上所有方面,帮助读者深入了解在Linux系统上如何有效地使用和管理MySQL数据库,从而在实际项目中实现高效、安全的数据存储和处理。通过深入学习和实践,开发者...

    mysql数据库基本操作

    MySQL数据库是一种广泛使用的开源关系型数据库管理系统,以其高效、稳定和易于管理的特性深受开发者喜爱。在本篇文章中,我们将深入探讨MySQL数据库的基本操作,包括数据的增、删、改、查(CRUD)以及一些核心概念。...

    linux数据库编程

    - MySQL:作为最流行的开源关系型数据库,MySQL提供了C、C++、Java、Python等多种语言的API,如MySQL Connector/C,用于连接和操作数据库。 - PostgreSQL:同样强大的开源数据库,支持复杂的SQL标准和事务处理,其...

    Linux平台下MySQL数据库备份的方法分析.pdf

    本文主要探讨在Linux平台上MySQL数据库的两种备份方法:使用Linux脚本命令和通过Java编写程序。 首先,Linux脚本命令是一种简单易行的备份方式。通过执行`mysqldump`命令,可以将MySQL数据库的数据导出为SQL格式的...

    MySQL数据库应用从入门到精通_第2版

    MySQL数据库是世界上最受欢迎的开源关系型数据库之一,广泛应用于各种规模的企业、网站和应用程序中。本书《MySQL数据库应用从入门到精通_第2版》旨在帮助读者从零基础开始,逐步掌握MySQL的使用技巧和高级功能,...

    java_mysql备份.rar

    本文将详细讲解如何使用Java来备份MySQL数据库,尤其关注在Windows和Linux操作系统上的应用。 首先,我们需要了解Java MySQL备份的基本原理。在Java中,我们可以使用JDBC(Java Database Connectivity)API来连接和...

    mysql数据库安装包+mysql GUI工具+java connecter jar包

    安装MySQL数据库时,首先需要下载适合操作系统(如Windows、Linux或macOS)的安装文件,然后按照安装向导的步骤进行操作,包括选择安装类型(如默认、开发或自定义)、设置root用户的密码、选择配置服务等。...

    mysql数据库以及安装教程

    在Windows上打开CMD,Mac或Linux上打开Terminal,输入`mysql -u root -p`,然后输入你在安装过程中设置的密码。如果成功连接,你将看到MySQL的命令提示符。 **五、数据库管理** 1. **创建数据库**:在MySQL提示符下...

    MySQL数据库教程光盘+mySql中文手册

    1. **安装与配置**:如何在不同的操作系统上安装MySQL,包括Windows、Linux和macOS。配置文件的解读,以及如何设置用户权限和安全选项。 2. **SQL基础**:SQL语言是管理数据库的标准,包括数据查询、插入、更新和...

Global site tag (gtag.js) - Google Analytics