我正在使用 SQL-Server,使用 SQL-Server Management Studio (SSMS)。
为了执行备份恢复,我通过 SSMS 创建了一个名为的 SQL Server 登录PORT-DDM\SQLEXPRESS
,这是连接 SQL-Server 数据库的典型方式。
我还创建了第二个实例,名为PORT-DDM\SQLEXPRESS01
(其中PORT-DDM
是我的 PC 的名称),现在我想将PORT-DDM\SQLEXPRESS
实例中的备份还原到PORT-DDM\SQLEXPRESS01
实例中。我已进行PORT-DDM\SQLEXPRESS
备份并将其存储在本地目录中C:\Temp_Folder\<filename>.bak
,但在执行还原操作时,出现以下错误消息:
===================================
Restore of database '<Prod>_<Customer>' failed. (Microsoft.SqlServer.Management.RelationalEngineTasks)
------------------------------
Program Location:
at Microsoft.SqlServer.Management.RelationalEngineTasks.RestoreDatabaseTaskFormComponent.PerformTask(ITaskExecutionContext context)
at Microsoft.SqlServer.Management.RelationalEngineTasks.RestoreDatabaseTaskFormComponent.Perform(ITaskExecutionContext context)
at Microsoft.SqlServer.Management.TaskForms.TaskExecutionManager.ExecuteTaskSequence(ISfcScriptCollector collector)
===================================
System.Data.SqlClient.SqlError: The operating system returned the error '5(Access is denied.)' while attempting 'RestoreContainer::ValidateTargetForCreation' on 'C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\DATA\<Prod>_<Customer>.mdf'. (Microsoft.SqlServer.SmoExtended)
------------------------------
For help, click: https://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=16.100.47021.0&LinkId=20476
------------------------------
Program Location:
at Microsoft.SqlServer.Management.Smo.RestorePlan.Execute()
at Microsoft.SqlServer.Management.RelationalEngineTasks.RestoreDatabaseTaskFormComponent.PerformTask(ITaskExecutionContext context)
(所提及的链接似乎已失效。)
我该怎么办?
哦,我忘了说了:我的备份所在的位置可供我的电脑的每个用户访问:
我已将完全控制权授予所有人,使用icalcs
。现在我陷入困境,因为 SQL-Server 正在使用以下文件:C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\DATA\<Prod>_<Cust>.mdf
。
为了避免这种情况,我重新启动了我的 SQL-Server 会话,甚至重新启动了我的整个 PC,但问题仍然存在。
根据要求,“恢复数据库屏幕”的图像:
这正在变成一场血腥的噩梦:
- 首先,我收到错误消息,说他需要文件的管理员访问权限。
- 然后他抱怨说文件正在使用中,所以我必须重新启动计算机。
- 然后他抱怨说还有其他文件需要管理员权限。
- 一旦管理好这些,他又抱怨文件正在使用中,所以我需要重新启动计算机。
- 最后他说“但是你不能这样做:你正在将数据库恢复到原来的位置。”
=> 最后一件事是我创建“SQLExpress 01 ”登录的确切原因:为了能够拥有相同数据库的不同实例:一个用于运行时测试,一个用于恢复从客户站点检索的备份。通常,后者工作正常,但现在我正在处理一个数据库服务器无法访问的客户,所以我使用“生成脚本”来获取±备份。我的想法是再次备份我的计算机(在“SQLEXPRESS”登录下),在“SQLEXPRESS01”登录下恢复,并将其用于提到的“生成脚本”场景。
当您有备份文件时,该文件包含数据库文件在实例下运行时的位置。
例如,您
...\SQLEXPRESS
实例上的数据库可能具有位于以下目录中的数据库文件:此信息也存储在您为实例中的数据库创建的任何备份文件中,可以通过运行以下命令进行检索:
该命令将显示 *.mdf 和 *.ldf 文件的原始位置。
为了将备份文件恢复到第二个实例,您必须将
MOVE
数据库中包含的逻辑文件恢复到第二个实例的新位置。我们假设第二个 SQLExpress 实例的数据库文件位于此处:
当您在 SSMS 中运行 GUI 并单击命令时,将 *.MDF 和 *.LDF 文件的文件位置更改为新的子目录非常重要。
打开 RESTORE 的 GUI
选择
C:\Temp_Folder\<filename>.bak
文件在SSMS 中恢复 GUI 的文件部分,确保将物理文件位置(恢复为)更改为新的 SQLEXPRESS01 目录。(例如屏幕截图)

通过单击 GUI 中的“脚本”按钮生成恢复脚本,并验证脚本中的文件位置是否正确。

关闭 GUI 并执行脚本(您可以在这里学到很多东西)。
祝你好运。
你收到消息的原因
5. Access denied
可能是SQLEXPRESS
您的第一个实例的目录,而您无法使用第二个帐户访问该目录。SQLEXPRESS01
,但尚未更改恢复位置以指向第二个实例的数据目录(例如C:\SQLServer\MSSQL15.SQLEXPRESS01\DATA\
)通过 SSMS 中的 GUI 将命令添加
MOVE
到恢复脚本(也称为:在 GUI 中分配正确的目录以指向例如C:\SQLServer\MSSQL15.SQLEXPRESS01\DATA\
)将确保您使用正确的目录并可以防止错误access denied
。