我正在为客户编写一组(部分)自动化数据库部署的程序,这些程序大部分工作正常,但有时一个 RESTORE 命令失败并出现操作系统错误 32,关于另一个进程正在使用的文件(详情如下)。
我已经对此进行了广泛的搜索,但几乎没有发现适用于我的具体案例。我怀疑有些东西我忽略了,但我似乎找不到它。
这是命令:
RESTORE DATABASE [NBBC_Logistics] FROM DISK = '\\wpdboardq01\Shares\DbCopy\DevBackups\NBBC_Logistics_140916112310.bak'
WITH FILE=1, NOUNLOAD, STATS=10,
MOVE 'NBBC_Logistics' TO 'D:\MSSQL2K12\MSSQL11.MSSQLSERVER\MSSQL\DATA\NBBC_Logistics.mdf',
MOVE 'NBBC_Logistics_log' TO 'D:\MSSQL2K12\MSSQL11.MSSQLSERVER\MSSQL\DATA\NBBC_Logistics_log.ldf',
REPLACE
;
这会导致以下错误消息:
Msg 3634, Level 16, State 1, Line 11
The operating system returned the error '32(The process cannot access the file because it is being used by another process.)' while attempting 'RestoreContainer::ValidateTargetForCreation' on 'D:\MSSQL2K12\MSSQL11.DEV\MSSQL\DATA\NBBC_Logistics_log.ldf'.
Msg 3156, Level 16, State 8, Line 11
File 'NBCC_Logistics_Model2_log' cannot be restored to 'D:\MSSQL2K12\MSSQL11.DEV\MSSQL\DATA\NBBC_Logistics_log.ldf'. Use WITH MOVE to identify a valid location for the file.
Msg 3119, Level 16, State 1, Line 11
Problems were identified while planning for the RESTORE statement. Previous messages provide details.
Msg 3013, Level 16, State 1, Line 11
RESTORE DATABASE is terminating abnormally.
需要注意的一些事项:
这只发生在一些接收 SQL 实例上,它们中的大多数都在执行非常相似的命令,没有问题。
失败的实例是在同一个盒子(DEV 和 QA)上有多个 SQL 实例,并且它正在尝试将 DEV 的数据库备份恢复到同一数据库的 QA 版本。
同一实例中的其他 DB 可以毫无问题地执行其相应的 RESTORE 命令。
源逻辑文件名(显示在错误中)与数据库现有的文件名(在命令中命名)不同可能是相关的,但是,我相信我有这样的情况。
另外,请注意,错误报告的文件路径不是我在 MOVE 中指定的,而是原始文件路径(DEV 实例仍在使用原始 DB 文件)。
所以它似乎试图首先将数据库文件恢复到它们的原始路径位置,然后才将它们移动到我告诉它的路径。这与文档所说的相反,显然一般来说是完全不可行的,因为恢复数据库副本的人无法控制原始文件的位置,也无法保证此类路径存在且尚未使用.
任何帮助将不胜感激。
只是为了阻止一些不适用的自动响应:
- 目标数据库当前未由我或其他任何人使用。
- 也没有出现在
sp_lock
- 该命令指定
REPLACE
,它应该覆盖现有的数据库 - 指定的文件未被任何其他 Windows 进程打开
- 但是,错误中提到的文件是由盒子上的其他 Sql 实例打开的
- 共享上的 BAK 文件位置与它无关,在本地复制它不会改变任何东西,也不会重命名它。
- 指定的 db 文件和路径对于目标数据库是正确的
使用备份文件时,请确保使用逻辑文件名。在同一个备份文件中使用多个备份集时,请确保检查正在使用的文件是否正确。
在这种情况下:
看起来好像您有错误的逻辑文件名或备份集中的错误备份。我知道您指出了这一点,但询问备份集中的信息并仔细检查是有意义的。
查找文件名中的“拼写错误”或语法错误,例如路径中的“\\”。解决这些问题,你的陈述就会奏效。
(当然,您的路径中的拼写错误是上面给出的关于文件名不正确的答案的一个版本,但只是该问题的一个特例!)
这对我来说适用于 32 错误.. 另一个进程正在使用它。
https://support.microsoft.com/en-in/help/3153836/operating-system-error-32-when-you-restore-a-database-in-sql-server-20
如果您从包含 SQL Server 2012 SP3、2014 或 2016 中的 FILESTREAM 数据的条带化备份集进行还原,则可能会收到此错误。修复方法是安装上面链接中为您的版本列出的累积更新(或更高版本的 SP 或 CU)。