为什么用ADO边接恢复SQL SERVER数据库老出错啊?(100分)

  • 主题发起人 主题发起人 诸葛白痴
  • 开始时间 开始时间

诸葛白痴

Unregistered / Unconfirmed
GUEST, unregistred user!
我只用了一个AODConnection,先将连接断开,再连接到Master数据库,然后再用Restore
Database这些语句恢复数据库,可是老是提示“数据库正在使用,无法获得数据库的排它
使用权”,看了一些BBS,可都没有真正的完整的代码及解决方案,谁帮忙啊!!!
 
这不是程序的错!这就DB正在操作,你确实不能恢复的!
你可以用 sql语句的use XXXdb来停止DB,这样你试试
 
to rockjie: 我试了,还是不行啊,没有办法吗?help
 
恢复数据库只能在独占方式下进行
可以用kill杀掉活动用户
sp_who 可以返回用户和进程的信息
 
你查一下yuzhshi的帖子,或问他,下面是我记录 的
adocon1连接你的业务数据库
adocon2连接master
adocom1连接adocon2
假设你的数据库为databasename
adocon1.connected:=false;
adocom1.commandtext:='backup database databasename to disk='+#39'c:/kkk.bak'+#39;
adocom1.execute;
adocom1.commandtext:='alter database databasename set offline with rollback immediate';
adocom1.execute;
adocom1.commandtext:='restore database databasename from disk='+#39+'c:/kkk.bak'+#39;
adocom1.execute;
adocom1.commandtext:='alter database databasename set online with rollback immediate';
adocom1.execute;
adocon1.connected:=true;
如果你在master数据库中建立存储过程来实现offline会很快



 
那就是还有连接在这个db上,没办法,只有等所有连接都断开了才能恢复
 
ugvanxk,执行出错:
'alter database databasename set offline with rollback immediate'

Incorrect syntax near the keyword 'set'
 
没有yuzhshi这么个富翁???
 
可以的, 用存储过程 sp_dboption 将数据库设置为
单用户状态(或 唯管理者可用, 或脱机等等) , 然后即
可进行备份. 我们单位的按揭贷款核算系统就是我
编的, 日常也就是这样用MO进行备份的, 具体程序
等下星期我到了单位再告诉你吧, 记得给分啊
 
是的,应该用这个,帮助上也这么说:
single user
When true, restricts database access to a single user connection. Any user who accesses the database when single user is set to true can continue to use the database. A new user can access this database only if all other users have disconnected or switched to another database. With this option set, the trunc. log on chkpt. database option is not supported. The log should be truncated after single-user operations are completed. When false, any number of currently connected users can access the database at the same time. By default, single user is false.
Set single user to true to ensure that no one is using the database when:
Renaming a database.
Restoring a database.
The status of this option can be determined by examining the IsSingleUser property of the DATABASEPROPERTY function.

我还没有试验,马上就做,不过,我已经用yaya8163的提示做到了断开链接:
先断开链接,连上master,ADOQ_1、ADOQ_2是TADOQuery,
ADOQ_1.Close ;
ADOQ_1.SQL.Clear ;
ADOQ_1.SQL.Add('sp_who');
ADOQ_1.Open ;
ADOQ_1.Filter :='dbname=''数据库名''';
ADOQ_1.Filtered :=true;
ADOQ_1.First ;
while not ADOQ_1.Eof do
begin
ADOQ_2.Close ;
ADOQ_2.SQL.Clear ;
ADOQ_2.SQL.Add('kill '+ADOQ_1.FieldByName('spid').AsString);
try //使用错误处理是因为在kill时链接可能已经断开了
ADOQ_2.ExecSQL ;
except
end;
ADOQ_1.Next ;
end;
ADOQ_1.Close ;
ADOQ_1.SQL.Clear ;
ADOQ_1.SQL.Add(SQL);//restore语句,这时就没有什么错误提示了
ADOQ_1.ExecSQL ;
 
没有成功,sp_dboption @dbname ='mydb', @optname = 'single user' , @optvalue = 'true',
断开mydb,连上master,再执行上面的语句,结果:
Cannot change the 'single user' option of a database while another user is in the database.
好吧,等fatbug的回答。
 
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=1121642
 
因为运行一直正常, 太久没有看那个程序了,
大致是可以使用SP_WHO查看当前所有连接
然后用KILL语句杀死其它用户进程.
 
如果是为了备份数据库,是不必将数据库设置为单用户状态的,但恢复则不同了,从帮助
上看,应该可以设置db为single_user状态,但如果当前db又有多个用户连接,SQL Server
就返回错误了,好像没有什么更好的办法了,另外也不建议再使用 sp_dboption ,因为
SQL Server2000 的帮助上明确写出,这个过程在SQL Server之后的版本将不再支持,还有
zhihuali的方法也不能使用,因为在SQL7上不支持这样的语法,只有SQL2000上才能用,看
来只有用sp_who+kill才能更好的在不同版本的SQL Server上来完成这个恢复数据库的工作
了,不知我的理解正确否?
 
而且,在使用sp_dboption @dbname = 'mydb',@optname = 'offline',@optvalue = 'true'
时,好像也有同样的问题,当有其他用户连接在上面时,也无法完成offline,提示也是
One or more users are using the database. The requested operation cannot be completed.
 
fatbug,你有没有其他的好办法?
 
fatbug,把你的解决方法贴出来吧,因为我上面的程序也有问题。

断开原来的连接,连上master,再sp_who和kill,再restore,都是没错的,数据库的确是
被恢复了,但之后就有问题了,我再把原来的(被恢复的)数据库连接上,但无论什么SQL
语句都出错,返回错误:“项目在所需的名称或序数中未被发现”,而此时,adoconnect
的状态都是正确的,但一查询或动作查询就错?????
 
还是没有最终的解决方法啊,我在查询管理器中用kill出错,说不能杀死自己的进程,
在代码里我没试过,不知为什么啊,有谁真的完全OK的能把代码贴出来看看吗?
 
我已有解决方案,但我想看一下 fatbug 的方案,博采众长,希望能找到一个最佳方案。

等待 fatbug ……
 
把ADOConnection1的ConnectionTimeout、CommandTimeout的数值设为1,在恢复数据库时等
上10到20秒钟,即可。此方法我已用过,很成功。
 

Similar threads

后退
顶部