簡體   English   中英

由於數據庫正在使用,因此無法獲得獨占訪問權限

[英]Exclusive access could not be obtained because the database is in use

我正在使用以下代碼來恢復數據庫,

void Restore(string ConnectionString, string DatabaseFullPath, string backUpPath)
{
    string sRestore =
        "USE [master] RESTORE DATABASE [" + DatabaseFullPath + "] FROM DISK = N'" + backUpPath + "' WITH  FILE = 1,  NOUNLOAD,  STATS = 10";

    using (SqlConnection con = new SqlConnection(ConnectionString))
    {
        con.Open();
        SqlCommand cmdBackUp = new SqlCommand(sRestore, con);
        cmdBackUp.ExecuteNonQuery();
    }
}

但我收到以下異常

"Exclusive access could not be obtained because the database is in use.
RESTORE DATABASE is terminating abnormally.
Changed database context to 'master'."

我該如何解決?

只有在數據庫沒有任何連接時(除了你的數據庫),才能進行恢復。 MS SQL Server上關閉所有用戶的簡單方法是:

ALTER DATABASE [MyDB] SET Single_User WITH Rollback Immediate
GO

現在,您可以執行恢復而不受懲罰。 完成恢復后,請確保將其重新設置為多用戶模式:

ALTER DATABASE [MyDB] SET Multi_User
GO

因此我編寫了以下方法來恢復我的數據庫,
我是對的嗎?

void Restore(string ConnectionString, string DatabaseFullPath, string backUpPath)
{
    using (SqlConnection con = new SqlConnection(ConnectionString))
    {
        con.Open();

        string UseMaster = "USE master";
        SqlCommand UseMasterCommand = new SqlCommand(UseMaster, con);
        UseMasterCommand.ExecuteNonQuery();

        string Alter1 = @"ALTER DATABASE [" + DatabaseFullPath + "] SET Single_User WITH Rollback Immediate";
        SqlCommand Alter1Cmd = new SqlCommand(Alter1, con);
        Alter1Cmd.ExecuteNonQuery();

        string Restore = @"RESTORE DATABASE [" + DatabaseFullPath + "] FROM DISK = N'" + backUpPath + @"' WITH  FILE = 1,  NOUNLOAD,  STATS = 10";
        SqlCommand RestoreCmd = new SqlCommand(Restore, con);
        RestoreCmd.ExecuteNonQuery();

        string Alter2 = @"ALTER DATABASE [" + DatabaseFullPath + "] SET Multi_User";
        SqlCommand Alter2Cmd = new SqlCommand(Alter2, con);
        Alter2Cmd.ExecuteNonQuery();

        labelReport.Text = "Successful";
    }
}

在執行還原之前,可以使用SMO SqlServer對象上的方法來鎖定指定數據庫上的所有進程:

sqlServer.KillAllProcesses("databaseName");

最好的方法

Alter Database <Db_Name>  SET [SINGLE_USER | RESTRICTED_USER] 
With ROLLBACK [IMMEDIATE | AFTER 30]
go
--do your job that needs exclusive access
go
--Back to normal mode
Alter Database <Db_Name> SET MULTI_USER 
  • WITH ROLLBACK IMMEDIATE - 此選項不等待事務完成它只是開始回滾所有打開的事務
  • WITH ROLLBACK AFTER nnn - 此選項將在等待nnn秒以完成打開的事務回滾所有打開的事務。 在我們的示例中,我們指定進程應該在回滾任何打開的事務之前等待30秒。

  • 指定RESTRICTED_USER時 ,只有db_owner,dbcreator或sysadmin角色的成員才能使用該數據庫。 MULTI_USER將數據庫返回到正常運行狀態。


第二種方式:使用ssms 2008 R2我們可以做同樣的事情

  1. 右鍵單擊數據庫屬性
  2. 轉到選項 - >最后一節帶有狀態標題
  3. 更改限制SINGLE_USER的 訪問
  4. 對這個有用的問題回答是,這表明這種行為將關閉所有其他連接 ,我想這是我們在這里唯一要通過傳遞錯誤

若要更改數據庫屬性,SQL Server 必須關閉與數據庫的所有其他連接 您確定要更改屬性並關閉所有其他連接嗎? 是還是不是

  1. 恢復數據庫
  2. 執行步驟1-4,將Restrict Restrict更改回MULTI_USER

第三種方式:以下命令也將關閉所有連接。

ALTER DATABASE [DbName] SET OFFLINE
go    
ALTER DATABASE [DbName] SET ONLINE

現在數據庫已准備好進行恢復

更多( mssqltips:獲得恢復SQL Server數據庫的獨占訪問權限

  • 只能建立一個與數據庫的連接。 - 運行以下命令以查看與數據庫的重復連接的來源。

     EXEC SP_WHO2 
  • 檢查此列表,查看DBName列。 如果列出了數據庫,請檢查ProgramName和HostName列以查看誰正在嘗試連接。

  • 如果它不是可以自動重新連接的服務或其他可以關閉的應用程序,請記下SPID列中的數字以終止連接,並立即開始備份。 僅使用數字替換下面的SPID。

     KILL SPID RESTORE DATABASE DATABASENAME FROM DISK = 'X:\\PATHTO\\BACKUP.BAK' GO 
  • 如果成功完成,我們可以將新恢復的數據庫設置回多用戶模式。

     ALTER DATABASE DATABASENAME SET MULTI_USER WITH ROLLBACK IMMEDIATE GO 

這個問題的原因是不言而喻的(連接到數據庫當前打開/活動),但使用以下(谷歌它也是如此,你理解它),它會沒事的:

Alter Database YOURDB   
SET SINGLE_USER With ROLLBACK IMMEDIATE
GO

顯然,將YOURDDB替換為數據庫的名稱,並針對主數據庫運行它。

哦,只是如果你在單用戶模式下“卡住”,這將取消它:

Alter Database YOURDB   
SET MULTI_USER With ROLLBACK IMMEDIATE
GO

希望這可以幫助。

編輯:

您也可以按照操作查看連接的位置以及其他信息:

我在運行服務時測試了這個,它將重新連接到數據庫。 我發現您必須設置為單用戶模式,然后運行sp_who2以查看一個連接的來源,並記下SPID。 您可以在同一事務中為該SPID和還原運行kill命令,它應該通過。 這是我使用的序列:

使用MASTER ALTER DATABASE DATABASENAME SET SINGLE_USER與ROLLBACK IMMEDIATE GO

- 這將使它只能與數據庫建立一個連接。 - 運行以下命令以查看與數據庫的重復連接的來源。

EXEC SP_WHO2

- 查看此列表,查看DBName列。 如果列出了數據庫,請檢查ProgramName和HostName列以查看誰正在嘗試連接。 - 如果它不是可以自動重新連接的服務或其他可以關閉的應用程序,請記下SPID列中的數字以終止連接,並立即開始備份。 僅使用數字替換下面的SPID。

從DISK ='X:\\ PATHTO \\ BACKUP.BAK'中殺死SPAND RESTORE DATABASE DATABASENAME

- 如果成功完成,我們可以將新恢復的數據庫設置回多用戶模式。

ALTER DATABASE DATABASENAME設置MULTI_USER與ROLLBACK IMMEDIATE GO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM