2010-03-02 4 views
6

SQL सर्वर एक्सप्रेस 2005 के उपयोगकर्ता उदाहरण सुविधा का उपयोग करते इस तरह एक कनेक्शन स्ट्रिंग के साथ:आप SQL सर्वर के उपयोगकर्ता-उदाहरण को कैसे रोकते हैं? (SQL एक्सप्रेस उपयोगकर्ता उदाहरण डेटाबेस फ़ाइलें, बंद को रोकने के बाद भी Sql एक्सप्रेस सेवा)

<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 सेवा को रोकने से सभी उपयोगकर्ता उदाहरणों को भी रोकना चाहिए, जो उन फ़ाइलों पर ताले को छोड़ देना चाहिए। लेकिन ऐसा कोई प्रतीत नहीं होता है - क्या कोई उपयोगकर्ता उदाहरण को रोकने के तरीके पर कुछ प्रकाश डाल सकता है, जैसे कि डेटाबेस फ़ाइलों को अब लॉक नहीं किया गया है?


अद्यतन

ठीक है, मैं आलसी जा रहा है बंद कर दिया और प्रोसेस एक्सप्लोरर ऊपर निकाल दिया। लॉक sqlserver.exe द्वारा आयोजित किया गया था - लेकिन वहाँ एसक्यूएल सर्वर के दो उदाहरणों हैं:

sqlserver.exe PID: 4680 User Name: DefaultAppPool 
sqlserver.exe PID: 4644 User Name: NETWORK SERVICE 

फ़ाइल पीआईडी ​​के साथ sqlserver.exe उदाहरण से खुला है: 4680

"एसक्यूएल सर्वर रोक (SQLEXPRESS) "सेवा, पीआईडी ​​के साथ प्रक्रिया को मार डाला: 4644, लेकिन पीआईडी ​​छोड़ दिया: 4680 अकेले।

शेष प्रक्रिया के मालिक के रूप में देखकर DefaultAppPool था, अगली चीज़ मैंने कोशिश की थी आईआईएस को रोक रहा था (यह डेटाबेस एएसपी.Net एप्लिकेशन से उपयोग किया जा रहा है)। दुर्भाग्यवश इस प्रक्रिया को या तो बंद नहीं किया।

शेष एसक्यूएल सर्वर प्रक्रिया को मैन्युअल रूप से मारने से डेटाबेस फ़ाइलों पर खुले फ़ाइल हैंडल को हटा दिया जाता है, जिससे उन्हें प्रतिलिपि/स्थानांतरित करने की अनुमति मिलती है।

दुर्भाग्यवश मैं उन फ़ाइलों को एक वाईएक्स इंस्टॉलर के कुछ पूर्व/पोस्ट इंस्टॉल कार्यों में कॉपी/पुनर्स्थापित करना चाहता हूं - जैसे कि मैं उम्मीद कर रहा था कि विंडोज़ सेवा को रोककर इसे हासिल करने का एक तरीका हो सकता है, बल्कि बाहर खोलना sqlserver.exe के सभी उदाहरणों को मारने के लिए है कि के रूप में कुछ समस्या बन गया है:

  1. सभी sqlserver.exe उदाहरणों हत्या अपनी मशीनों पर अन्य Sql सर्वर उदाहरणों के साथ उपयोगकर्ताओं के लिए अवांछनीय consequencies हो सकता है।
  2. मैं उन मामलों को आसानी से पुनरारंभ नहीं कर सकता।
  3. इंस्टॉलर में अतिरिक्त जटिलताओं का परिचय देता है।

क्या किसी के पास कोई विशिष्ट उपयोगकर्ता उदाहरण से जुड़े SQL सर्वर के उदाहरण बंद करने के बारे में कोई और विचार है?

+0

सभी के लिए एथहैंक - सबसे उपयोगी उत्तर SSEUtil.exe का उपयोग करना था। यद्यपि हमें इसे एक वाईएक्स इंस्टॉलर से आमंत्रित करने की आवश्यकता है, हम देख सकते हैं कि यह थोड़ा समस्याग्रस्त हो जाएगा यानी यदि इंस्टॉलर चलाने वाले उपयोगकर्ता को sp_dettach_db निष्पादित करने की अनुमति नहीं है जो कि हम किस विधि का उपयोग करते हैं, इस पर ध्यान दिए बिना समस्या है - तो हम बस अपग्रेड से पहले उपयोगकर्ताओं के लिए कुछ मैन्युअल प्री-इंस्टॉलेशन चरण प्रदान करें ताकि वे स्वयं को SSEUtil.exe का उपयोग करके संभाल सकें। – Bittercoder

+0

मैं उत्सुक हूं, SSEUtil.exe अनुमति समस्या के आसपास काम नहीं करता है? यदि उपयोगकर्ता को SSEUtil का उपयोग करके स्वयं को संभालना होगा, तो इंस्टॉलर का काम SSEUtil का आह्वान नहीं करना चाहिए? – AMissico

+0

मेरे परीक्षणों में यह मामला प्रतीत नहीं होता - मेरा मानना ​​है कि यह इसलिए था क्योंकि एसएसईयूटीटी का आह्वान करते समय इंस्टॉलर को ऊंचा नहीं किया गया था ... लेकिन मेरे पास अभी तक इसकी जांच करने का समय नहीं है। एक तरफ ध्यान दें कि हमने पाया है कि SSEUtil सभी सक्रिय उपयोगकर्ता-उदाहरणों को Windows7 x64 पर सही ढंग से सूचीबद्ध नहीं करेगा, दोनों SqlServer और SqlServer Express के साथ-साथ \ sqlExpress पैरामीटर में गुजरते समय भी स्थापित किया जाएगा। तो हमारे पास अभी भी काम करने के लिए कुछ किनारे के मामले हैं :) – Bittercoder

उत्तर

7

उपयोग "SQL सर्वर एक्सप्रेस उपयोगिता" (SSEUtil.exe) या पर लागू नहीं हो सकता है SSEUtil द्वारा उपयोग किए गए डेटाबेस को अलग करने का आदेश।

SQL सर्वर एक्सप्रेस उपयोगिता, SSEUtil एक उपकरण आपको आसानी से एसक्यूएल सर्वर के साथ बातचीत की सुविधा देता है, http://www.microsoft.com/downloads/details.aspx?FamilyID=fa87e828-173f-472e-a85c-27ed01cf6b02&DisplayLang=en

इसके अलावा, डिफ़ॉल्ट के बाद पिछले कनेक्शन बंद कर दिया है सेवा को रोकने के लिए समय समाप्ति के एक घंटे है। अपने विकास बॉक्स पर, आप इसे पांच मिनट (न्यूनतम अनुमत) में बदलना चाहते हैं।

इसके अतिरिक्त, आपके पास विजुअल स्टूडियो के सर्वर एक्सप्लोरर डेटा कनेक्शन के माध्यम से एक खुला कनेक्शन हो सकता है, इसलिए किसी भी डेटाबेस से डिस्कनेक्ट करना सुनिश्चित करें।

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> 

.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); 
+0

में परिवर्तनों के बाद बहिष्कृत किया जा रहा है धन्यवाद, मुझे इस कार्रवाई को कई ग्राहकों मशीनों पर एक WiX इंस्टॉलर के भीतर से आमंत्रित करने की आवश्यकता है (जिनके पास SSEUtil इंस्टॉल नहीं होगा) लेकिन मैं इसे यथासंभव विकल्प के रूप में खोजूंगा । – Bittercoder

+1

SSEUtil .NET अनुप्रयोग है। यह देखने के लिए .NET परावर्तक का उपयोग करना कि यह डेटाबेस को कैसे अलग कर रहा है। – AMissico

+0

मैं आपके पूर्ण प्रश्न के हिस्से के रूप में वाईएक्स इंस्टॉलर की आवश्यकता बनाने का सुझाव देता हूं। (आपका अंतिम वाक्य।) इसे याद करना आसान है। – AMissico

2

मैं निम्नलिखित सहायक विधि का उपयोग किया गया है MDF इकाई परीक्षण (MDF और एलडीएफ फ़ाइलें और इकाई परीक्षण ही के बाद साफ कर सकते हैं पर इतना है कि वर्ग सर्वर रिलीज ताले) में एसक्यूएल सर्वर से जुड़ी फाइलों को अलग करने ...

private static void DetachDatabase(DbProviderFactory dbProviderFactory, string connectionString) 
{ 
    using (var connection = dbProviderFactory.CreateConnection()) 
    { 
     if (connection is SqlConnection) 
     { 
      SqlConnection.ClearAllPools(); 

      // convert the connection string (to connect to 'master' db), extract original database name 
      var sb = dbProviderFactory.CreateConnectionStringBuilder(); 
      sb.ConnectionString = connectionString; 
      sb.Remove("AttachDBFilename"); 
      var databaseName = sb["database"].ToString(); 
      sb["database"] = "master"; 
      connectionString = sb.ToString(); 

      // detach the original database now 
      connection.ConnectionString = connectionString; 
      connection.Open(); 
      using (var cmd = connection.CreateCommand()) 
      { 
       cmd.CommandText = "sp_detach_db"; 
       cmd.CommandType = CommandType.StoredProcedure; 

       var p = cmd.CreateParameter(); 
       p.ParameterName = "@dbname"; 
       p.DbType = DbType.String; 
       p.Value = databaseName; 
       cmd.Parameters.Add(p); 

       p = cmd.CreateParameter(); 
       p.ParameterName = "@skipchecks"; 
       p.DbType = DbType.String; 
       p.Value = "true"; 
       cmd.Parameters.Add(p); 

       p = cmd.CreateParameter(); 
       p.ParameterName = "@keepfulltextindexfile"; 
       p.DbType = DbType.String; 
       p.Value = "false"; 
       cmd.Parameters.Add(p); 

       cmd.ExecuteNonQuery(); 
      } 
     } 
    } 
} 

नोट्स:

  • SqlConnection।ClearAllPools() "चुपके" कनेक्शन को समाप्त करने में बहुत मददगार था (जब कनेक्शन को पूल किया जाता है, तब भी यह सक्रिय रहेगा, भले ही आप इसे बंद करें); पूल कनेक्शन को स्पष्ट रूप से साफ़ करके आपको पूलिंग ध्वज सेट करने की चिंता करने की आवश्यकता नहीं है सभी कनेक्शन तारों में झूठी करने के लिए)।
  • "जादू घटक" सिस्टम संग्रहीत प्रक्रिया sp_detach_db (Transact-SQL) पर कॉल है।
  • मेरे कनेक्शन तार शामिल "AttachDBFilename" लेकिन शामिल नहीं किया था "उपयोगकर्ता उदाहरण = सच", तो यह समाधान अपने परिदृश्य
+0

कोड के लिए धन्यवाद - मेरे मामले में मुझे इसे एक WiX इंस्टॉलर (बल्कि तब एप्लिकेशन, परीक्षण स्थिरता इत्यादि) से आमंत्रित करने की आवश्यकता है - दुर्भाग्य से डीबी उपयोगकर्ता उपयोगकर्ता के उदाहरण के लिए मास्टर पर sp_detach_db को आमंत्रित करने के लिए पर्याप्त अनुमति नहीं हो सकती है। लेकिन यह मुझे कोशिश करने के लिए कुछ और विकल्प देता है। – Bittercoder

+0

निम्नलिखित एमएसडीएन दस्तावेज पृष्ठ http://msdn.microsoft.com/en-us/library/bb264564(SQL.90).aspx कहता है: "sp_detach_db को कॉल करके उदाहरण से डेटाबेस को अलग करना फ़ाइल को बंद कर देगा। यह है विधि विजुअल स्टूडियो यह सुनिश्चित करने के लिए उपयोग करता है कि आईडीईई उपयोगकर्ता उदाहरणों के बीच स्विच करते समय डेटाबेस फ़ाइल बंद हो जाती है। " - ऐसा लगता है कि विजुअल स्टूडियो स्वयं उपयोगकर्ता उदाहरणों को बंद करने के लिए sp_detach_db का उपयोग करता है :-)। मुझे लगता है कि @AMissico द्वारा सुझाए गए SSEUtil टूल का भी इसका उपयोग होता है (और यह Wix से अनावश्यक एक्सई फॉर्म में आता है) –

+0

मैंने SSEUtil द्वारा उपयोग किए गए वास्तविक आदेश को शामिल करने के लिए अपना उत्तर अपडेट किया। – AMissico

-3

यह नहीं हो सकता है कि आप क्या ढूंढ रहे हैं, लेकिन नि: शुल्क उपकरण Unlocker कि WIX से चलाया जा सकता है एक कमांड लाइन इंटरफेस है। (मैंने कुछ समय के लिए अनलॉकर का उपयोग किया है और फाइलों को अनलॉक करने के लिए यह सबसे अच्छा और बहुत अच्छा पाया है।)

अनलॉकर अनलॉक कर सकता है और किसी भी फ़ाइल को हटा/हटा सकता है।

इसका नकारात्मक पक्ष उन ऐप्स को है जिन्हें फ़ाइल पर लॉक की आवश्यकता नहीं होगी। (लेकिन कभी-कभी अभी भी ठीक काम करता है।) ध्यान दें कि यह उस प्रक्रिया को नहीं मारता है जिसमें ताला है। यह सिर्फ इसे लॉक हटा देता है। (हो सकता है कि पुन: प्रारंभ एसक्यूएल सेवाओं है कि आप रोक रहे हैं इसे फिर से ताला के लिए करने के लिए और/या काम सही ढंग से करने के लिए पर्याप्त होगा।)

आप यहाँ से Unlocker प्राप्त कर सकते हैं: http://www.emptyloop.com/unlocker/

कमांड लाइन को देखने के लिए विकल्प unlocker -H चलाने यहाँ वे सुविधा के लिए कर रहे हैं:

 
Unlocker 1.8.8 

Command line usage: 
    Unlocker.exe Object [Option] 
Object: 
    Complete path including drive to a file or folder 
Options: 
    /H or -H or /? or -?: Display command line usage 
    /S or -S: Unlock object without showing the GUI 
    /L or -L: Object is a text file containing the list of files to unlock 
    /LU or -LU: Similar to /L with a unicode list of files to unlock 
    /O or -O: Outputs Unlocker-Log.txt log file in Unlocker directory 
    /D or -D: Delete file 
    /R Object2 or -R Object2: Rename file, if /L or /LU is set object2 points to a text file containing the new name of files 
    /M Object2 or -M Object2: Move file, if /L or /LU is set object2 points a text file containing the new location of files

अपने लक्ष्य मान लिया जाये कि सी को बदलने के लिए था: \ मेरे एप्लिकेशन \ Data \ MyApp.mdf अपने संस्थापक से एक फ़ाइल के साथ, आप unlocker C:\My App\Data\MyApp.mdf -S -D की तरह कुछ चाहते हैं। यह फ़ाइल को हटा देगा ताकि आप एक नए में कॉपी कर सकें।

+0

हम्मम्म, जब आप बिना किसी टिप्पणी के नीचे वोट प्राप्त करते हैं तो उसे प्यार करना चाहिए। – Vaccano

+1

मुझे लगता है कि डाउन वोट था क्योंकि अगर एमडीएफ लॉक है, तो यह एक कारण के लिए है, और अनलॉकर का उपयोग डेटाबेस या कुछ खराब हो सकता है। – AMissico

1

मैं अभी तक टिप्पणी नहीं कर सकता क्योंकि मेरे पास अभी तक पर्याप्त प्रतिनिधि नहीं है। क्या कोई इस जानकारी को दूसरे उत्तर में ले जा सकता है, इसलिए हमारे पास डुप्ली नहीं है?

मैंने अपनी WIX अनइंस्टॉल समस्या हल करने के लिए अभी इस पोस्ट का उपयोग किया है। मैंने इस लाइन का उपयोग एमिसिको के जवाब से किया था।

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); 

WIX का उपयोग करते समय बहुत अच्छी तरह से काम किया, केवल मुझे इसे मेरे लिए काम करने के लिए एक चीज़ जोड़नी पड़ी।

मैंने sp_detach_db निकाल लिया था और फिर डीबी वापस ऑनलाइन लाया था। यदि आप नहीं करते हैं, तो WIX अनइंस्टॉल करने के बाद एमडीएफ फ़ाइलों को छोड़ देगा। एक बार जब मैं डीबी वापस ऑनलाइन लाया तो WIX ठीक से एमडीएफ फाइलों को हटा देगा।

यहां मेरी संशोधित रेखा है।

string.Format("USE master\nIF EXISTS (SELECT * FROM sysdatabases WHERE name = N'{0}')\nBEGIN\n\tALTER DATABASE [{0}] SET OFFLINE WITH ROLLBACK IMMEDIATE\n\tALTER DATABASE [{0}] SET ONLINE\nEND", dbName); 
संबंधित मुद्दे