Sql server還原失敗(數據庫正在使用,無法獲得對數據庫的獨占訪問權)


Sql server還原失敗(數據庫正在使用,無法獲得對數據庫的獨占訪問權)

問題分析:數據庫還原的時候還有其他進程連在上面,導致無法獲得獨占造成的。

解決方案:
一、切斷連接進程
    1.查詢要還原的數據庫ID
    Select * from master..sysdatabases where name = '';
    2.獲取該數據庫的進程
    Select * from sys.sysprocesses a where a.dbid = '';
    3.殺掉連接在上面的進程
    kill @spid;
    此時去還原一般就可以了

二、    
    將當前需要還原的數據進行OFFLINE,還原后,再將該數據庫ONLINE。
    腳本如下,先運行第一腳本,還原成功后,運行第二腳本。

    1ALTER DATABASE [datebase] SET OFFLINE WITH ROLLBACK IMMEDIATE
    2ALTER 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



  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM