• SQL Server数据库还原:"因为数据库正在使用,所以无法获得对数据库的独占访问权"


    如题,网上找了一些客套的方法,如果不想去折腾,请看我的方法:

    1、先脱机数据库,这个目的就是为了停掉所有链接

    2、选择还原数据库,如果提示日志尾部不完整,请选择数据库属性的选项,覆盖现有数据。

    还可以尝试以下方法:

    一、SQL Server数据库备份还原后,在数据库名称后会出现“受限制访问”字样。

    解决办法:

    右键点击数据库->【属性】->【选项】->【状态】->【限制访问】->选择【Multiple】->【确定】

    二、在对SQL Server数据库进行还原时,提示:System.Data.SqlClient.SqlError:因为数据库正在使用,所以无法获得对数据库的独占访问权。(Microsoft.SqlServer.Smo)。出现此问题的原因是在还原数据库时,有其他用户正在使用数据库。还原数据库要求数据库工作在单用户模式。通常就是DBA在操作时,不允许其他用户连接数据库。

    解决办法:

    方法一(最方便):右键点击数据库->【属性】->【选项】->【状态】->【限制访问】->选择【Single...】->【确定】。然后还原。(十有八九这个方法是行不通的,如有有很多人连接着,设置后就省下最后一个,那么可能那个人不是你,你还是无法还原)

    方法二(最直接):断开数据库连接。

    方法三(最暴力):注销/重启数据库服务器。(也可能行不通,如果重启后,你的操作不够快,最后还是给别人先连上了)

    方法四(最麻烦):写代码修改数据库相关属性,虽然麻烦,有的时候还是要用到,那就用到的时候再研究。

    1、先切换数据库到master数据库。执行语句:

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

    2、然后逐步运行语句 

    exec('kill 64')

    其中64为上面的spid

    方法四点一(最麻烦的第二种选择):还是写代码,一个全自动脚本:

    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语句,断开所有用户链接,并回滚所有事务,具体SQL语句如下:

    alter database [数据库名称] 
    set OFFLINE with rollback IMMEDIATE

    注意:以上操作全部在master数据库上操作。

  • 相关阅读:
    c++笔试题3
    C++笔试题
    C++编程指南续(10-11)
    C++详解(8-9)
    C++编程指南(6-7)
    C++编程指南续(4-5)
    C++编程指南续
    C++的编程指南
    HPSocket介绍与使用
    WinForm中TreeView控件实现鼠标拖动节点(可实现同级节点位置互换,或拖到目标子节点)
  • 原文地址:https://www.cnblogs.com/EasonJim/p/4756844.html
Copyright © 2020-2023  润新知