那个数据源不一样 好像是用ODBC

解决方案 »

  1.   

    在dos环境下执行这个就可以还原库的。
      

  2.   

    既然已经断开数据库连接,你就没法跟它再交互了
    可以考虑把数据库备份处理写到一个批处理去,然后用java调用该批处理
      

  3.   

    要是没有断开连接就会报:
    com.microsoft.sqlserver.jdbc.SQLServerException: 因为数据库正在使用,所以无法获得对数据库的独占访问权。
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:196)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1454)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:388)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:338)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1416)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:185)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:160)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:320)
    at com.once.xfd.struts2.action.system.ManageDatabaseAction.recovery(ManageDatabaseAction.java:84)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    这个异常
      

  4.   

    我在执行还原数据库的时候 不是有再进行一次连接吗?String reSQL = "restore database xinfadi_testDB from disk=? with replace"; // 还原数据库
    DataBaseUtil dbu = new DataBaseUtil();
    Connection conn = dbu.getConnection();
    PreparedStatement recovery = conn.prepareStatement(reSQL);
      

  5.   

    你再连接的时候是连接不上的,因为数据库处于OFFLINE状态,此时JDBC驱动不知道支持不支持sys用户,只有具有sys权限才可能连接,然后重启。
    所以这一切处理,要么你就做到一个事务中,一次调用,要么就把这些处理写在批处理中,直接调用批处理
      

  6.   

    还原数据库,你不能连被还原的库吧,比如你还原pubs数据库,你应该连到master库上,不然你断开了怎么还原?或者写个bat文件,不连接数据库,在java里调用bat还原。
      

  7.   

    呵呵 我就是连接到master库上 对目标库进行备份与还原的
      

  8.   

    应该在c/s界面下还原吧,连接的master数据库
      

  9.   

    好久不用sql server,忘的差不多了。
    在你的另一个帖子里有人给你回复用存储过程实现的,你可以在java中调用那个存储过程试试看
    调用存储过程 for example
    Class.forName(your_driver);
    Connection conn =  DriverManager.getConnection(url, user, password);
    CallableStatement proc = conn.prepareCall("{ call dbo.p_RestoreDb(?,?) }"); //如果无参数,直接call dbo.p_RestoreDb()
    proc.setString(1, xxx); //那个帖子的存储过程是无参数的,所以这里可以不要
    proc.setString(2, yyy);
    proc.execute();
    其实你也可以用PreparedStatement的execute或者直接executeUpdate,都差不多的至于用批处理的方式,你要知道备份和还原命令,然后通过这些命令写一个bat,然后在java中调用

    Runtime.getRuntime().exec("xxx.bat");至于备份和还原命令,可以在网上找一找
    我帮你在网上搜了一下
    可以参考
    备份
    osql -Usa -Pxxx "bakeup database 数据库名 to disk= 'd:\yyy.bak'"
    还原
    osql -Usa -Pxxx "restore database 数据库名 from disk= 'd:\yyy.bak'"-------以下是网上搜索命令参考----------sqlserver有关的命令行就那几个命令 bcp,isql(不知道2005有吗) osql
    2005还多了个sqlcmd
    给你参考一下,xys_777的
    SQL code
    用sqlserver的sqlcmd、osql、isql的备份与还原
    --sqlcmd ,sql2005新加工具
    1、备份
    "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE" -S .\sqlexpress -U sa -P 000000 -d master -Q"BACKUP DATABASE test to disk='c:\aa\aaa.bak'"
    已为数据库 'test',文件 'test' (位于文件 2 上)处理了 176 页。
    已为数据库 'test',文件 'test_log' (位于文件 2 上)处理了 1 页。
    BACKUP DATABASE 成功处理了 177 页,花费 1.207 秒(1.201 MB/秒)。
    2、还原
    "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE" -S .\sqlexpress -U sa -P 000000 -d master -Q"RESTORE DATABASE test from disk='c:\aa\aaa.bak'"
    3、帮助
    C:\Documents and Settings\xuysh>"C:\Program Files\Microsoft SQL Server\90\Tools\
    Binn\SQLCMD.EXE" -?
    Microsoft (R) SQL Server 命令行工具
    版本 9.00.1399.06 NT INTEL X86
    版权所有 (c) Microsoft Corporation。保留所有权利。
    用法: Sqlcmd [-U 登录 ID] [-P 密码]
    [-S 服务器] [-H 主机名] [-E 可信连接]
    [-d 使用数据库名称] [-l 登录超时值] [-t 查询超时值]
    [-h 标题] [-s 列分隔符] [-w 屏幕宽度]
    [-a 数据包大小] [-e 回显输入] [-I 允许带引号的标识符]
    [-c 命令结束] [-L[c] 列出服务器[清除输出]]
    [-q "命令行查询"] [-Q "命令行查询" 并退出]
    [-m 错误级别] [-V 严重级别] [-W 删除尾随空格]
    [-u unicode 输出] [-r[0|1] 发送到 stderr 的消息]
    [-i 输入文件] [-o 输出文件] [-z 新密码]
    [-f | i:[,o:]] [-Z 新建密码并退出]
    [-k[1|2] 删除[替换]控制字符]
    [-y 可变长度类型显示宽度]
    [-Y 固定长度类型显示宽度]
    [-p[1] 打印统计信息[冒号格式]]
    [-R 使用客户端区域设置]
    [-b 出错时中止批处理]
    [-v 变量 = "值"...] [-A 专用管理连接]
    [-X[1] 禁用命令、启动脚本、环境变量[并退出]]
    [-x 禁用变量情况]
    [-? 显示语法摘要]
    --Osql sql2000和sql2005都有
    --1、备份
    "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\Osql.EXE" -S .\sqlexpress -U sa -P 000000 -d master -Q"BACKUP DATABASE test to disk='c:\aa\aaa.bak'"
    已为数据库 'test',文件 'test' (位于文件 3 上)处理了 176 页。
    已为数据库 'test',文件 'test_log' (位于文件 3 上)处理了 1 页。
    BACKUP DATABASE 成功处理了 177 页,花费 0.531 秒(2.730 MB/秒)。
    2、还原
    "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\Osql.EXE" -S .\sqlexpress -U sa -P 000000 -d master -Q"RESTORE DATABASE test from disk='c:\aa\aaa.bak'"
    已为数据库 'test',文件 'test' (位于文件 1 上)处理了 176 页。
    已为数据库 'test',文件 'test_log' (位于文件 1 上)处理了 2 页。
    RESTORE DATABASE 成功处理了 178 页,花费 0.200 秒(7.255 MB/秒)。
    3、帮助
    C:\Documents and Settings\xuysh>"C:\Program Files\Microsoft SQL Server\90\Tools\
    Binn\Osql.EXE" /?
    Microsoft (R) SQL Server 命令行工具
    版本 9.00.1399.06 NT INTEL X86
    版权所有 (c) Microsoft Corporation。保留所有权利。
    注意: osql 并不支持 SQL Server 2005的所有功能。
    请使用 sqlcmd。有关详细信息,请参阅 SQL Server 联机丛书。
    用法: osql [-U 登录 ID] [-P 密码]
    [-S 服务器] [-H 主机名] [-E 可信连接]
    [-d 使用数据库名称] [-l 登录超时值] [-t 查询超时值]
    [-h 标题] [-s 列分隔符] [-w 列宽]
    [-a 数据包大小] [-e 回显输入] [-I 允许带引号的标识符]
    [-L 列出服务器] [-c 命令结束] [-D ODBC DSN 名称]
    [-q "命令行查询"] [-Q "命令行查询" 并退出]
    [-n 删除编号方式] [-m 错误级别]
    [-r 发送到 stderr 的消息] [-V 严重级别]
    [-i 输入文件] [-o 输出文件]
    [-p 打印统计信息] [-b 出错时中止批处理]
    [-X[1] 禁用命令,[退出的同时显示警告]]
    [-O 使用旧 ISQL 行为禁用下列项]
    批处理
    自动调整控制台宽度
    宽消息
    默认错误级别为 -1 和 1
    [-? 显示语法摘要]
    --Isql ,sql2000工具,2005中没有
    --1、备份
    "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\Isql.EXE" -S .\sqlexpress -U sa -P 000000 -d master -Q"BACKUP DATABASE test to disk='c:\aa\aaa.bak'"
    已为数据库 'test',文件 'test' (位于文件 3 上)处理了 176 页。
    已为数据库 'test',文件 'test_log' (位于文件 3 上)处理了 1 页。
    BACKUP DATABASE 成功处理了 177 页,花费 0.531 秒(2.730 MB/秒)。
    2、还原
    "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\Isql.EXE" -S .\sqlexpress -U sa -P 000000 -d master -Q"RESTORE DATABASE test from disk='c:\aa\aaa.bak'"
    已为数据库 'test',文件 'test' (位于文件 1 上)处理了 176 页。
    已为数据库 'test',文件 'test_log' (位于文件 1 上)处理了 2 页。
    RESTORE DATABASE 成功处理了 178 页,花费 0.200 秒(7.255 MB/秒)。
    3、帮助
    Microsoft Windows XP [版本 5.1.2600]
    (C) 版权所有 1985-2001 Microsoft Corp.
    C:\Documents and Settings\xuysh>"C:\Program Files\Microsoft SQL Server\80\Tools\
    Binn\Isql.EXE"/?
    isql: unknown option ?
    usage: isql [-U login id] [-P password]
    [-S server] [-H hostname] [-E trusted connection]
    [-d use database name] [-l login timeout] [-t query timeout]
    [-h headers] [-s colseparator] [-w columnwidth]
    [-a packetsize] [-e echo input] [-x max text size]
    [-L list servers] [-c cmdend]
    [-q "cmdline query"] [-Q "cmdline query" and exit]
    [-n remove numbering] [-m errorlevel]
    [-r msgs to stderr]
    [-i inputfile] [-o outputfile]
    [-p print statistics] [-b On error batch abort]
    [-O use Old ISQL behavior disables the following]
    batch processing
    Auto console width scaling
    Wide messages
    default errorlevel is -1 vs 1
    [-? show syntax summary (this screen)]
      

  10.   

    那个存储过程  是要写在哪里? 是java类中 还是独立 的一个文件?
      

  11.   

    存储过程写在数据库里,好像sql server有个什么查询管理器的,你用那个工具可以执行sql的,执行那个存储过程的sql就可以了
      

  12.   

    不要让 Java 去做数据库管理方面的工作,切记!
      

  13.   

    要是写在数据库里的查询管理器,那我java类要如何调用????
      

  14.   

    强烈建议,先用c/s方式实现。
    然后用b/s,再建一个tomcat应用,
    备份恢复时 其他用户是不能使用系统的 
      

  15.   

    你原来怎么在java中调用sql的?方法一样的,只不过改成调用存储过程而以,存储过程的调用也是sql
    存储过程就像相当于你在数据库建了一个方法,可以通过sql调用这个方法
      

  16.   

    存储过程:create proc killspid (@dbname varchar(20))       
    as       
    begin       
    declare @sql   nvarchar(500)       
    declare @spid  int       
    set @sql='declare getspid cursor for select spid from sysprocesses where dbid=db_id('''+@dbname+''')'       
    exec (@sql)       
    open getspid       
    fetch next from getspid into @spid       
    while @@fetch_status <> -1       
    begin       
    exec('kill '+@spid)       
    fetch next from getspid into @spid       
    end       
    close getspid       
    deallocate getspid       
    end    在数据库的查询分析器里测试成功了,语句如下:use master exec killspid 'xinfadi_testDB'restore database xinfadi_testDB from disk='d:\\xinfadi.bak' with replace已为数据库 'xinfadi_testDB',文件 'xinfadi' (位于文件 1 上)处理了 557208 页。
    已为数据库 'xinfadi_testDB',文件 'xinfadi_log' (位于文件 1 上)处理了 2 页。
    RESTORE DATABASE 成功处理了 557210 页,花费 118.640 秒(36.692 MB/秒)。但是在程序中用java调用时,却出现异常,代码如下:String path = file.getPath() + "\\" + name + ".bak";// name文件名
    String reSQL = "use master exec killspid 'xinfadi_testDB'restore database xinfadi_testDB from disk=? with replace"; // 还原数据库
    PreparedStatement recovery = DataBaseUtil.getConnection()
    .prepareStatement(reSQL); // 执行还原数据库
    recovery.setString(1, path);
    if (!recovery.execute())
    over = "还原成功";
    else
    over = "还原失败";异常:
    ERROR - Connection reset by peer: socket write error
    Exception in thread "Timer-0" org.springframework.dao.DataAccessResourceFailureException: could not execute query; nested exception is org.hibernate.exception.JDBCConnectionException: could not execute query
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:627)
    at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:921)
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:913)
    at com.once.xfd.hibernate.auction.service.AuctionBidService.findAuctionsToUnStart(AuctionBidService.java:433)
    at com.once.xfd.hibernate.auction.service.AuctionBidService.saveAuctionStarting(AuctionBidService.java:477)
    at com.once.xfd.daemon.auction.ComputeResultsTask.run(ComputeResultsTask.java:22)
    at java.util.TimerThread.mainLoop(Unknown Source)
    at java.util.TimerThread.run(Unknown Source)
    Caused by: org.hibernate.exception.JDBCConnectionException: could not execute query
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.loader.Loader.doList(Loader.java:2223)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
    at org.hibernate.loader.Loader.list(Loader.java:2099)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
    at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:930)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
    ... 8 more
      

  17.   

    不知道支持不支持多条sql语句一起执行,你把这些多条sql语句写到一个存储过程,java只调用该存储过程试试。
    看你的错误提示,是Hibernate异常,你不用Hibernate,直接用jdbc试试
    另外,存储过程调用,用CallableStatement试试
      

  18.   

    既然已经断开数据库连接,你就没法跟它再交互了
    可以考虑把数据库备份处理写到一个批处理去,然后用java调用该批处理
      

  19.   

    hibernate换不了 这是个已经完成的项目,我目前是往项目里头添加小功能 进一步完善该项目,我再试试 谢谢阿宝前辈哈
      

  20.   

    Java连接SqlServer2008,执行备份和恢复
    http://www.minioa.net/viewtopic.php?f=13&t=112&p=167#p167