बैकअप को पुनर्स्थापित करते समय, मैं सभी सक्रिय कनेक्शन कैसे काटूं?


166

सक्रिय कनेक्शन के कारण मेरा SQL सर्वर 2005 बैकअप को पुनर्स्थापित नहीं करता है। मैं इसे कैसे मजबूर कर सकता हूं?


क्या आप हमेशा उस डेटाबेस के सभी कनेक्शनों को मारना चाहते हैं जिसे आप "पुनर्स्थापित करना" चाहते हैं? या ऐसे समय होंगे जब आप मौजूदा कनेक्शन को नहीं मारना चाहते हैं? इसके अलावा, क्या आपको कनेक्शन पूलिंग के बारे में चिंता करना है?
फिलिप केली

जवाबों:


177

SQL सर्वर प्रबंधन स्टूडियो 2005

जब आप किसी डेटाबेस पर राइट क्लिक करते हैं और क्लिक करते हैं Tasksऔर फिर क्लिक करते हैं Detach Database, तो यह सक्रिय कनेक्शन के साथ एक संवाद लाता है।

स्क्रीन को अलग करें

"संदेश" के तहत हाइपरलिंक पर क्लिक करके आप सक्रिय कनेक्शन को मार सकते हैं।

फिर आप डेटाबेस को अलग किए बिना उन कनेक्शनों को मार सकते हैं।

अधिक जानकारी यहाँ

SQL सर्वर प्रबंधन स्टूडियो 2008

SQL Server प्रबंधन स्टूडियो 2008 के लिए इंटरफ़ेस बदल गया है, यहाँ कदम हैं (के माध्यम से: टिम Leung )

  1. ऑब्जेक्ट एक्सप्लोरर में सर्वर पर राइट-क्लिक करें और 'एक्टिविटी मॉनिटर' चुनें।
  2. जब यह खुलता है, तो प्रक्रिया समूह का विस्तार करें।
  3. अब डेटाबेस नाम से परिणामों को फ़िल्टर करने के लिए ड्रॉप-डाउन का उपयोग करें।
  4. राइट-क्लिक 'किल प्रोसेस' विकल्प का चयन करके सर्वर कनेक्शन को मारें।

21
यदि आपके पास @Ryan जैसा ही मुद्दा है, तो शायद यह इसलिए है क्योंकि आप प्रबंधन स्टूडियो 2005 के बजाय प्रबंधन स्टूडियो 2008 (या उससे ऊपर) का उपयोग कर रहे हैं। प्रबंधन स्टूडियो 2008 में भी यही काम करने के लिए, अपने सर्वर को राइट-क्लिक करें। एक्सप्लोरर और 'एक्टिविटी मॉनिटर' चुनें। जब यह खुलता है, तो प्रक्रिया समूह का विस्तार करें। अब डेटाबेस नाम से परिणामों को फ़िल्टर करने के लिए ड्रॉप-डाउन का उपयोग करें। अब आप राइट-क्लिक 'किल प्रोसेस' विकल्प का चयन करके अपने कनेक्शन को मार सकते हैं।
टिम लेउंग

195

आप अपने db को सिंगल यूजर मोड में सेट करना चाहते हैं, रिस्टोर करना चाहते हैं, फिर इसे वापस मल्टीयूज़र पर सेट करें:

ALTER DATABASE YourDB
SET SINGLE_USER WITH
ROLLBACK AFTER 60 --this will give your current connections 60 seconds to complete

--Do Actual Restore
RESTORE DATABASE YourDB
FROM DISK = 'D:\BackUp\YourBaackUpFile.bak'
WITH MOVE 'YourMDFLogicalName' TO 'D:\Data\YourMDFFile.mdf',
MOVE 'YourLDFLogicalName' TO 'D:\Data\YourLDFFile.ldf'

/*If there is no error in statement before database will be in multiuser
mode.  If error occurs please execute following command it will convert
database in multi user.*/
ALTER DATABASE YourDB SET MULTI_USER
GO

संदर्भ: मीनल दवे ( http://blog.SQLAuthority.com )

आधिकारिक संदर्भ: https://msdn.microsoft.com/en-us/library/ms345598.aspx


11
IMMEDIATE ROLLBACK जारी करने के बजाय, यह एक विशिष्ट DELAY के बाद केवल ROLLBACK के लिए प्रासंगिक हो सकता है, जिससे उपयोगकर्ता के प्रश्नों को स्वाभाविक रूप से पूरा करने के लिए एक opporunity दी जा सकती है।
जॉन सैन्सोम

2
अच्छी बात है, मौजूदा प्रश्नों को पूरा करने की अनुमति देने के लिए AFTER 60 कमांड को शामिल करने के लिए रोलबैक में अपडेट किया गया
ब्रेंडन

हाय @brendan, अगर रोलबैक में 60 से अधिक सेकंड लगते हैं तो क्या होगा? धन्यवाद
user3583912

11
यदि आप एक डेटाबेस को पुनर्स्थापित कर रहे हैं, तो खुला लेनदेन खो जाएगा चाहे आप ROLLBACK IMMEDIATEया ROLLBACK AFTER 60। उस डेटा को सहेजने का एकमात्र तरीका रोलबैक के बाद एक और बैकअप करना है। लेकिन आप एक अलग बैकअप से पुनर्स्थापित कर रहे हैं। तो, इंतजार किस बात का है? क्या मैं कुछ भूल रहा हूँ?
डेव मेसन

@ डमासन, मैं इस प्रश्न के बारे में भी उत्सुक हूं। क्या रोलबैक मोड के साथ सिंगल_युसर का उपयोग करना प्रतीक्षा समय के दौरान नए कनेक्शन को रोकता है? यदि ऐसा है, तो मुझे आश्चर्य है कि अगर यह कम से कम केवल पढ़ने-पढ़ने की क्रिया को पूरा करने के लिए एक क्लीनर / अच्छा तरीका है तो उन्हें अचानक समाप्त कर दें?
जेसन

43

इस कोड ने मेरे लिए काम किया, यह एक डेटाबेस के सभी मौजूदा कनेक्शन को मारता है। आपको बस इतना करना है कि लाइन सेट करें @dbname = 'databaseName'। इसलिए इसमें आपका डेटाबेस नाम है।

Use Master
Go

Declare @dbname sysname

Set @dbname = 'databaseName'

Declare @spid int
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname)
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = min(spid) from master.dbo.sysprocesses
        where dbid = db_id(@dbname) and spid > @spid
End

इसके बाद मैं इसे पुनर्स्थापित करने में सक्षम था


1
यह सबसे तेज़ तरीका था (SingleUserMode * 20 = 60s, Kill * 20 = 5s)।
कार्सन

यह मेरे लिए सही नहीं रहा। डेटाबेस अभी भी उपयोग में है। मैं SQL Server 2008 का उपयोग करता हूं।
बार

मैंने उस कोड को कई बार चलाया है, एक के बाद एक सही, EVENTUALLY चाल चलेगा। कभी-कभी आपके KILL और पुनर्स्थापना के बीच कुछ बोलता है। और कभी-कभी आपको एक के बाद एक पुनर्स्थापना को मारना होगा।
जॉन वक्लावस्की

पूरी तरह से फिर से जोड़ने की कोशिश कर आवेदन की आक्रामकता पर निर्भर करता है। आलसी उपयोगकर्ताओं की जोड़ी? बहुत अच्छा काम करता है। उच्च-मात्रा वाला ऐप सर्वर जो एक सेकंड के अंदर पुन: जुड़ता है? इतना नहीं।
ब्रैडेक

5

इसे इस्तेमाल करे:

DECLARE UserCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT
    spid
FROM
    master.dbo.sysprocesses
WHERE DB_NAME(dbid) = 'dbname'--replace the dbname with your database
DECLARE @spid SMALLINT
DECLARE @SQLCommand VARCHAR(300)
OPEN UserCursor
FETCH NEXT FROM UserCursor INTO
    @spid
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQLCommand = 'KILL ' + CAST(@spid AS VARCHAR)
    EXECUTE(@SQLCommand)
    FETCH NEXT FROM UserCursor INTO
        @spid
END
CLOSE UserCursor
DEALLOCATE UserCursor
GO

4

SQL सर्वर को पुनरारंभ करने से उपयोगकर्ता डिस्कनेक्ट हो जाएंगे। सबसे आसान तरीका जो मैंने पाया है - यदि आप सर्वर को ऑफलाइन लेना चाहते हैं तो भी अच्छा है।

लेकिन कुछ बहुत ही अजीब कारणों के लिए 'टेक ऑफलाइन' विकल्प यह मज़बूती से नहीं करता है और प्रबंधन कंसोल को लटका या भ्रमित कर सकता है। फिर ऑफलाइन काम करना शुरू करना

कभी-कभी यह एक विकल्प होता है - यदि उदाहरण के लिए आपने एक वेबसर्वर को रोका है जो कनेक्शन का स्रोत है।


+1। SQL एक्सप्रेस के लिए स्वीकृत उत्तर काम नहीं करेगा (उदाहरण के लिए वातावरण में) क्योंकि SQL एक्सप्रेस में गतिविधि मॉनीटर नहीं है
मैट फ्रियर

1
@MattFrear: यह सच नहीं है! कम से कम 2008 R2 एक्सप्रेस में मुझे सर्वर नोड पर एक टूलबार बटन और एक संदर्भ मेनू प्रविष्टि दिखाई देती है।
स्टीफन

4
संपूर्ण SQL सर्वर को पुनरारंभ करने से सभी डेटाबेस के कनेक्शन मारे जाएंगे। एक सर्वर कई डेटाबेस का समर्थन कर सकता है अभी तक केवल एक को बहाल करने की आवश्यकता है।
रोस प्रेसर

3
1 डेटाबेस से कनेक्शन को मारने का यह सबसे खराब तरीका है। खासकर यदि आपके पास कई अन्य डेटाबेस अभी भी अन्य उपयोगकर्ताओं द्वारा उपयोग किए जा रहे हैं। मैं इस विधि का उपयोग करके अत्यधिक सलाह देता हूं। यह 100% है, कुल ओवरकिल !!
बजे जॉन वक्लावस्की

@ जोहानक्लावस्की मैं सबसे खराब लेकिन निश्चित रूप से आलसी के बारे में नहीं जानता - इसलिए मैंने कभी-कभी कहा है। यह वास्तव में वैसे भी अन्य तरीकों से किसी भी समय नहीं बचाता है
सिमोन_विवर

3

मैं SQL सर्वर 2008 में एक पुनर्स्थापना प्रक्रिया को स्वचालित करते समय इस समस्या को पार कर गया था। मेरा (सफल) दृष्टिकोण प्रदान किए गए उत्तरों में से दो का मिश्रण था।

सबसे पहले, मैंने उक्त डेटाबेस के सभी कनेक्शनों को चलाया, और उन्हें मार दिया।

DECLARE @SPID int = (SELECT TOP 1 SPID FROM sys.sysprocess WHERE dbid = db_id('dbName'))
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = top 1 spid from master.dbo.sysprocesses
        where dbid = db_id('dbName')
End

फिर, मैंने डेटाबेस को single_user मोड पर सेट किया

ALTER DATABASE dbName SET SINGLE_USER

फिर, मैं पुनर्स्थापना चलाता हूं ...

RESTORE DATABASE and whatnot

फिर से कनेक्शन मार डालो

(same query as above)

और वापस डेटाबेस को mult_user पर सेट करें।

ALTER DATABASE dbName SET MULTI_USER

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


2

इनमें से कोई भी मेरे लिए काम नहीं कर रहा था, वर्तमान उपयोगकर्ताओं को हटा या हटा नहीं सकता था। इसके अलावा DB के लिए कोई सक्रिय कनेक्शन नहीं देख सकता है। SQL सर्वर को पुनरारंभ करना (राइट क्लिक करें और रीस्टार्ट का चयन करें) ने मुझे इसे करने की अनुमति दी।


2

पहले से दी गई सलाह को जोड़ने के लिए, यदि आपके पास IIS के माध्यम से चलने वाला वेब ऐप है जो DB का उपयोग करता है , तो आपको पुनर्स्थापित करते समय ऐप के लिए ऐप पूल को रोकने (पुनरावृत्ति नहीं करने) की आवश्यकता हो सकती है , फिर से शुरू करें। ऐप पूल को रोकना सक्रिय http कनेक्शन को बंद कर देता है और किसी भी और की अनुमति नहीं देता है, जो अन्यथा प्रक्रियाओं को ट्रिगर करने की अनुमति देने का अंत कर सकता है जो डेटाबेस से कनेक्ट होते हैं और इस तरह लॉक होते हैं। यह अपने डेटाबेस को पुनर्स्थापित करते समय Umbraco सामग्री प्रबंधन प्रणाली के साथ उदाहरण के लिए एक ज्ञात मुद्दा है


1

उपरोक्त में से किसी ने भी मेरे लिए काम नहीं किया। मेरे डेटाबेस ने गतिविधि मॉनिटर या sp_who का उपयोग करके कोई सक्रिय कनेक्शन नहीं दिखाया। मुझे अंततः:

  • डेटाबेस नोड पर राइट क्लिक करें
  • "डिटैच ..." चुनें
  • "ड्रॉप कनेक्शंस" बॉक्स को चेक करें
  • पुनः अनुलग्न

सबसे सुरुचिपूर्ण समाधान नहीं है, लेकिन यह काम करता है और इसे SQL सर्वर को पुनरारंभ करने की आवश्यकता नहीं है (मेरे लिए कोई विकल्प नहीं है, क्योंकि DB सर्वर ने अन्य डेटाबेस का एक गुच्छा होस्ट किया है)


यह कुल ओवरकिल है। ऊपर KILL कोड का उपयोग करें। मेरे लिए सैकड़ों बहाल नौकरियों पर काम करता है।
जॉन वक्लावस्की

मैं जिस डेटाबेस के साथ काम कर रहा था वह सब कुछ नहीं होगा - हालाँकि, यह उनके सेटअप के साथ एक समस्या हो सकती है। मैं मानता हूं कि आम तौर पर यह बहुत आसान है।
ब्रेंट वैगनर

0

मैं इस तरह से करना पसंद करता हूं,

परिवर्तन डेटाबेस तुरंत रोलबैक के साथ ऑफ़लाइन सेट

और फिर अपने डेटाबेस को पुनर्स्थापित करें। उसके बाद,

परिवर्तन डेटाबेस तुरंत रोलबैक के साथ ऑनलाइन सेट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.