當使用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