java代码实现mysql数据备份与恢复

         这两天对mysql数据库的备份与恢复少有研究,终于弄清楚怎么回事了。郁闷的很……
首先:先介绍几个mysql命令——
        mysqldump:是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法。现在来看一下 mysqldump 的一些主要参数:
­
--compatible=name:
这个命令告诉告诉mysqldump,导出的数据和那个版本的数据库进行匹配兼容。name值可以是ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等。
­
--complete-insert,-c
导出的数据采用包含字段名的完整 INSERT 方式。这样可以提高插入效率,但会收到max_allowed_packet 参数限制,不建议使用。
­
--lock-all-tables=true/false
这个参数是在开始执行mysqldump是停掉所有的表的进程,确保表的一致性和完整性。这个选项知识和mylsam表。
­
--quick
这个选项在输出大量数据时比较有用,他强制mysqldump直接将数据输出而不先存缓存在输出。
­
--result-file=filepath
这个事告诉mysqldump将数据存储到那 就是备份的存储路径。
­
--default-character-set=utf8 / gb2312
这个告诉我们输出的编码格式,这个很重要,在很达成度上解决了乱码问题。
例:mysqldump -h host -u username -p password  --default-character-set=utf8 databasename > filepath
恢复直接用mysql命令
例: mysql -h host -u username -p password databasename <filepath
下面看个小小的例子:
数据备份
public String getBDMessage(String path) {
  LoggerCode.printInfo("---------DBBackServiceImpl--------------数据备份-----------------------");
Runtime rs = Runtime.getRuntime();
Process pro = null;
String sql = "groupsmg."+DateUtil.getSystemTime()+".sql";
try {
File filePath = new File(path);
if(!filePath.exists())
               filePath.mkdir();
StringBuffer sb = new StringBuffer();
sb.append("mysqldump ");
sb.append("-h"+DBMessage.getHost()+" ");
sb.append("--user="+DBMessage.getUser());
sb.append(" --password="+DBMessage.getPass());
sb.append(" --lock-all-tables=true ");
sb.append("--result-file="+filePath+getSeparator());
sb.append(sql+" ");
sb.append("--default-character-set=utf8 ");
sb.append(DBMessage.getDatabase());
if(pro!=null){
    pro.destroy();
}
String[] cmd = {"cmd","/c",sb.toString()};
pro = null;
pro = rs.exec(cmd);
//pro=rs.exec(sb.toString());liunx下的备份
int wait = pro.waitFor();
if(wait==0){
    return sql;
  }else{
     return null;
}
} catch (Exception e) {
LoggerCode.printInfo("----------DBBackServiceImpl-----------------备份失败-------------------");
LoggerCode.printInfo(e.getMessage());
return null;
}
}
­
数据恢复:
public boolean DBFileRecover(String value,String path) {
  LoggerCode.printInfo("------------DBBackServiceImpl---------------数据恢复-------------------");
if(value!=null&&value.length()>0&&!value.equals("undefined")){
Runtime rt = Runtime.getRuntime();
try {
  File filePath = null;
  if(path!=null){
  filePath = new File(path);
  }
  if(!filePath.exists()){
  filePath.mkdir();
  }
DBBack back = dbDao.getDBBack(Integer.parseInt(value));
StringBuffer sb = new StringBuffer();
//sb.append(DBMessage.url);
sb.append("mysql");
sb.append(" -h"+DBMessage.getHost());
sb.append(" -u "+DBMessage.getUser());
sb.append(" -p"+DBMessage.getPass());
sb.append(" "+DBMessage.getDatabase()+" < "+filePath+getSeparator());
sb.append(back.getUrl());
String[] cmd = {"cmd","/c",sb.toString()};
Process pro = rt.exec(cmd);
int i = pro.waitFor();
//String cmd = {"sh","-c",sb.toString}
//pro = rt.exec(cmd);//liunx下的恢复数据
if(i==0){
   return true;
}else{
   return false;
}
} catch (Exception e) {
LoggerCode.printInfo("------------DBBackServiceImpl---------------数据恢复失败-------------------");
  LoggerCode.printInfo(e.getMessage());
  return  false;
}
}else{
   return false;  }
}
­
­
这个方法是解决window、liunx下的文件路径问题;“/"--windows.      "/"--liunx
public String getSeparator(){
  return System.getProperties().getProperty("file.separator");
}
­
­
这个事获得用户名密码:
import org.hibernate.cfg.Configuration;
public class DBMessage {
private static Configuration cfg = null;
­
static {
try{
  cfg = new Configuration().configure("hibernate.cfg.xml");
}catch(Exception e){
System.out.println(e.getMessage());
}
}
­
public static String getUser(){
   return cfg.getProperty("connection.username");
}
­
public static String getPass(){
     return cfg.getProperty("connection.password");
}
­
public static String getHost(){
String url = cfg.getProperty("connection.url");
­
String s = url.replaceAll("jdbc:mysql://", "");
s = s.replaceAll("/", ":");
String[] pare = s.split(":");
return pare[0];
}
­
public static String getDatabase(){
String url = cfg.getProperty("connection.url");
String s = url.replaceAll("jdbc:mysql://", "");
s = s.replaceAll("/", ":");
Sring[] pare = s.split(":");
return pare[2];
}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值