Bit*_*der 6 sql locking wix file sql-server-express
使用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实例有任何进一步的想法?
使用"SQL Server Express Utility"(SSEUtil.exe)或命令分离SSEUtil使用的数据库.
SQL Server Express实用程序,SSEUtil是一个可以让您轻松与SQL Server交互的工具,http://www.microsoft.com/downloads/details.aspx? FamilyID = fa87e828-173f-47e-a85c-27ed01cf6b02 &DisplayLang = en
此外,在最后一次连接关闭后停止服务的默认超时是一小时.在开发框中,您可能希望将其更改为五分钟(允许的最小值).
此外,您可以通过Visual Studio的服务器资源管理器数据连接进行打开连接,因此请确保从那里的任何数据库断开连接.
H:\Tools\SQL Server Express Utility>sseutil -l
1. master
2. tempdb
3. model
4. msdb
5. C:\DEV_\APP\VISUAL STUDIO 2008\PROJECTS\MISSICO.LIBRARY.1\CLIENTS\CORE.DATA.C
LIENT\BIN\DEBUG\CORE.DATA.CLIENT.MDF
H:\Tools\SQL Server Express Utility>sseutil -d C:\DEV*
Failed to detach 'C:\DEV_\APP\VISUAL STUDIO 2008\PROJECTS\MISSICO.LIBRARY.1\CLIE
NTS\CORE.DATA.CLIENT\BIN\DEBUG\CORE.DATA.CLIENT.MDF'
H:\Tools\SQL Server Express Utility>sseutil -l
1. master
2. tempdb
3. model
4. msdb
H:\Tools\SQL Server Express Utility>
Run Code Online (Sandbox Code Playgroud)
使用.NET Refector,以下命令用于分离数据库.
string.Format("USE master\nIF EXISTS (SELECT * FROM sysdatabases WHERE name = N'{0}')\nBEGIN\n\tALTER DATABASE [{1}] SET OFFLINE WITH ROLLBACK IMMEDIATE\n\tEXEC sp_detach_db [{1}]\nEND", dbName, str);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7874 次 |
| 最近记录: |