【发布时间】:2011-01-22 23:40:17
【问题描述】:
当使用带有如下连接字符串的 SQL Server Express 2005 的用户实例功能时:
<add name="Default" connectionString="Data Source=.\SQLExpress;
AttachDbFilename=C:\My App\Data\MyApp.mdf;
Initial Catalog=MyApp;
User Instance=True;
MultipleActiveResultSets=true;
Trusted_Connection=Yes;" />
我们发现即使停止SqlExpress服务,我们也无法复制数据库文件MyApp.mdf和MyApp_Log.ldf(因为它们被锁定),不得不求助于将SqlExpress服务从自动启动模式设置为手动启动模式,然后重启机器,然后我们就可以复制文件了。
我的理解是停止 SqlExpress 服务也应该停止所有用户实例,这应该会释放这些文件上的锁。但情况似乎并非如此 - 任何人都可以阐明如何停止用户实例,使其数据库文件不再被锁定?
更新
好的,我不再懒惰并启动了 Process Explorer。锁由 sqlserver.exe 持有 - 但有两个 sql server 实例:
sqlserver.exe PID: 4680 User Name: DefaultAppPool
sqlserver.exe PID: 4644 User Name: NETWORK SERVICE
文件由 PID:4680 的 sqlserver.exe 实例打开
停止“SQL Server (SQLEXPRESS)”服务,终止 PID: 4644 的进程,但单独留下 PID: 4680。
看到剩余进程的所有者是 DefaultAppPool,接下来我尝试停止 IIS(该数据库正在从 ASP.Net 应用程序中使用)。不幸的是,这也没有终止进程。
手动终止剩余的 sql server 进程确实会删除数据库文件上的打开文件句柄,从而允许它们被复制/移动。
不幸的是,我希望在 WiX 安装程序的一些安装前/安装后任务中复制/恢复这些文件 - 因此,我希望有一种方法可以通过停止 Windows 服务来实现这一点,而不必费劲杀死所有 sqlserver.exe 实例,因为这会带来一些问题:
- 杀死所有 sqlserver.exe 实例可能会对计算机上具有其他 Sql Server 实例的用户产生不良后果。
- 我无法轻松重启这些实例。
- 在安装程序中引入了额外的复杂性。
是否有人对如何关闭与特定用户实例关联的 sql server 实例有任何进一步的想法?
【问题讨论】:
-
A感谢所有答案 - 最有用的答案是使用 SSEUtil.exe。虽然我们需要从 WiX 安装程序中调用它,但我们可以看到它会有一些问题,即如果运行安装程序的用户没有执行 sp_dettach_db 的权限,无论我们使用哪种方法,这都是一个问题 - 所以我们可能只需在升级之前为用户提供一些手动预安装步骤,以便他们可以使用 SSEUtil.exe 自行处理。
-
我很好奇,SSEUtil.exe 不能解决权限问题吗?如果用户必须使用 SSEUtil 自己处理,那么安装程序不应该调用 SSEUtil 吗?
-
在我的测试中,情况似乎并非如此 - 我相信这只是因为在调用 SSEUtil 时安装程序没有提升......但我没有时间进一步调查它然而。在旁注中,我们发现 SSEUtil 不会在安装了 SqlServer 和 SqlServer Express 的 Windows7 x64 上正确列出所有活动用户实例,即使传入 -s .\SqlExpress 参数也是如此。所以我们还有一些边缘情况需要解决:)
标签: sql file wix locking sql-server-express