zoukankan      html  css  js  c++  java
  • 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数据库上操作。

  • 相关阅读:
    Python学习之路(一)之Python基础1
    【第十一课】Tomcat原理解析【转】
    【第十课】Tomcat入门
    【第九课】MriaDB密码重置和慢查询日志
    【第八课】php-fpm.conf配置文件解析
    【第七课】Nginx反向代理和负载均衡
    【第六课】Nginx常用配置下详解
    maven项目中更新了核心库后导致一些包提示未定义,如:The import org.json cannot be resolved
    js代码突然在花括号回车自动多加了一个大括号
    SQL0419N 十进制除法运算无效,因为结果将有一个负小数位。 SQLSTATE=42911
  • 原文地址:https://www.cnblogs.com/EasonJim/p/4756844.html
Copyright © 2011-2022 走看看