当使用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实例有进一步想法?