首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

Sqlserver 2005数据库还原有关问题(数据库和web服务器分开的两台)

2012-02-05 
Sqlserver 2005数据库还原问题(数据库和web服务器分开的两台)Sqlserver 2005数据库还原问题功能模块:项目

Sqlserver 2005数据库还原问题(数据库和web服务器分开的两台)

  Sqlserver 2005数据库还原问题

功能模块:
  项目中有一个功能:新建项目。当用户点击新建时,实际上重新创建了一个新的 数据库。空库!然后再把项目里Item文件夹里的一个 Item.bak(在web服务器上)备份文件(空的表)还原到这个新建的库中。
我现在的部分代码如下:

ItemAction。Java

//建个项目库! 
BaseDAO basedao = new BaseDAO();
String database =basedao.createDatabase(String.valueOf(id));
  //新建库 格式为 SJCL+“项目ID)” (String.valueOf(id)为项目ID

/****************************************************************
 createDatabase(String str)方法
  新建数据库+项目编号&+Temb
public String createDatabase(String XMBH) {
String sql = "create database SJCL" + XMBH;
System.out.println("sql==新建数据库+项目编号&+Temb========" + sql);
CreateConn conn = new CreateConn("master");
conn.executeUpdate(sql);
conn.close();
return "SJCL" + XMBH;
}
******************************************************************/

String sPath=request.getRealPath("/");//得到路径
//Path==C:\Tomcat 5.5\webapps\Test\
String sFilePath=sPath+"Item";//得到备份文件路径
String fn = "Item.bak";//备份文件名
basedao.itemdb_restor_s(database1, sFilePath,fn);
  return itemlist(mapping,form,request,reponse);

//itemdb_restor_s()方法如下:






/////////////////////////////////////////////////////////////////////
//basedao.itemdb_restor_s(database, sFilePath,fn);方法

//新建项目库时还原Item文件夹下的空表备份
public boolean itemdb_restor_s(String sDataBase, String sFilePath,String sFileName) {// 库名.备份文件地址
CreateConn db_conn = new CreateConn("master");
ResultSet rs = null;
Process pr = null;//创建一个进程
// 逻辑数据库信息
String sDLogicalName = null;
String sLLogicalName = null;

// 物理地址
String sDPath = null;
String sLPath = null;


String sql = "";
// String sDataBase="sjcl"+sItemBh;
String myIP=new BaseDAO().getMyIP().toString();
String myIPP[]=myIP.split("/");
myIP=myIPP[1]; //自动获得web服务器Ip

try {
// 获取物理地址信息
sql = "SELECT fileid,name,filename FROM " + sDataBase
+ "..sysfiles ORDER BY fileid";
System.out.println("sql=获取物理地址信息===" + sql);
rs = db_conn.executeQuery(sql);

while (rs.next()) {
// String sss=rs.getString("name").trim();
if (rs.getInt("fileid") == 1) {
sDPath = rs.getString("filename").trim();// 地址一
} else {
if (rs.getInt("fileid") == 2) {
sLPath = rs.getString("filename").trim();// 地址二
}
}
}

// 关闭数据库连接
sql = "select spid from sysprocesses where dbid=db_id('"
+ sDataBase + "')";
System.out.println("sql====关闭数据库连接==" + sql);
rs = db_conn.executeQuery(sql);

while (rs.next()) {
sql = "kill " + rs.getInt(1);
db_conn.executeQuery(sql);
System.out.println("sql====kill==" + sql);
}

pr = Runtime.getRuntime()
.exec("net share SqlBak1=\""+sFilePath+"\""); // 创建本机进程,创建共享目录

System.out.println("net share SqlBak1=\""+sFilePath+"\"");
sql = " exec master..xp_cmdshell 'net use \\\\"+myIP+"\\SqlBak1 !@#ibme54/user:Administrator' ";// 建立共享信用关系
db_conn.executeQuery(sql);
System.out.println("创建共享语句建新项目==" + sql);

// 获取数据库恢复信息
sql = "restore filelistonly from disk='\\\\"+myIP+"\\SqlBak1\\"+sFileName+"'";
System.out.println("获取数据库恢复信息sql============" + sql);


rs = db_conn.executeQuery(sql);
while (rs.next()) {
if (rs.getString("Type").trim().equals("D")) {
sDLogicalName = rs.getString("logicalname").trim();
} else {
if (rs.getString("Type").trim().equals("L")) {
sLLogicalName = rs.getString("logicalname").trim();
}
}

}


// 生成恢复数据库语句

sql = "restore database " + sDataBase + " from disk='\\\\"+myIP+"\\SqlBak1\\"+sFileName+"' WITH Move '" + sDLogicalName + "' To '" + sDPath
+ "', Move '" + sLLogicalName + "' To '" + sLPath
+ "',Replace";
System.out.println("sql===生成恢复数据库语句========" + sql);
db_conn.executeUpdate(sql);
pr = Runtime.getRuntime().exec("net share SqlBak1 /delete");// 删除共享名
return true;
}

catch (SQLException SqlE) {
SqlE.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
db_conn.close();

}

}

数据还原这一块,我的做法是在web服务器上创建一个共享,映射到此服务器项目中的那个备份文件。再通过数据库服务器,访问这个 共享还原数据到数据库里 。
生成的相关语句:
sql==新建数据库+项目编号&+Temb========create database SJCL67
Path==C:\Tomcat 5.5\webapps\Test\
sql=获取物理地址信息===SELECT fileid,name,filename FROM SJCL67..sysfiles ORDER BY fileid
sql====关闭数据库连接==select spid from sysprocesses where dbid=db_id('SJCL67')
net share SqlBak1="C:\Tomcat 5.5\webapps\Test\Item"
创建共享语句建新项目== exec master..xp_cmdshell 'net use \\192.168.1.105\SqlBak1 /user:Administrator' 
获取数据库恢复信息sql============restore filelistonly from disk='\\192.168.1.105\SqlBak1\Item.bak'
com.microsoft.sqlserver.jdbc.SQLServerException: 无法打开备份设备 '\\192.168.1.105\SqlBak1\Item.bak'。出现操作系统错误 53(找不到网络路径。)。
问题是如果我在一台机子上试(数据库跟项目在一起),可以还原,代码没问题;一旦数据库跟项目分开两个机子(我星期一去安装的那家公司数据库和web服务器是分开的)。就只能建库,但备份还原不上去,报的错误:无法打开备份设备,找不到网络路径等错误等。  
  真诚的希望各位老师帮我解决一下,很着急。在这里谢谢拉。


[解决办法]
你把\\192... 映射成一个网络驱动器,比如Z:盘看看!
[解决办法]
怎么把这个目录对任何人都共享呢 ?
=====================
对于windows系统: 开通 guest 用户, 然后右键文件夹->属性->共享 ...

建议手工访问这个共享文件夹,如果能够访问,那么你的代码也应该能够访问.

但为了安全还是建议你专门建立一个用户,并指定这个用户具有权限访问你的目录.

其它电脑上想用代码登录到这个共享目录,可以运行 net use 命令

NET USE
[devicename | *] [\\computername\sharename[\volume] [password | *]]
[/USER:[domainname\]username]
[/USER:[dotted domain name\]username]
[/USER:[username@dotted domain name]
[/SMARTCARD]
[/SAVECRED]
[[/DELETE] | [/PERSISTENT:{YES | NO}]]

NET USE {devicename | *} [password | *] /HOME

NET USE [/PERSISTENT:{YES | NO}]


[解决办法]
1.先试试开通guest用户, 在控制面板->管理工具->计算机管理->本地用户和组 -> 用户 -> 找到geust用户-> 右键属性-> 不要选上 "帐户已停用" ; 右键设置密码 为空密码.

2.试试ping 192.168.1.105 这个电脑,如果ping不能,请检查是否对方电脑开了防火墙. 

3.如果1,2都成功做了,那么现在你应该能访问\\192.168.1.105\SqlBak1 ,你可以试试手工访问

4.试试在程序用代码中访问. 

以上成功了,再试试加用户及密码来访问.

热点排行
Bad Request.