SQL सर्वर 2005 डेटाबेस के लिए सभी वर्तमान कनेक्शनों को कैसे मारते हैं?


288

मैं एक डेटाबेस का नाम बदलना चाहता हूं, लेकिन डेटाबेस पर 'विशेष लॉक प्राप्त नहीं कर सकने' वाली त्रुटि प्राप्त करता रहता है, जिसका अर्थ है कि कुछ कनेक्शन अभी भी सक्रिय है।

मैं डेटाबेस के सभी कनेक्शनों को कैसे मार सकता हूं ताकि मैं इसका नाम बदल सकूं?

जवाबों:


378

कारण यह है कि आदम ने जिस दृष्टिकोण का सुझाव दिया है वह काम नहीं करेगा वह यह है कि उस समय के दौरान जब आप सक्रिय कनेक्शन पर लूप कर रहे हैं नया स्थापित किया जा सकता है, और आप उन लोगों को याद करेंगे। आप इसके बजाय निम्नलिखित दृष्टिकोण का उपयोग कर सकते हैं जिसमें यह कमी नहीं है:

-- set your current connection to use master otherwise you might get an error

use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

--do you stuff here 

ALTER DATABASE YourDatabase SET MULTI_USER

1
यह SQL Server 2008 के लिए काम नहीं करता है ... यहाँ मुझे मिली त्रुटि है: कंसोल: Msg 102, स्तर 15, राज्य 1, लाइन 4 '-' के पास गलत सिंटैक्स। संदेश 319, स्तर 15, राज्य 1, पंक्ति 4 'के साथ' कीवर्ड के पास गलत सिंटैक्स। यदि यह कथन एक सामान्य तालिका अभिव्यक्ति है, तो एक xmlnamespaces क्लाज या एक परिवर्तन ट्रैकिंग संदर्भ क्लॉज, पिछले कथन को अर्धविराम के साथ समाप्त किया जाना चाहिए। Msg 102, स्तर 15, राज्य 1, लाइन 4 'IMMEDIATE' के पास गलत सिंटैक्स। कमांड: एलट्रेड असमीटेड के साथ ASMR-wdanda SET SINGLE_USER के बारे में चेतावनी दें
Wagner da Silva

मैंने अभी 2008 में समस्याओं के बिना इसे चलाया था। ROLLBACK IMMEDIATE के साथ DATABASE Aspnetdb SET SINGLE_USER को बिना GETDATE () से पहले ही बताएं कि आपके पास कमेंट आउट कोड के बजाय क्या है?
SQLMenace

SQL Server 2008 और SQL एक्सप्रेस उदाहरण के साथ मेरे लिए काम किया।
टिम मर्फी

19
@Wagner अगर डेटाबेस में एक '-' नाम है, तो आपको इसके चारों ओर कोष्ठक का उपयोग करने की आवश्यकता है: ALTER DATABASE [foo-bar] SET SINGLE_USER विथ रोलबैक IMMEDIATE
बेन चैलेंजर

14
कृपया ध्यान दें - अमेज़ॅन आरडीएस पर होस्ट किए गए SQL सर्वर पर यह कोशिश न करें। आप DB को वापस MULTI_USER मोड में रीसेट करने में असमर्थ होंगे। यह प्रयास करने से पहले सुनिश्चित करें कि आपके पास डीबीए क्रेडेंशियल्स का एक और सेट है। मैंने इसे पिछले स्नैपशॉट में से एक में बदलकर तय किया था। कुछ डेटा खो दिया। सौभाग्य से डेटा महत्वपूर्ण नहीं था।
RuntimeException

110

इसे पूरा करने के लिए स्क्रिप्ट, सभी कनेक्शनों को मारने के लिए डेटाबेस के साथ 'DB_NAME' को बदलें:

USE master
GO

SET NOCOUNT ON
DECLARE @DBName varchar(50)
DECLARE @spidstr varchar(8000)
DECLARE @ConnKilled smallint
SET @ConnKilled=0
SET @spidstr = ''

Set @DBName = 'DB_NAME'
IF db_id(@DBName) < 4
BEGIN
PRINT 'Connections to system databases cannot be killed'
RETURN
END
SELECT @spidstr=coalesce(@spidstr,',' )+'kill '+convert(varchar, spid)+ '; '
FROM master..sysprocesses WHERE dbid=db_id(@DBName)

IF LEN(@spidstr) > 0
BEGIN
EXEC(@spidstr)
SELECT @ConnKilled = COUNT(1)
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
END

1
यह मेरे लिए काम करता है, मैंने बयान में जोड़ा and spid <> @@SPIDहै SELECT @sKillConnectionताकि यह मेरे वर्तमान कनेक्शन को मारने की कोशिश न करे, जो एक त्रुटि संदेश उत्पन्न करेगा।
लुइस पेरेस

केवल उपयोगकर्ता प्रक्रियाओं को मारा जा सकता है ... अभी भी गतिरोध है और गतिरोध के कारण मल्टी_युसर मोड को पुनर्स्थापित नहीं कर सकता है।
रेनबा

mateuscb- mssql 10.00 पर काम करने का एकमात्र तरीका यह है कि यदि आपके पास एक डेटाबेस का नाम है जिसकी आवश्यकता है [] और आप उनका उपयोग नहीं करते हैं। दैनिक विवरण [YourDatabase] ROLLBACK IMMEDIATE के साथ SINGLE_USER 10, 10.5, 11 और 12. में काम करता है
जेरेमी

Lifesaver। शीर्ष उत्तर होना चाहिए।
gl123123

55

इसे मार डालो, और इसे आग से मार डालो:

USE master
go

DECLARE @dbname sysname
SET @dbname = 'yourdbname'

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

27

SQL प्रबंधन स्टूडियो एक्सप्रेस का उपयोग करना:

ऑब्जेक्ट एक्सप्लोरर ट्री में प्रबंधन के तहत "एक्टिविटी मॉनिटर" के नीचे ड्रिल करें (यदि आप इसे वहां नहीं पा सकते हैं तो डेटाबेस सर्वर पर राइट क्लिक करें और "एक्टिविटी मॉनिटर" का चयन करें)। गतिविधि मॉनिटर खोलना, आप सभी प्रक्रिया की जानकारी देख सकते हैं। आपको उस डेटाबेस के लिए ताले ढूंढने में सक्षम होना चाहिए जिसे आप रुचि रखते हैं और उन तालों को मार सकते हैं, जो कनेक्शन को भी मार देंगे।

आपको उसके बाद नाम बदलने में सक्षम होना चाहिए।


मुझे यह "गतिविधि मॉनिटर" आइटम प्रबंधन के तहत नहीं दिखता ... फिर से, शायद यह इसलिए है क्योंकि मैं एसक्यूएल 2008 का उपयोग कर रहा हूं?
वाग्नेर दा सिल्वा

14
मुझे एक "एक्टिविटी मॉन्टियर" मिला है, अगर आप सही से सर्वर पर क्लिक करते हैं, तो डीबी पर नहीं। फिर आप डेटाबेस द्वारा 'प्रोसेस' टैब और फ़िल्टर का चयन कर सकते हैं।
अलिरोबे 12:00

आपको स्पष्ट रूप से एक-एक करके रुकी हुई प्रक्रिया को मारना होगा, लेकिन यह एक सीधी विधि है जिसे स्थानीय लॉगिन या पूर्ण डेटाबेस सर्वर को नीचे लाने की आवश्यकता नहीं है।
अलवारो गोंजालेज

24

मैंने हमेशा उपयोग किया है:


ALTER DATABASE DB_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
SP_RENAMEDB 'DB_NAME','DB_NAME_NEW'
Go 
ALTER DATABASE DB_NAME_NEW  SET MULTI_USER -- set back to multi user 
GO 


14

ऑफ़लाइन होने में कुछ समय लगता है और कभी-कभी मुझे इसके साथ कुछ समस्याओं का अनुभव होता है।

मेरी राय में सबसे ठोस तरीका:

डिटैच राइट डीबी क्लिक करें -> कार्य -> ​​डिटैच ... चेक "ड्रॉप कनेक्शंस" ठीक है

Reattach राइट क्लिक डेटाबेस -> संलग्न करें ... जोड़ें ... -> अपने डेटाबेस का चयन करें, और अटैच के रूप में कॉलम को अपने डेटाबेस डेटाबेस नाम में बदलें। ठीक


पसंद है। जीयूआई से यह सुनिश्चित करने का सबसे तेज़ तरीका।
वल्हकहोलिज्म

यह एक सम्मोहन की तरह काम करता है! आसान तरीका अच्छा तरीका है। धन्यवाद।
टग स्ट्रांग

6
Select 'Kill '+ CAST(p.spid AS VARCHAR)KillCommand into #temp
from master.dbo.sysprocesses p (nolock)
join master..sysdatabases d (nolock) on p.dbid = d.dbid
Where d.[name] = 'your db name'

Declare @query nvarchar(max)
--Select * from #temp
Select @query =STUFF((                              
            select '  ' + KillCommand from #temp
            FOR XML PATH('')),1,1,'') 
Execute sp_executesql @query 
Drop table #temp

'मास्टर' डेटाबेस का उपयोग करें और इस क्वेरी को चलाएं, यह आपके डेटाबेस से सभी सक्रिय कनेक्शनों को मार देगा।


1
यह वास्तव में काम करता है :) मैं हालांकि, इस स्क्रिप्ट के निष्पादित भाग को बाहर रखने और इसके बजाय एक प्रिंट @query डाल करने के लिए सलाह दूंगा, बस यह सुनिश्चित करने के लिए कि आप इसे गलती से उत्पादन सर्वर पर नहीं चलाते हैं।
मार्सेलो मिओरेल्ली

5

मैं आमतौर पर उस त्रुटि में भाग लेता हूं जब मैं एक डेटाबेस को पुनर्स्थापित करने की कोशिश कर रहा हूं, जो मैं आमतौर पर प्रबंधन स्टूडियो में पेड़ के शीर्ष पर जाता हूं और डेटाबेस सर्वर पर राइट क्लिक करता हूं और फिर से शुरू करता हूं (क्योंकि यह एक विकास मशीन पर है, यह उत्पादन में आदर्श नहीं हो सकता है )। यह सभी डेटाबेस कनेक्शन के करीब है।


धन्यवाद, यह काम किया ( ALTER DATABASE ... SET SINGLE_USERअन्य उत्तरों में आदेशों ने वही लौटाया 'जो अनन्य लॉक नहीं प्राप्त कर सका' त्रुटि)।
टीनिस्टर

4

ऑब्जेक्ट एक्सप्लोरर पर MS SQL सर्वर प्रबंधन स्टूडियो में, डेटाबेस पर राइट क्लिक करें। उस संदर्भ मेनू में, जो 'कार्य -> ​​ऑफ़लाइन चुनें' का चयन करता है।


4
यदि कोई सक्रिय कनेक्शन है तो आप ऐसा नहीं कर सकते।
अलिरोबे

4

एक और "आग से इसे मार डालो" दृष्टिकोण केवल MSSQLSERVER सेवा को पुनरारंभ करना है। मुझे कमांडलाइन से सामान करना पसंद है। इसे बिल्कुल सीएमडी में चिपकाने से यह हो जाएगा: NET STOP MSSQLSERVER और NET START MSSQLSERVER

या "services.msc" खोलें और "SQL सर्वर (MSSQLSERVER)" ढूंढें और राइट-क्लिक करें, "पुनरारंभ करें" चुनें।

यह "निश्चित रूप से, निश्चित रूप से" उस उदाहरण पर चलने वाले सभी डेटाबेस के लिए सभी कनेक्शनों को मार देगा।

(मुझे सर्वर / डेटाबेस पर कॉन्फ़िगरेशन को बदलने और बदलने वाले कई दृष्टिकोणों से बेहतर यह पसंद है)


आपका क्या मतलब है 'अनुशंसित नहीं'? यदि आप उस सर्वर के किसी भी कनेक्शन के बारे में चिंतित नहीं हैं (जैसे: डिबग या स्टेजिंग वातावरण, उदाहरण के लिए - या अस्थायी सर्वर के साथ उत्पादन सर्वर। यह सबसे आसान तरीका हो सकता है)। उत्पादन के लिए - आप कॉन्फ़िगरेशन के साथ मूक होना नहीं चाहते हैं यदि आप सेवा को फिर से शुरू कर सकते हैं। तुम क्या करोगे?
एकेरू

1
मैं ऐसी किसी भी चीज के लिए जाऊंगा जो केवल मेरे लक्ष्य डीबी को प्रभावित करे। लक्ष्य सर्वर पर सभी DBs को मारने का आपका तरीका उतना स्मार्ट नहीं है। लेकिन ईमानदार होने के लिए, मंचन के वातावरण में, यह शायद सबसे आसान तरीका है जैसा आपने कहा था।
मोहम्मद स्विलम

4

यहाँ पर MS SQL Server Management Studio 2008 में इस तरह की मज़बूती से काम करने का तरीका बताया गया है (यह अन्य संस्करणों के लिए भी काम कर सकता है):

  1. ऑब्जेक्ट एक्सप्लोरर ट्री में, रूट डेटाबेस सर्वर (ग्रीन एरो के साथ) पर राइट क्लिक करें, फिर एक्टिविटी मॉनिटर पर क्लिक करें।
  2. गतिविधि मॉनिटर में प्रक्रिया टैब खोलें, 'डेटाबेस' ड्रॉप डाउन मेनू का चयन करें, और इच्छित डेटाबेस से फ़िल्टर करें।
  3. ऑब्जेक्ट एक्सप्लोरर में DB पर राइट क्लिक करें और 'कार्य -> ​​ऑफ़लाइन ले जाएं' कार्य शुरू करें। जब आप पृष्ठभूमि में इस दौड़ को छोड़ दें ...
  4. आप जो भी कर सकते हैं, उसे सुरक्षित रूप से बंद कर दें।
  5. प्रक्रिया टैब से सभी शेष प्रक्रियाओं को मार डालें।
  6. DB वापस ऑनलाइन लाओ।
  7. डीबी का नाम बदलें।
  8. अपनी सेवा को ऑनलाइन वापस लाएं और इसे नए डीबी की ओर इंगित करें।

3

इस परिदृश्य में मेरे लिए काम करने का विकल्प इस प्रकार है:

  1. प्रश्न में डेटाबेस पर "डिटैच" ऑपरेशन शुरू करें। यह wil एक विंडो को खोलता है (SQL 2005 में) सक्रिय कनेक्शन प्रदर्शित करता है जो DB पर कार्रवाई को रोकता है।
  2. सक्रिय कनेक्शनों को मारें, डिटैच-ऑपरेशन रद्द करें।
  3. डेटाबेस अब पुनर्स्थापित करने के लिए उपलब्ध होना चाहिए।

SQL 2008 प्रबंधन स्टूडियो में, आप किसी कारण से "डिटैच" स्क्रीन से सक्रिय कनेक्शन तक नहीं पहुंच सकते हैं। यह 2005 में बहुत अच्छा काम करता है और यही मैंने हमेशा किया है, जब तक कि हम 2008 में उन्नत नहीं हो गए और अब आप सभी को एक बेवकूफ संदेश है जो आपको अपना कनेक्शन बंद करने के लिए कहता है, लेकिन आपको प्रत्येक कनेक्शन को मारने के लिए कनेक्शन विवरण नहीं खोलने देता है ।
जिम


2

डेटाबेस के नाम पर राइट क्लिक करें, प्रॉपर्टी विंडो पाने के लिए प्रॉपर्टी पर क्लिक करें, ऑप्शन टैब खोलें और मल्टी यूजर से सिंगल यूजर के लिए "रिस्ट्रिक्ट एक्सेस" प्रॉपर्टी को बदलें। जब आप ओके बटन पर हिट करते हैं, तो यह आपको सभी खुले कनेक्शन को बंद करने का संकेत देगा, "हां" चुनें और आप डेटाबेस का नाम बदलने के लिए तैयार हैं ...।


2

ये मेरे लिए काम नहीं करते थे (SQL2008 एंटरप्राइज), मैं डीबी से जुड़ी कोई भी प्रक्रिया या उपयोगकर्ता नहीं देख सकता था। सर्वर को पुनरारंभ करना (प्रबंधन स्टूडियो में Sql सर्वर पर राइट क्लिक करें और पुनः आरंभ करें) ने मुझे DB को पुनर्स्थापित करने की अनुमति दी।


2

मैं SQL Server 2008 R2 का उपयोग कर रहा हूं, मेरा DB पहले से ही एकल उपयोगकर्ता के लिए सेट था और एक कनेक्शन था जो डेटाबेस पर किसी भी कार्रवाई को प्रतिबंधित करता था। इस प्रकार अनुशंसित SQLMenace के समाधान ने त्रुटि के साथ प्रतिक्रिया दी। यहाँ एक है कि मेरे मामले में काम किया है


0

मैं डेटाबेस में सभी प्रक्रिया की सूची प्राप्त करने के लिए sp_who का उपयोग करता हूं। यह बेहतर है क्योंकि आप समीक्षा करना चाहते हैं कि किस प्रक्रिया को मारना है।

declare @proc table(
    SPID bigint,
    Status nvarchar(255),
    Login nvarchar(255),
    HostName nvarchar(255),
    BlkBy nvarchar(255),
    DBName nvarchar(255),
    Command nvarchar(MAX),
    CPUTime bigint,
    DiskIO bigint,
    LastBatch nvarchar(255),
    ProgramName nvarchar(255),
    SPID2 bigint,
    REQUESTID bigint
)

insert into @proc
exec sp_who2

select  *, KillCommand = concat('kill ', SPID, ';')
from    @proc

परिणाम
आप जिस प्रक्रिया को करना चाहते हैं उसे मारने के लिए आप किलकोमैंड कॉलम में कमांड का उपयोग कर सकते हैं।

SPID    KillCommand
26      kill 26;
27      kill 27;
28      kill 28;

-1

आप SP_Who कमांड का उपयोग कर सकते हैं और अपने डेटाबेस का उपयोग करने वाली सभी प्रक्रिया को मार सकते हैं और फिर अपने डेटाबेस का नाम बदल सकते हैं।

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