逐浪云主机

立即开通

sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法(解决mssql独占问题)

作者:本站编辑 发布时间:2018-03-20 来源:佚名 点击数:

sql server 还原数据库的时候,提示"因为数据库正在使用,所以无法获得对数据库的独占访问权",无论我是重启数据库,还是重启计算机,分离数据库,都不能解决问题,多番尝试后,并且查找资料之后,终于解决了该问题。 


一、利用SQL语句,杀死正在使用该数据库的所有进程 代码如下 。

declare @dbname varchar(50) set @dbname='数据库名称'
declare @sql varchar(50) 

declare cs_result cursor local for select 'kill '+cast(spid as varchar(50)) 
from sys.sysprocesses where db_name(dbid)=@dbname 

open cs_result fetch next from cs_result into @sql 
while @@fetch_status=0 
begin execute(@sql) 
fetch next from cs_result 
into @sql end close cs_result 
deallocate cs_result



  

  该SQL语句利用游标循环所有正在使用该数据库的进程,并通过kill命令杀死进程。 

二、利用SQL语句,断开所有用户链接,并回滚所有事务,具体SQL语句如下 

ALTER DATABASE [数据库名称] SET OFFLINE WITH ROLLBACK IMMEDIATE


注意:

 1.SQL语句要在master数据库下面执行

 2.查看是否清除干净可以用如下sql语句 

select * from master..sysprocesses where dbid=db_id( '数据库名称')



完整技术讲解:


Sql server还原失败(数据库正在使用,无法获得对数据库的独占访问权)


问题分析:数据库还原的时候还有其他进程连在上面,导致无法获得独占造成的。


解决方案:

一、切断连接进程

    1.查询要还原的数据库ID

    Select * from master..sysdatabases where name = '';

    2.获取该数据库的进程

    Select * from sys.sysprocesses a where a.dbid = '';

    3.杀掉连接在上面的进程

    kill @spid;

    此时去还原一般就可以了


二、    

    将当前需要还原的数据进行OFFLINE,还原后,再将该数据库ONLINE。

    脚本如下,先运行第一脚本,还原成功后,运行第二脚本。

 1)ALTER DATABASE [datebase] SET OFFLINE WITH ROLLBACK IMMEDIATE
 
 2)ALTER DATABASE [datebase] SET ONLINE WITH ROLLBACK IMMEDIATE

   


    如果此时还原还是不行。可能是删完进程马上有新的进程连进来,

    导致一直失败。应用程序一直不停的进行数据库链接。

    这时,可以在单用户下还原。


三、删完进程马上有新的进程连进来,导致一直失败。

    单用户模式

    单用户模式设置:

    右键点击数据库 -> 属性 -> 选项 -> 状态 -> 限制访问(MULTI_USER 默认) -> 选择Single-> 确定。然后还原。


    或 GUI的模式,语句的办法比较简单

    USE MASTER
    GO
    ALTER DATABASE 数据库名字 SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
    GO



    设置单用户数据库必须要超级用户


四、

    -- 首先定位到master数据库

    use master

    go

    declare @dbname varchar(20) 

    set @dbname='dbtest' ---这是数据库名称 

    declare @sql nvarchar(500) 

    declare @spid int--SPID 值是当用户进行连接时指派给该连接的一个唯一的整数 

    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--如果FETCH 语句没有执行失败或此行不在结果集中。 

    begin 

    exec('kill '+@spid)--终止正常连接 

    fetch next from getspid into @spid 

    end 

    close getspid 

    deallocate getspid




图形操作界面:


  1. 找到无法还原的数据库,右键-属性


2、据库属性页面,点击左侧的‘选项’


同时在限制访问中进行操作,更改其值符:


3、点开状态,找到限制访问,修改选择值,把原来的multi_user,改成single_user,点击确定,保存修改


4、修改保存后,刷新数据库列表,可以看到该数据库后面已经显示‘单个用户’


5、操作还原即可成功



本文责任编辑: 加入会员收藏夹 点此参与评论>>
复制本网址-发给QQ/微信上的朋友