mysql备份还原,在win7系统上可以,在winservice2008中不能成功备份大数据。

来源:互联网 发布:otg软件下载 编辑:程序博客网 时间:2024/05/16 06:55
package com.cloudmanage.struts2.kzt.service;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;

import org.apache.log4j.Logger;

import com.cloudmanage.global.Message;
import com.cloudmanage.ibatis.dao.IbatisDao;

public class DbService {

private static Logger log = Logger.getLogger(DbService.class);
private IbatisDao ibatisDao;

public IbatisDao getIbatisDao() {
return ibatisDao;
}

public void setIbatisDao(IbatisDao ibatisDao) {
this.ibatisDao = ibatisDao;
}

//展示所有的数据库列表
public ArrayList<HashMap> getAllDBlist() {
ArrayList<HashMap> result = new ArrayList<HashMap>();
ArrayList<HashMap> notdbhead = new ArrayList<HashMap>();
try {
result = (ArrayList<HashMap>)ibatisDao.getListByIbatis("getAllDBlist", null);
//复制出查询出的所有数据库表,然后对其进行挑选,然后返回, 挑选规则:(只获取DB_ 开头 的数据库。);
for(int i = 0;i<result.size();i++){
if(((String) result.get(i).get("Database")).startsWith("db_")){
notdbhead.add(result.get(i));
}
}
} catch (SQLException e) {
log.error("获取数据库列表失败。"+e);
}
return notdbhead;
}

//备份
public String backup(String hostIP, String userName, String password, String savePath, String fileName, String databaseName) {
InputStream in = null;
InputStreamReader xx = null;
BufferedReader br = null;
OutputStreamWriter writer = null ;
FileOutputStream fout = null;
try {
Runtime rt = Runtime.getRuntime();

// 调用 调用mysql的安装目录的命令
Process child = rt.exec( hostIP+"dump -hlocalhost -u"+ userName +" -p"+password+" "+databaseName);
// 设置导出编码为utf-8。这里必须是utf-8
// 把进程执行中的控制台输出信息写入.sql文件,即生成了备份文件。注:如果不对控制台信息进行读出,则会导致进程堵塞无法运行
in = child.getInputStream();// 控制台的输出信息作为输入流

xx = new InputStreamReader(in, "utf-8");
// 设置输出流编码为utf-8。这里必须是utf-8,否则从流中读入的是乱码

String inStr;
StringBuffer sb = new StringBuffer("");
String outStr;
fout = new FileOutputStream(savePath+fileName);
writer = new OutputStreamWriter(fout, "utf-8");
// 组合控制台输出信息字符串
br = new BufferedReader(xx);
while ((inStr = br.readLine()) != null) {
// sb.append(inStr + "\r\n");
writer.write(inStr+"\r\n");
writer.flush();
}
// outStr = sb.toString();

// 要用来做导入用的sql目标文件:
/* fout = new FileOutputStream(savePath+fileName);
writer = new OutputStreamWriter(fout, "utf-8");*/
/* writer.write(outStr);
writer.flush();*/
in.close();
xx.close();
br.close();
writer.close();
fout.close();

} catch (Exception e) {
log.error("备份["+databaseName+"]失败。" +e);
return Message.getMsg("ER0043");
}finally{
try {
in.close();
} catch (IOException e) {
log.error("备份文件过程中,文件流关闭异常。" +e);
return Message.getMsg("ER0043");
}
try {
xx.close();
} catch (IOException e) {
log.error("备份文件过程中,文件流关闭异常。" +e);
return Message.getMsg("ER0043");
}
try {
br.close();
} catch (IOException e) {
log.error("备份文件过程中,文件流关闭异常。" +e);
return Message.getMsg("ER0043");
}
try {
writer.close();
} catch (IOException e) {
log.error("备份文件过程中,文件流关闭异常。" +e);
return Message.getMsg("ER0043");
}
try {
fout.close();
} catch (IOException e) {
log.error("备份文件过程中,文件流关闭异常。" +e);
return Message.getMsg("ER0043");
}
}
log.info("备份["+databaseName+"]完毕。备份文件为:["+fileName+"]。");
return "";
}


//数据还原
public String restore(String hostIP, String userName, String password, String savePath, String fileName, String databaseName) {
OutputStream outputStream = null;
BufferedReader br = null;
OutputStreamWriter writer = null;
try {
Runtime runtime = Runtime.getRuntime();
Process process = runtime
.exec( hostIP+".exe -hlocalhost -u"+userName+" -p"+password+" --default-character-set=utf8 " + databaseName);
outputStream = process.getOutputStream();
br = new BufferedReader(new InputStreamReader( new FileInputStream(savePath+fileName), "utf-8"));
String str = null;
StringBuffer sb = new StringBuffer();
writer = new OutputStreamWriter(outputStream,
"utf-8");
while ((str = br.readLine()) != null) {
// sb.append(str + "\r\n");
writer.write(str + "\r\n");
writer.flush();
}
// str = sb.toString();
/* writer = new OutputStreamWriter(outputStream,
"utf-8");*/
// writer.write(str);
writer.flush();
outputStream.close();
br.close();
writer.close();
} catch (UnsupportedEncodingException e) {
log.error("恢复["+fileName+"]备份失败。" +e);
return Message.getMsg("ER0044");
} catch (FileNotFoundException e) {
log.error("恢复["+fileName+"]备份失败。" +e);
return Message.getMsg("ER0044");
} catch (IOException e) {
log.error("恢复["+fileName+"]备份失败。" +e);
return Message.getMsg("ER0044");
}finally{
try {
outputStream.close();
} catch (IOException e) {
log.error("恢复["+fileName+"]备份失败。" +e);
return Message.getMsg("ER0044");
}
try {
br.close();
} catch (IOException e) {
log.error("恢复["+fileName+"]备份失败。" +e);
return Message.getMsg("ER0044");
}
try {
writer.close();
} catch (IOException e) {
log.error("恢复["+fileName+"]备份失败。" +e);
return Message.getMsg("ER0044");
}
}
log.info("恢复["+databaseName+"]备份成功。恢复文件为:["+fileName+"]。");
return "";
}


}


之前是用的stringbuffer   才出现错误,现在改为这样,暂时还在测试,没有出现问题,仅在这里做个笔记,以便以后查阅