锁定的SQL Server数据文件
我有一个SQL Server数据库,其中的数据和日志文件存储在外部USB驱动器上。我在办公室的主要开发机器和不在办公室的笔记本电脑之间切换外部驱动器。在台式机和便携式计算机之间移动时,我尝试使用sp_detach_db和sp_attach_db。我发现这在桌面上可以正常进行,我可以分离并重新连接数据库,而没有任何问题。但是在笔记本电脑上,我无法重新连接数据库(该数据库实际上最初是在笔记本电脑上创建的,第一次分离是在笔记本电脑上进行的)。当我尝试在笔记本电脑上重新连接时,出现以下错误:
无法打开物理文件" p:\ SQLData \ AppManager.mdf"。操作系统错误5:" 5(未找到错误)"
我发现有很多对此错误的引用,所有错误都表明这是一个权限问题。因此,我沿着这条路走,并确保SQL Server服务帐户具有适当的权限。我还在相同的路径上创建了一个新数据库,并且能够成功分离并重新添加它。因此,我相信权限不是问题。
进一步的调查表明,即使Windows Server认为它们已锁定,我也无法重命名,复制或者移动数据文件,即使SQL Server服务已停止也是如此。 Process Explorer不会显示任何锁定文件的进程。
我如何找出锁定文件并对其进行解锁的原因。
我已经验证数据库没有显示在SSMS中,因此SQL Server仍然认为它们不存在。
更新18/09/2008
到目前为止,我已经尝试了所有建议的答案,但均未成功。但是尝试这些建议有助于弄清情况。我可以验证以下内容:
- 仅当将外部驱动器连接到将数据库副本还原到的服务器时(实际上是"创建"数据库的服务器),才可以成功分离和重新连接数据库,可以将其称为"源服务器"。
- 分离数据库后,我仍然可以移动,复制或者重命名数据和日志文件,而外部驱动器仍连接到源服务器。
- 一旦我将外部驱动器移动到另一台计算机上,数据和日志文件就被"锁定",尽管我尝试了2种工具-Process Explorer和Unlocker,但都找不到与文件关联的锁定句柄。
注意分离数据库后,我尝试停止SQL Server服务并关闭源服务器,然后再移动外部驱动器仍然没有成功。
因此,在此阶段,要在台式机和笔记本电脑之间移动数据,我所要做的就是将数据备份到外部驱动器上,移动外部驱动器并从备份中还原数据。可以正常工作,但由于数据库大小合理(1gb),因此需要花费更多时间。无论如何,即使我试图避免走这条路,这也是我现阶段的唯一选择。
解决方案
回答
当我们使用企业管理器或者SSMS时,可以看到我们正在谈论的数据库的名称吗?可能有一个处于时髦状态的剩余数据库。我会确保我们在安全的地方有备份或者mdf副本。如果是这种情况,请尝试删除数据库,然后重新添加它。
回答
可以复制文件吗?我很想知道我们是否可以将文件复制到笔记本电脑上,然后将其添加到笔记本电脑上。我想这也是某种权限错误,但是听起来我们已经完成了解决此问题的工作。
文件上有任何属性吗?
更新:如果我们无法复制文件,则必须锁定文件。我会检查一下我尚未尝试过的Unlocker,但这听起来是一个不错的起点。我们也可以尝试在文件权限下获取文件的所有权。
回答
我会尝试在桌面上备份数据库,然后查看它是否将在笔记本电脑上成功还原。不会解释问题,但至少我们可以继续前进。
回答
使用/ c开关在调试模式下运行sqlservr.exe,然后查看启动时发生的情况。可以通过制作文件副本并将副本转移到原始文件来解决任何锁定或者权限问题。
还要检查关联的日志文件(.ldf)..如果该文件丢失或者不可用,我们将无法将数据库装载到任何正常/一致的状态,而无需诉诸紧急旁路模式。
回答
听起来很疯狂,我们是否尝试过通过右键单击/属性/安全性手动授予文件权限?我认为SQL Server 2005将对执行分离的主体(可能是帐户,可能是运行SQL Server服务的帐户)专门设置对分离文件的权限,并且没有其他人可以操纵该文件。为了解决这个问题,我不得不手动授予自己对MDF和LDF文件的文件权限,然后再移动或者删除它们。另请参阅onupdatecascade.com上的博客文章