[英]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 AFTER nnn - 此選項將在等待nnn秒以完成打開的事務后回滾所有打開的事務。 在我們的示例中,我們指定進程應該在回滾任何打開的事務之前等待30秒。
指定RESTRICTED_USER時 ,只有db_owner,dbcreator或sysadmin角色的成員才能使用該數據庫。 MULTI_USER將數據庫返回到正常運行狀態。
第二種方式:使用ssms 2008 R2我們可以做同樣的事情
若要更改數據庫屬性,SQL Server 必須關閉與數據庫的所有其他連接 。 您確定要更改屬性並關閉所有其他連接嗎? 是還是不是
第三種方式:以下命令也將關閉所有連接。
ALTER DATABASE [DbName] SET OFFLINE
go
ALTER DATABASE [DbName] SET ONLINE
現在數據庫已准備好進行恢復
只能建立一個與數據庫的連接。 - 運行以下命令以查看與數據庫的重復連接的來源。
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.