আপনি কীভাবে একটি এসকিউএল সার্ভার 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
এটি এসকিউএল সার্ভার ২০০৮-এর জন্য কাজ করছে বলে মনে হচ্ছে না ... আমি যে ত্রুটিটি পেয়েছি তা এখানে: কনসোল: এমএসজি ১০২, স্তর 15, রাজ্য 1, লাইন 4 '-' এর নিকটে ভুল সিনট্যাক্স। Msg 319, স্তর 15, রাজ্য 1, লাইন 4 'উইথ' কীওয়ার্ডের নিকটে ভুল সিনট্যাক্স। যদি এই বিবৃতিটি একটি সাধারণ টেবিল এক্সপ্রেশন হয়, একটি এক্সএমএল নাম স্পেসস ক্লজ বা ট্র্যাকিং ট্র্যাকিং প্রসঙ্গ ধারা, পূর্ববর্তী বিবৃতিটি অবশ্যই একটি সেমিকোলন দিয়ে শেষ করা উচিত। এমএসজি 102, স্তর 15, রাজ্য 1, লাইন 4 'তাত্পর্যপূর্ণ' এর নিকটে ভুল সিনট্যাক্স। কমান্ড: অল্টার দতাবেস এএসএমআর-ওয়ান্ডা রোলব্যাকের সাথে সিঙ্গেল_ইউসার সেট করুন তাড়াতাড়ি
ওয়াগনার দা সিলভা

আমি কেবল ২০০৪ এ সমস্যা ছাড়াই এটি চালিয়েছি ডেটাব্যাস এপনেটডেবি রোলব্যাকের সাথে সিঙ্গেল_ইসার সেট করুন তাত্ক্ষণিকভাবে GETDATE () ALTER DATABASE aspnetdb সেট করুন মাল্টি_উসার মন্তব্য করা কোডের পরিবর্তে আপনার কী আছে?
এসকিউএল মেনেস

এসকিউএল সার্ভার ২০০৮ এবং এসকিউএল এক্সপ্রেস উদাহরণ দিয়ে আমার জন্য কাজ করেছেন।
টিম মারফি

19
@ ওয়াগনার যদি আপনার চারপাশে বন্ধনী ব্যবহার করার প্রয়োজন হয় এমন নামে ডেটাবেসটিতে '-' থাকে: ডেটাব্যাসের পরিবর্তে [ফু-বার] রোলব্যাকের সাথে সিঙ্গেল_ইসার সেট করুন
বেন চ্যালেঞ্জার

14
দয়া করে নোট করুন - এটি অ্যামাজন আরডিএসে হোস্ট করা এসকিউএল সার্ভারে চেষ্টা করবেন না। আপনি DB কে MULTI_USER মোডে পুনরায় সেট করতে পারবেন না। এটি চেষ্টা করার আগে আপনার কাছে ডিবিএ শংসাপত্রগুলির আরও একটি সেট রয়েছে তা নিশ্চিত করুন। আমি পূর্ববর্তী একটি স্ন্যাপশটগুলিতে ফিরে এসে এটি ঠিক করেছি। কিছু তথ্য হারিয়েছেন। ভাগ্যক্রমে ডেটা সমালোচনা ছিল না।
রানটাইম এক্সসেপশন

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- একমাত্র উপায় এটি এমএসকিউএল ১০.০০ এ কাজ করবে না যদি আপনার কোনও ডাটাবেসের নাম থাকে যা [] প্রয়োজন হয় এবং আপনি সেগুলি ব্যবহার না করেন। অল্টার ডেটাবেস [আপনার ডেটাবেস] রোলব্যাকের সাথে সিঙ্গেল_ইউসার সেট করুন 10, 10.5, 11 এবং 12-তে কাজ করে
জেরেমি

Lifesaver হয়। শীর্ষ উত্তর হওয়া উচিত।
gls123

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

এসকিউএল ম্যানেজমেন্ট স্টুডিও এক্সপ্রেস ব্যবহার:

অবজেক্ট এক্সপ্লোরার ট্রি ট্রিলে ম্যানেজমেন্টের অধীনে "ক্রিয়াকলাপ পর্যবেক্ষক" তে ড্রেল করুন (যদি আপনি এটি সেখানে না খুঁজে পান তবে ডাটাবেস সার্ভারে ডান ক্লিক করুন এবং "ক্রিয়াকলাপ মনিটর" নির্বাচন করুন)। ক্রিয়াকলাপ মনিটর খোলার মাধ্যমে আপনি সমস্ত প্রক্রিয়া সম্পর্কিত তথ্য দেখতে পারেন। আপনার পছন্দসই ডাটাবেসের জন্য লকগুলি সন্ধান করতে এবং সেই লকগুলি মেরে ফেলতে সক্ষম হওয়া উচিত, এটি সংযোগটিও হারাতে পারে।

এর পরে আপনার নাম পরিবর্তন করতে সক্ষম হওয়া উচিত।


আমি ম্যানেজমেন্টের অধীনে এই "ক্রিয়াকলাপ মনিটর" আইটেমটি দেখছি না ... আবার, সম্ভবত এটি কারণ আমি এসকিউএল 2008 ব্যবহার করছি?
ওয়াগনার দা সিলভা

14
আপনি যদি ডিবি না করে সার্ভারে ডান ক্লিক করেন তবে আমি একটি "ক্রিয়াকলাপ মনটিয়র" পেয়েছি। এরপরে আপনি 'প্রক্রিয়াগুলি' ট্যাবটি নির্বাচন করতে পারেন এবং ডেটাবেস দ্বারা ফিল্টার করতে পারেন।
অ্যালিরোব

স্পষ্টতই আপনাকে একের পর এক স্থগিত প্রক্রিয়াটি মেরে ফেলতে হবে তবে এটি একটি সোজা পদ্ধতি যা স্থানীয় লগইন বা সম্পূর্ণ ডাটাবেস সার্ভারকে নামিয়ে আনার প্রয়োজন হয় না।
vলভারো গঞ্জালেজ

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

অফলাইনে থাকুন এতে কিছুটা সময় লাগে এবং কখনও কখনও আমি এতে কিছু সমস্যাও ভোগ করি ..

আমার মতে সবচেয়ে শক্ত উপায়:

বিচ্ছিন্নভাবে ডিবি -> টাস্কগুলি -> বিচ্ছিন্নভাবে ক্লিক করুন ... "ড্রপ সংযোগগুলি" পরীক্ষা করুন ঠিক আছে

পুনরায় সংযুক্ত করুন ডেটাবেসগুলিতে রাইট ক্লিক করুন -> সংযুক্ত করুন .. যোগ করুন ... -> আপনার ডাটাবেস নির্বাচন করুন এবং আপনার পছন্দসই ডাটাবেসের নামের সাথে সংযুক্তি হিসাবে কলাম পরিবর্তন করুন। ঠিক আছে


পছন্দ করি. GUI থেকে এটি করার দ্রুততম উপায় sure
ওয়েলকাহোলিজম

এটি যাদুমন্ত্রের মত কাজ করে! সহজ উপায় ভাল উপায়। ধন্যবাদ।
দৃ:

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
এটি সত্যই কার্যকর হয় :) আমি যদিও এই স্ক্রিপ্টটির কার্যকর অংশটি মন্তব্য করার জন্য পরামর্শ দেব এবং তার পরিবর্তে একটি মুদ্রণ @ প্রশ্ন রেখেছি, কেবলমাত্র আপনি ভুল দ্বারা কোনও প্রোডাকশন সার্ভারে এটি চালাচ্ছেন না তা নিশ্চিত হওয়ার জন্য।
মার্সেলো মিওরেলি

5

আমি সাধারণত একটি ত্রুটি ঘটায় যখন আমি একটি ডেটাবেস পুনরুদ্ধার করার চেষ্টা করি আমি সাধারণত ম্যানেজমেন্ট স্টুডিওতে গাছের শীর্ষে যাই এবং ডান ক্লিক করে ডাটাবেস সার্ভারটি পুনরায় চালু করি (কারণ এটি কোনও ডেভলপমেন্ট মেশিনে রয়েছে, এটি সম্ভবত উত্পাদনে আদর্শ নাও হতে পারে) )। এটি সমস্ত ডাটাবেস সংযোগ বন্ধ।


ধন্যবাদ, এটি কাজ করেছে ( ALTER DATABASE ... SET SINGLE_USERঅন্যান্য উত্তরের আদেশগুলি একই 'একচেটিয়া লক পেতে পারে না' ত্রুটি পেয়েছিল)।
টিনিস্টার

4

অবজেক্ট এক্সপ্লোরারের এমএস এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে, ডাটাবেসে ডান ক্লিক করুন। প্রসঙ্গ মেনুতে অনুসরণ করা 'কার্য -> অফলাইন নিন' নির্বাচন করুন


4
সক্রিয় সংযোগ থাকলে আপনি এটি করতে পারবেন না।
অ্যালিরোব

4

আরেকটি "আগুন দিয়ে এটি হত্যা করুন" পদ্ধতির নাম কেবলমাত্র এমএসএসকিউএসএলভার পরিষেবাটি আরম্ভ করা। আমি কমান্ডলাইন থেকে জিনিস করতে পছন্দ করি। এটি সিএমডিতে হুবহু করা হলে তা করবে: নেট স্টপ এমএসএসকিউএসএলভার এবং নেট এমএসএসকিউএসএল সার্ভার শুরু করুন

অথবা "পরিষেবাদি.এমএসসি" খুলুন এবং "এসকিউএল সার্ভার (এমএসএসকিউএলএসভার)" এবং ডান ক্লিক ক্লিক করে "পুনরায় চালু করুন" নির্বাচন করুন।

এটি "অবশ্যই, নিশ্চিতভাবে" সেই পরিস্থিতিতে চলমান সমস্ত ডাটাবেসের সমস্ত সংযোগকে হত্যা করবে।

(সার্ভার / ডাটাবেসে কনফিগারেশন পরিবর্তন ও পরিবর্তিত করে এমন অনেকগুলি পদ্ধতির চেয়ে আমি এটির চেয়ে ভাল)


'প্রস্তাবিত নয়' বলতে কী বোঝ? আপনি যদি সেই সার্ভারের কোনও সংযোগ সম্পর্কে উদ্বিগ্ন না হন (যেমন: ডিবাগ বা মঞ্চ পরিবেশ), উদাহরণস্বরূপ - বা টেম্পোরেশন সহ একটি উত্পাদন সার্ভার down ডাউনটাইম) এটি সবচেয়ে সহজ উপায় হতে পারে। উত্পাদনের জন্য - আপনি যদি কেবল পরিষেবাটি পুনরায় চালু করতে পারেন তবে আপনি কনফিগারেশনের সাথে মাক করতে চান না। আপনি কি করতে চান?
আইকেরু

1
আমি এমন কোনও কিছুর জন্য যাব যা কেবলমাত্র আমার টার্গেট ডিবিকে প্রভাবিত করে। টার্গেট সার্ভারে সমস্ত ডিবি হত্যার আপনার দৃষ্টিভঙ্গি তেমন স্মার্ট নয়। তবে সত্যি কথা বলতে, পরিবেশকে মঞ্চে বলার জন্য এটি সম্ভবত সবচেয়ে সহজ উপায়।
মোহাম্মদ সোইল্লাম

4

এমএস এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও ২০০৮-এ এই ধরণের জিনিসটি কীভাবে নির্ভরযোগ্যভাবে করা যায় তা এখানে (অন্যান্য সংস্করণের জন্যও কাজ করতে পারে):

  1. অবজেক্ট এক্সপ্লোরার ট্রি এ, রুট ডাটাবেস সার্ভারে ডান ক্লিক করুন (সবুজ তীর সহ), তারপরে ক্রিয়াকলাপ মনিটরে ক্লিক করুন।
  2. ক্রিয়াকলাপ মনিটরে প্রসেস ট্যাবটি খুলুন, 'ডাটাবেসগুলি' ড্রপ ডাউন মেনু নির্বাচন করুন এবং আপনার পছন্দসই ডাটাবেসটি ফিল্টার করুন।
  3. অবজেক্ট এক্সপ্লোরারের ডিবিতে ডান ক্লিক করুন এবং একটি 'টাস্ক -> অফলাইন নিন' টাস্কটি শুরু করুন। আপনার চলাকালীন পটভূমিতে এটি চলমান ছেড়ে দিন ...
  4. আপনি যা পারেন নিরাপদে শাট ডাউন করুন।
  5. প্রক্রিয়া ট্যাব থেকে অবশিষ্ট সমস্ত প্রক্রিয়া হত্যা করুন।
  6. অনলাইনে ডিবি ফিরিয়ে আনুন।
  7. ডিবি নাম পরিবর্তন করুন।
  8. অনলাইনে আপনার পরিষেবাটি ফিরিয়ে আনুন এবং নতুন ডিবিতে এটি নির্দেশ করুন।

3

এই দৃশ্যে আমার জন্য কাজ করা বিকল্পটি নিম্নরূপ:

  1. প্রশ্নে থাকা ডাটাবেসে "ডিটাচ" অপারেশন শুরু করুন। এই উইলটি একটি উইন্ডো খুলবে (এসকিউএল 2005 এ) সক্রিয় সংযোগগুলি প্রদর্শন করবে যা ডিবিতে ক্রিয়া প্রতিরোধ করে।
  2. সক্রিয় সংযোগগুলি মেরে ফেলুন, বিচ্ছিন্নকরণ-পরিচালনা বাতিল করুন।
  3. ডাটাবেস এখন পুনরুদ্ধারের জন্য উপলব্ধ করা উচিত।

এসকিউএল ২০০৮ ম্যানেজমেন্ট স্টুডিওতে, কোনও কারণে আপনি "ডিটাচ" স্ক্রিন থেকে সক্রিয় সংযোগটি আর অ্যাক্সেস করতে পারবেন না। এটি ২০০ 2005 সালে দুর্দান্ত কাজ করে এবং ২০০৮ এ আপগ্রেড না হওয়া পর্যন্ত আমি সর্বদা এটি করেছিলাম এবং এখন আপনি যা পেয়েছেন তা হ'ল একটি মূর্খ বার্তা যা আপনাকে সংযোগ বন্ধ করতে বলে, তবে প্রতিটি সংযোগকে মেরে ফেলার জন্য আপনাকে সংযোগের বিশদটি খুলতে দেয় না ।
জিম


2

ডাটাবেসের নামটিতে ডান ক্লিক করুন, সম্পত্তি উইন্ডোটি পেতে সম্পত্তিটিতে ক্লিক করুন, বিকল্প ট্যাবটি খুলুন এবং মাল্টি ব্যবহারকারী থেকে একক ব্যবহারকারীর "সীমাবদ্ধ অ্যাক্সেস" সম্পত্তিটি পরিবর্তন করুন। আপনি যখন ওকে বোতামটি চাপবেন, এটি আপনাকে সমস্ত উন্মুক্ত সংযোগ বন্ধ করতে অনুরোধ করবে, "হ্যাঁ" নির্বাচন করুন এবং আপনি ডাটাবেসটির নাম পরিবর্তন করতে প্রস্তুত ...


2

এগুলি আমার (এসকিউএল ২০০৮ এন্টারপ্রাইজ) কাজ করে না, আমি কোনও চলমান প্রক্রিয়া বা ডিবিতে সংযুক্ত ব্যবহারকারীদেরও দেখতে পেলাম না। সার্ভারটি পুনঃসূচনা (ম্যানেজমেন্ট স্টুডিওতে এসকিএল সার্ভারে ডান ক্লিক করুন এবং পুনরায় চালু করুন) আমাকে ডিবি পুনরুদ্ধার করার অনুমতি দিয়েছে allowed


2

আমি এসকিউএল সার্ভার ২০০৮ আর 2 ব্যবহার করছি, আমার ডিবিটি ইতিমধ্যে একক ব্যবহারকারীর জন্য সেট করা ছিল এবং এমন একটি সংযোগ ছিল যা ডাটাবেসে কোনও ক্রিয়াকে সীমাবদ্ধ করে। এইভাবে প্রস্তাবিত এসকিউএলমেনিসের সমাধানটি ত্রুটির সাথে প্রতিক্রিয়া জানায়। এখানে আমার ক্ষেত্রে কাজ করা এক


0

আমি ডাটাবেসে সমস্ত প্রক্রিয়া তালিকা পেতে sp_Wo ব্যবহার করি। এটি আরও ভাল কারণ আপনি কোন প্রক্রিয়াটি হত্যা করবেন তা পর্যালোচনা করতে চাইতে পারেন।

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

আপনি এসপি_ও কমান্ডটি ব্যবহার করতে পারেন এবং আপনার ডেটাবেস ব্যবহার করে এমন সমস্ত প্রক্রিয়া মুছে ফেলতে পারেন এবং তারপরে আপনার ডাটাবেসটির নাম পরিবর্তন করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.