使用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;" />
Run Code Online (Sandbox Code Playgroud)
我们发现即使在停止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
Run Code Online (Sandbox Code Playgroud)
该文件由sqlserver.exe实例打开,PID为:4680
停止"SQL Server(SQLEXPRESS)"服务,使用PID:4644终止进程,但仅剩下PID:4680.
看到剩下的进程的所有者是DefaultAppPool,我尝试的下一件事就是停止IIS(这个数据库是从ASP.Net应用程序中使用的).不幸的是,这并没有扼杀这个过程.
手动删除剩余的sql server进程会删除数据库文件上的打开文件句柄,允许复制/移动它们.
不幸的是,我希望在WiX安装程序的一些安装前/后安装任务中复制/恢复这些文件 - 因此我希望有一种方法可以通过停止Windows服务来实现这一点,而不是必须弹出来杀死所有实例sqlserver.exe因为这会带来一些问题:
有没有人对如何关闭与特定用户实例关联的sql server实例有任何进一步的想法?