无法恢复数据库,数据库正在被会话使用

问题描述 投票:0回答:3

我正在使用 SQL Server 2005,并且在恢复数据库时遇到问题。我在尝试恢复数据库时收到此消息。

恢复失败。 (微软.SqlServer.Express.Smo)

“System.Data.SqlClient.SqlError:RESTORE 无法处理数据库 “AMOD”,因为该会话正在使用它。建议 执行此操作时使用主数据库。 (Microsoft.SqlServer.Express.Smo)”

我已经重新启动了程序,但我没有打开数据库中包含的任何表,但我仍然收到此消息。我是 SQL Server 新手,这是我第一次进行恢复。我感谢您提供的任何帮助。

sql-server-2005
3个回答
38
投票

您需要将所有用户踢出,并确保您不在该数据库中。假设您在 Management Studio 中,您需要通过这种方式将上下文更改为不同的数据库(或将数据库下拉列表切换到不同的数据库),这也会踢出任何其他用户(可能是您 - 对象资源管理器,对象资源管理器详细信息、其他查询窗口等都可能通过维护与数据库的连接而无意中阻止恢复):

USE master;
GO
ALTER DATABASE AMOD SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

完成恢复后,数据库即可再次使用:

ALTER DATABASE AMOD SET MULTI_USER;

0
投票

使用活动管理器来终止脚本中的资源依赖关系,或者简单地终止 SPID。


0
投票

需要切换到master来恢复当前数据库,如下所示:

 Imports System.Data.SqlClient

Module Module1
    Sub Main()
        ' Connection string for the SQL Server database
        Dim connectionString As String = "Data Source=YourServerName;Initial Catalog=YourDatabaseName;Integrated Security=True"

        ' Path to the backup file
        Dim backupFilePath As String = "C:\Path\To\BackupFile.bak"

        ' Name of the database to be restored
        Dim databaseName As String = "YourDatabaseName"

        ' SQL query to switch to the master database
        Dim switchToMasterQuery As String = "USE master"

        ' SQL query to restore the database
        Dim restoreQuery As String = $"RESTORE DATABASE [{databaseName}] FROM DISK = '{backupFilePath}' WITH REPLACE"

        ' Create a SqlConnection object
        Using connection As New SqlConnection(connectionString)
            ' Open the connection
            connection.Open()

            ' Create a SqlCommand object to switch to the master database
            Using switchToMasterCommand As New SqlCommand(switchToMasterQuery, connection)
                ' Execute the switch to master query
                switchToMasterCommand.ExecuteNonQuery()

                ' Create a SqlCommand object with the restore query and connection
                Using command As New SqlCommand(restoreQuery, connection)
                    ' Execute the restore query
                    command.ExecuteNonQuery()

                    Console.WriteLine("Database restore completed successfully.")
                End Using
            End Using
        End Using

        Console.ReadLine()
    End Sub
End Module
© www.soinside.com 2019 - 2024. All rights reserved.