由于数据库正在使用,因此无法获得独占访问权限

Moh*_*yan 37 c# sql t-sql database-restore

我正在使用以下代码来恢复数据库,

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

但我收到以下异常

"Exclusive access could not be obtained because the database is in use.
RESTORE DATABASE is terminating abnormally.
Changed database context to 'master'."
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

Kei*_*thS 52

只有在数据库没有任何连接时(除了你的数据库),才能进行恢复.MS SQL Server上关闭所有用户的简单方法是:

ALTER DATABASE [MyDB] SET Single_User WITH Rollback Immediate
GO
Run Code Online (Sandbox Code Playgroud)

现在,您可以执行恢复而不受惩罚.完成恢复后,请确保将其重新设置为多用户模式:

ALTER DATABASE [MyDB] SET Multi_User
GO
Run Code Online (Sandbox Code Playgroud)

  • 我已将数据库设为Single_user,但我遇到了同样的问题! (2认同)

Moh*_*yan 14

因此,我写了以下方法来恢复我的数据库,
我是否正确?

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";
    }
}
Run Code Online (Sandbox Code Playgroud)


Ima*_*idi 9

最好的方法

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 
Run Code Online (Sandbox Code Playgroud)
  • WITH ROLLBACK IMMEDIATE - 此选项不等待事务完成它只是开始回滚所有打开的事务
  • WITH ROLLBACK AFTER nnn - 此选项将在等待nnn秒以完成打开的事务回滚所有打开的事务.在我们的示例中,我们指定进程应该在回滚任何打开的事务之前等待30秒.

  • RESTRICTED_USER指定,只有成员的db_owner,dbcreator或系统管理员角色可以使用该数据库.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
Run Code Online (Sandbox Code Playgroud)

现在数据库已准备好进行恢复

更多(mssqltips:获得恢复SQL Server数据库的独占访问权限)

  • SET OFFLINE和SET ONLINE也适用于SQL 2008。请注意,两者都必须连续进行;如果数据库离线,则无法还原。 (2认同)

小智 9

在执行还原之前,可以使用SMO SqlServer对象上的方法来锁定指定数据库上的所有进程:

sqlServer.KillAllProcesses("databaseName");
Run Code Online (Sandbox Code Playgroud)