2010-09-03 86 views
6

我想恢復我的SQL Server 2005快遞版數據庫。我知道要恢復數據庫,我需要將其交給單個用戶。我給這個命令,使其向單一用戶無法恢復數據庫在SQL服務器(single_user)

USE [master] 
ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

此命令正確執行,我甚至可以看到一個小圖像在對象資源管理這個數據庫顯示,這是現在單個用戶上。

現在我試圖恢復數據庫,通過以下步驟 - >右鍵單擊數據庫和任務,然後恢復數據庫。我選擇備份文件所在的路徑並單擊還原。

但我仍然得到這個錯誤「由於數據庫正在使用(microsoft.sqlserver.smo),無法獲得獨佔訪問。我是否遺漏了任何東西。我已經使用了它,所有大多數網站都建議數據庫需要在單用戶模式,並沒有別的

我沒有嘗試分離和數據庫法的貼合我從來沒有做過,想知道這是否是安全的做

編輯:。謝謝這兩個建議我的答案相同,所以我選擇了一個答案。

我甚至選擇了一個答案從選項中刪除現有的數據庫。

回答

4

首先,最好是備份和恢復,而不是分離和附加。第二,當您嘗試運行恢復時,您正在使用的將數據庫設置爲SINGLE_USER的會話最有可能仍然存在(因爲您正在使用GUI,所以它在自己的連接下會話,所以它無法訪問)。

要麼將​​文件恢復爲文本命令,要麼將查詢窗口先切換爲使用另一個數據庫,例如master。或者你可以關閉查詢窗口,使其不再連接。

您可以隨時查看誰與select * from master.dbo.sysprocesses連接。

更新

假設你想恢復已經存在的數據庫,如果你有磁盤上的一個單一的備份文件(即不具有多個備份的話),有沒有需要恢復的日誌文件恢復完整備份後,再通過腳本恢復是超級,超級簡單:

RESTORE DATABASE DBName FROM DISK = 'C:\path\DBNameBackup.bak'; 

學習這個語法會讓你的生活更容易,因爲那麼當你設置你SINGLE_USER在連接的唯一會話是已。另外,我發現輸入恢復命令比使用GUI更快,並且我喜歡我控制的東西。重複此操作最終會牢牢記住它,而且不必再查看語法。

恢復日誌文件並不難。只是一件簡單的事情要記住,WITH NORECOVERY

RESTORE DATABASE DBName FROM DISK = 'C:\path\DBNameBackup.bak' WITH NORECOVERY; 
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackup1.log' WITH NORECOVERY; 
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackup2.log' WITH NORECOVERY; 
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackup3.log' WITH NORECOVERY; 
... 4 5 6 7 and so on 
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackupX.log' WITH RECOVERY; 

有...你恢復你的日誌文件,很容易。你甚至可以使用WITH STOPAT恢復到一個確切的時間點!另外,如果您忘記並意外提交最後的日誌恢復語句WITH NORECOVERY,那麼您只需發出RESTORE DATABASE DBName WITH RECOVERY;以執行使數據庫可用的最後步驟(回滾未提交的事務等)。

1
  • 轉到左側列表中「常規」下面的「選項」項。
  • 確保選中「覆蓋現有數據庫」(「恢復選項」部分)。

祝你好運。

2

你可以使用這個腳本使用數據庫殺死所有進程,然後嘗試重新恢復它:

declare @sql as varchar(20), @spid as int 
select @spid = min(spid) from master..sysprocesses where dbid = db_id('<database_name>') 
and spid != @@spid  

while (@spid is not null) 
begin 
    print 'Killing process ' + cast(@spid as varchar) + ' ...' 
    set @sql = 'kill ' + cast(@spid as varchar) 
    exec (@sql) 

    select 
     @spid = min(spid) 
    from 
     master..sysprocesses 
    where 
     dbid = db_id('<database_name>') 
     and spid != @@spid 
end 

print 'Process completed...'