当使用SQL Server Express 2005的用户实例功能与连接字符串是这样的:如何停止Sql Server的用户实例? (SQL Express的用户实例数据库文件被锁定,即使停药后的SQL Express服务)
<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;" />
,我们发现我们不能照搬数据库文件MyApp.mdf和MyApp_Log.ldf(因为它们被锁定),即使在停止SqlExpress服务之后,也必须求助于将SqlExpress服务从自动启动模式设置为手动启动模式,然后重新启动计算机,然后才能复制文件。
这是我的理解,停止SqlExpress服务应该停止所有的用户实例,这应该释放这些文件上的锁。但似乎并非如此 - 任何人都可以阐明如何停止用户实例,以便数据库文件不再被锁定?
更新
OK,我不再是懒惰和发射了进程资源管理器。锁被持有sqlserver.exe - 但也有两个SQL Server实例:
sqlserver.exe PID: 4680 User Name: DefaultAppPool
sqlserver.exe PID: 4644 User Name: NETWORK SERVICE
该文件是由sqlserver.exe实例与PID开:4680
停止“SQL服务器(SQLEXPRESS )“服务,使用PID:4644处理了该进程,但是仅保留PID:4680。
作为剩余进程的所有者是DefaultAppPool,接下来我尝试的是停止IIS(从ASP.Net应用程序中使用此数据库)。不幸的是,这并没有消除这个过程。
手动关闭剩余的sql服务器进程并不会删除数据库文件上的打开文件句柄,从而可以复制/移动它们。
不幸的是,我希望在一些WiX安装程序的某些安装前/安装后任务中复制/恢复这些文件,因此我希望可以通过停止Windows服务来实现此目的,而不必掏出杀sqlserver.exe的所有实例为带来了一些问题:
- 杀死所有的sqlserver.exe可能对未来有自己的机器上其他的SQL Server实例的用户不良consequencies。
- 我无法轻松重新启动这些实例。
- 将更多复杂性引入到安装程序中。
有没有人有关于如何关闭与特定用户实例关联的SQL Server实例的任何进一步想法?
想了解所有答案 - 最有用的答案是使用SSEUtil.exe。虽然我们需要从WiX安装程序中调用它,但我们可以发现它会有点问题,即如果运行安装程序的用户没有执行sp_dettach_db的权限,无论使用哪种方法,这都是一个问题 - 因此我们可能只需在升级之前为用户提供一些手动的预安装步骤,以便他们可以使用SSEUtil.exe自行处理。 – Bittercoder 2010-03-14 09:09:14
我很好奇,是不是SSEUtil.exe解决权限问题?如果用户必须使用SSEUtil自己处理,那么安装程序是否应该调用SSEUtil? – AMissico 2010-03-14 17:54:45
在我的测试中,这似乎并不是这种情况 - 我相信这只是因为安装程序在调用SSEUtil时未被提升......但我还没有时间进一步调查它。 在附注上,我们发现SSEUtil不会在安装SqlServer和SqlServer Express的情况下,在Windows7 x64上正确列出所有活动用户实例,即使在传入-s。\ SqlExpress参数时也是如此。 所以我们仍然有一些边缘情况下工作:) – Bittercoder 2010-03-14 21:45:10