还原数据库时数据库被占用导致的还原失败解决方案

2014-11-24 17:06:36 · 作者: · 浏览: 0
还原 数据库时,碰到下面错误的解决方案:

System.Data.SqlClient.SqlError: 因为数据库正在使用,所以无法获得对数据库的独占访问权。 (Microsoft.SqlServer.Smo)

1. 比较直接的重启下Sql Server服务即可,此方案适合在普通个人电脑,或者电脑上只有这一个重要数据库的情况使用;

2.如果该数据库是服务器,上面有很多重要的数据库,不可能因为一个数据库把所有数据库的连接都断掉,可采用下面方案

在master数据库创建下面存储过程,作用:清除所有使用该数据库的会话;

USE master
GO
CREATE PROC [dbo].[sp_ClearDbConnections]  
        @DbName    VARCHAR(30)  
    AS
--清除某个数据库的所有数据库连接  
    DECLARE @SPID    INT  
    DECLARE @SqlForClear    NVARCHAR(100)  
      
    DECLARE curID CURSOR FORWARD_ONLY READ_ONLY FOR (  
        SELECT SPID  
        FROM Master.dbo.SysProcesses  
        WHERE DB_Name(DBID) = @DbName)  
    OPEN curID  
    FETCH NEXT FROM curID INTO @SPID  
    WHILE @@Fetch_Status = 0  
    BEGIN  
        SET @SqlForClear = N'KILL ' + Cast(@SPID AS NVARCHAR(10))  
        EXEC sp_ExecuteSql @SqlForClear  
        IF @@Error = 0  
            PRINT '已清除连接:' + Cast(@SPID AS VARCHAR(10))  
        FETCH NEXT FROM curID INTO @SPID  
    END  
    CLOSE curID  
    DEALLOCATE curID  
    PRINT '对数据库“' + @DbName + '”的连接清除操作完毕'
GO

之后执行该存储过程,清除使用该数据库的所有连接,再次还原(操作间隙时间要尽量短,避免在这个间隙又有连接进来);

exec sp_ClearDbConnections '要还原的数据库名称'