日期:2014-05-16 浏览次数:20449 次
这两天对mysql数据库的备份与恢复少有研究,终于弄清楚怎么回事了。郁闷的很……
首先:先介绍几个mysql命令——
mysqldump:是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 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");