MySQL基于java实现备份表操作
核心是mysqldump和Runtime
操作其实并不是很困难,创建一个进行备份操作的类,接收到备份调用后,标记该表正在备份,然后创建一个子线程进行备份操作。所需的配置信息是从配置文件读取的,也要注意在Windows和linux下路径问题。
配置文件如下:
Java代码收藏代码
#数据库地址
dbAddress=localhost
#要备份的数据库名称
databaseName=nms
#数据库用户名
username=root
#数据库密码
password=root
#mysqldump路径Linux
mysqlpath=/usr/bin/
#备份文件存放位置Linux
sqlFilePath=/MySQlBack/
#mysqldump路径Windows
#mysqlpath=C\://ProgramFiles//MySQL//MySQLServer5.5//bin//
#备份文件存放位置Windows
#sqlFilePath=C\://MySQl//
执行功能的代码类如下:
Java代码收藏代码
packagecom.nms.common.db;
importjava.io.File;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.Map;
importjava.util.Properties;
importjava.util.concurrent.ConcurrentHashMap;
importorg.apache.commons.logging.Log;
importorg.apache.commons.logging.LogFactory;
/**
*用于数据库备份操作
*/
publicclassDbBackUpMethod{
privatestaticLoglogger=LogFactory.getLog(DbBackUpMethod.class);
privatestaticPropertiespros=getPprVue("db.properties");
publicstaticMap
privatestaticDbBackUpMethodbackObj=newDbBackUpMethod();
publicstaticDbBackUpMethodgetDbBackUpMethod(){
returnbackObj;
}
publicvoidbackup(StringtableName){
if(null!=backUpTableList.get(tableName))return;
backUpTableList.put(tableName,tableName);//标记已经用于备份
newThread(newDbBackUpThread(tableName)).start();
}
/**
*用于执行某表的备份
*/
classDbBackUpThreadimplementsRunnable{
StringtableName=null;
publicDbBackUpThread(StringtableName){
this.tableName=tableName;
}
@Override
publicvoidrun(){
try{
Stringusername=pros.getProperty("username");
Stringpassword=pros.getProperty("password");
Stringmysqlpaths=pros.getProperty("mysqlpath");
Stringaddress=pros.getProperty("dbAddress");
StringdatabaseName=pros.getProperty("databaseName");
Stringsqlpath=pros.getProperty("sqlFilePath");
Filebackupath=newFile(sqlpath);
if(!backupath.exists()){
backupath.mkdir();
}
StringBuffersb=newStringBuffer();
sb.append(mysqlpaths);
sb.append("mysqldump");
sb.append("--opt");
sb.append("-h");
sb.append(address);
sb.append("");
sb.append("--user=");
sb.append(username);
sb.append("");
sb.append("--password=");
sb.append(password);
sb.append("");
sb.append("--lock-all-tables=true");
sb.append("--result-file=");
sb.append(sqlpath);
sb.append(tableName+".sql");
sb.append("");
sb.append("--default-character-set=utf8");
sb.append(databaseName);
sb.append("");
sb.append(tableName);
Runtimecmd=Runtime.getRuntime();
Processp=cmd.exec(sb.toString());
p.waitFor();//该语句用于标记,如果备份没有完成,则该线程持续等待
}catch(Exceptione){
logger.error("备份操作出现问题",e);
}finally{
backUpTableList.remove(tableName);//最终都将解除
}
}
}
publicstaticPropertiesgetPprVue(StringproperName){
InputStreaminputStream=DbBackUpMethod.class.getClassLoader().getResourceAsStream(properName);
Propertiesp=newProperties();
try{
p.load(inputStream);
inputStream.close();
}catch(IOExceptione){
logger.error("无法读取用于备份数据的配置文件",e);
}
returnp;
}
}
在Action中,可以直接调用备份操作方法:
Java代码收藏代码
DbBackUpMethod.getDbBackUpMethod().backup(tableName);//调用备份
同时,如果页面有删除该表的操作,在操作前应该判断该表是否在进行备份
Java代码收藏代码
if(null!=DbBackUpMethod.backUpTableList.get(tableName))
然后页面JSP调用时,可以给予响应的提示,我的判断是只能删除一张表:
functiondeleteTableByTableName(){ varpk=table.getSelectedKeys(); if(""==pk){ alert("请选择一条记录!"); returnfalse; } if(pk.length>1){ alert("请选择一条记录!"); returnfalse; } varrows=table.get(pk); vartableName=rows.tableName; if(confirm("你确认要删除该表吗?")){ if(confirm("删除该表前,你需要备份操作吗?\n\n选择备份后,系统将后台进行相关操作!\n在此期间,您不能删除该表!\n备份操作可能将持续数小时时间!请知晓!")){ document.form1.action="backUpTable.action?tableName="+tableName; document.form1.submit(); }else{ if(confirm("你确认提交吗?该表将删除!")){ document.form1.action="del.action?tableName="+tableName; document.form1.submit(); } } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。