在作业中,自动执行恢愎操作,报错排他

angel_new 2010-09-07 10:04:55

1> 2> 3> 消息 3101,级别 16,状态 1,服务器 XUHUI\GPRS,行 1
因为数据库正在使用,所以未能获得对数据库的排它访问权。
消息 3013,级别 16,状态 1,服务器 XUHUI\GPRS,行 1
RESTORE DATABASE 操作异常终止。
消息 3101,级别 16,状态 1,服务器 XUHUI\GPRS,行 2
因为数据库正在使用,所以未能获得对数据库的排它访问权。
消息 3013,级别 16,状态 1,服务器 XUHUI\GPRS,行 2
RESTORE DATABASE 操作异常终止。
NULL


我在网上查,exec p_killspid 'gprs0719'这样杀死所有的连接就可以




exec p_killspid 'gprs0719'
restore database gprs0719 from disk='E:\测试采集\gprs0719\gprs071920100906160001.bak' with norecovery,replace
restore database gprs0719 with recovery

这样执行没问题


但用第一步:exec p_killspid 'gprs0719'
第二步:exec master..xp_cmdshell 'osql -S XUHUI\GPRS -U sa -P 123 -i e:\recover.sql'
就报错
放到作业里,也不执行

过程如下
create proc p_killspid
@dbname sysname --要关闭进程的数据库名
as
declare @s nvarchar(1000)
declare tb cursor local for
select s='kill '+cast(spid as varchar)
from master..sysprocesses
where dbid=db_id(@dbname)

open tb
fetch next from tb into @s
while @@fetch_status=0
begin
exec(@s)
fetch next from tb into @s
end
close tb
deallocate tb

GO
...全文
92 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
claro 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 newb921 的回复:]
错误是:无法打开用户默认数据库。登录失败。
NULL
[/Quote]sa登录
claro 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 newb921 的回复:]
楼上这是什么意思呢
[/Quote] 设置数据库为单用户模式,无须kill sql process。

mshuangjiaqia 2010-09-07
  • 打赏
  • 举报
回复
楼主你把你还原的路径改到别的地方,就可以。
angel_new 2010-09-07
  • 打赏
  • 举报
回复
楼上,我执行了
Use Master

Alter Database gprs0719

SET SINGLE_USER With ROLLBACK IMMEDIATE

--exec pro_restore
--exec p_killspid 'gprs0719'
--exec pro_killpro
exec master..xp_cmdshell 'osql -S XUHUI\GPRS -U sa -P 123 -i e:\recover.sql'

Use master;
Go

Alter Database gprs0719

SET MULTI_USER

Go

错误是:无法打开用户默认数据库。登录失败。
NULL



angel_new 2010-09-07
  • 打赏
  • 举报
回复
楼上这是什么意思呢
claro 2010-09-07
  • 打赏
  • 举报
回复
通常是
use master
go
alter database gprs set single_user with rollback immediate
go
angel_new 2010-09-07
  • 打赏
  • 举报
回复
最最主要的问题是,现在杀死连接是一定的了因为
exec pro_killpro
restore database gprs0719 from disk='E:\测试采集\gprs0719\gprs071920100906160001.bak' with norecovery,replace
restore database gprs0719 with recovery
这样能够成功,
现在问题出现在
我将这两条恢愎的语句写到了文件里
在查询分析器里执行下面的语句报错
exec p_killspid 'gprs0719'
exec master..xp_cmdshell 'osql -S XUHUI\GPRS -U sa -P 123 -i e:\recover.sql'
angel_new 2010-09-07
  • 打赏
  • 举报
回复
我看了下sql server企业管理器里的进程信息,显示连接上的进程所用的数据库都是master,没有gprs,真是无语了,没有人在用gprs怎么还不让恢愎,还有排他错呀
喜-喜 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 duanzhi1984 的回复:]
你是要恢复数据库!

提示的意思 是原数据库正在使用,所以必须保证你要恢复的数据库不在使用中

你保证exec p_killspid 'gprs0719'
可以终止所有的连接。。
[/Quote]

支持...
duanzhi1984 2010-09-07
  • 打赏
  • 举报
回复
你是要恢复数据库!

提示的意思 是原数据库正在使用,所以必须保证你要恢复的数据库不在使用中

你保证exec p_killspid 'gprs0719'
可以终止所有的连接。。
es021 2010-09-07
  • 打赏
  • 举报
回复
支持一个
angel_new 2010-09-07
  • 打赏
  • 举报
回复
然后,我必需要说的是,我是怎么把这个问题解决的
1、数据库排他问题,用exec p_killspid 'gprs0719'
没有错,也可以用6楼的use master
go
alter database gprs set single_user with rollback immediate
go
但这些个语句,不能分步在外边执行,要都写到
exec master..xp_cmdshell 'osql -S XUHUI\GPRS -U sa -P 123 -i e:\recover.sql'
这个recover.sql文件里,文件里的内容是这样:
use master exec pro_killpro
restore database gprs0719 from disk='E:\测试采集\gprs0719\gprs071920100907140001.bak' with norecovery,replace
restore log gprs0719 from disk='E:\测试采集\gprs0719\gprs071920100907140100.trn' with norecovery
restore log gprs0719 from disk='E:\测试采集\gprs0719\gprs071920100907143000.trn' with norecovery
restore database gprs0719 with recovery

这样做成做业,就没有问题了,在查询分析器里也没有问题,都不报错。
再有朋友遇到这个问题,就可以不用东找西找了,哈哈哈~~~
angel_new 2010-09-07
  • 打赏
  • 举报
回复
首先,谢谢大家

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧