উত্তর:
অ্যাডাম যে পদ্ধতির কাজ করবে না তার কারণটি হ'ল এটি যে সময় আপনি সক্রিয় সংযোগগুলি লুপ করছেন তার সময় নতুন একটি প্রতিষ্ঠিত হতে পারে এবং আপনি সেগুলি মিস করবেন। পরিবর্তে আপনি নিম্নলিখিত পদ্ধতির ব্যবহার করতে পারেন যার এই অপূর্ণতা নেই:
-- 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
এটি সম্পাদন করার জন্য স্ক্রিপ্ট, সমস্ত সংযোগকে মেরে ফেলার জন্য ডাটাবেসটির সাথে '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
and spid <> @@SPID
করতে SELECT @sKillConnection
বিবৃতি যাতে এটি আমার বর্তমান সংযোগ, যা একটি ত্রুটির বার্তা উৎপন্ন হবে মারতে চেষ্টা না।
এটিকে মেরে ফেলুন এবং আগুন দিয়ে হত্যা করুন:
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
এসকিউএল ম্যানেজমেন্ট স্টুডিও এক্সপ্রেস ব্যবহার:
অবজেক্ট এক্সপ্লোরার ট্রি ট্রিলে ম্যানেজমেন্টের অধীনে "ক্রিয়াকলাপ পর্যবেক্ষক" তে ড্রেল করুন (যদি আপনি এটি সেখানে না খুঁজে পান তবে ডাটাবেস সার্ভারে ডান ক্লিক করুন এবং "ক্রিয়াকলাপ মনিটর" নির্বাচন করুন)। ক্রিয়াকলাপ মনিটর খোলার মাধ্যমে আপনি সমস্ত প্রক্রিয়া সম্পর্কিত তথ্য দেখতে পারেন। আপনার পছন্দসই ডাটাবেসের জন্য লকগুলি সন্ধান করতে এবং সেই লকগুলি মেরে ফেলতে সক্ষম হওয়া উচিত, এটি সংযোগটিও হারাতে পারে।
এর পরে আপনার নাম পরিবর্তন করতে সক্ষম হওয়া উচিত।
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE
ALTER DATABASE [Test]
SET ONLINE
অফলাইনে থাকুন এতে কিছুটা সময় লাগে এবং কখনও কখনও আমি এতে কিছু সমস্যাও ভোগ করি ..
আমার মতে সবচেয়ে শক্ত উপায়:
বিচ্ছিন্নভাবে ডিবি -> টাস্কগুলি -> বিচ্ছিন্নভাবে ক্লিক করুন ... "ড্রপ সংযোগগুলি" পরীক্ষা করুন ঠিক আছে
পুনরায় সংযুক্ত করুন ডেটাবেসগুলিতে রাইট ক্লিক করুন -> সংযুক্ত করুন .. যোগ করুন ... -> আপনার ডাটাবেস নির্বাচন করুন এবং আপনার পছন্দসই ডাটাবেসের নামের সাথে সংযুক্তি হিসাবে কলাম পরিবর্তন করুন। ঠিক আছে
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
'মাস্টার' ডাটাবেস ব্যবহার করুন এবং এই ক্যোয়ারীটি চালান, এটি আপনার ডাটাবেস থেকে সমস্ত সক্রিয় সংযোগকে হত্যা করবে।
আমি সাধারণত একটি ত্রুটি ঘটায় যখন আমি একটি ডেটাবেস পুনরুদ্ধার করার চেষ্টা করি আমি সাধারণত ম্যানেজমেন্ট স্টুডিওতে গাছের শীর্ষে যাই এবং ডান ক্লিক করে ডাটাবেস সার্ভারটি পুনরায় চালু করি (কারণ এটি কোনও ডেভলপমেন্ট মেশিনে রয়েছে, এটি সম্ভবত উত্পাদনে আদর্শ নাও হতে পারে) )। এটি সমস্ত ডাটাবেস সংযোগ বন্ধ।
ALTER DATABASE ... SET SINGLE_USER
অন্যান্য উত্তরের আদেশগুলি একই 'একচেটিয়া লক পেতে পারে না' ত্রুটি পেয়েছিল)।
অবজেক্ট এক্সপ্লোরারের এমএস এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে, ডাটাবেসে ডান ক্লিক করুন। প্রসঙ্গ মেনুতে অনুসরণ করা 'কার্য -> অফলাইন নিন' নির্বাচন করুন
আরেকটি "আগুন দিয়ে এটি হত্যা করুন" পদ্ধতির নাম কেবলমাত্র এমএসএসকিউএসএলভার পরিষেবাটি আরম্ভ করা। আমি কমান্ডলাইন থেকে জিনিস করতে পছন্দ করি। এটি সিএমডিতে হুবহু করা হলে তা করবে: নেট স্টপ এমএসএসকিউএসএলভার এবং নেট এমএসএসকিউএসএল সার্ভার শুরু করুন
অথবা "পরিষেবাদি.এমএসসি" খুলুন এবং "এসকিউএল সার্ভার (এমএসএসকিউএলএসভার)" এবং ডান ক্লিক ক্লিক করে "পুনরায় চালু করুন" নির্বাচন করুন।
এটি "অবশ্যই, নিশ্চিতভাবে" সেই পরিস্থিতিতে চলমান সমস্ত ডাটাবেসের সমস্ত সংযোগকে হত্যা করবে।
(সার্ভার / ডাটাবেসে কনফিগারেশন পরিবর্তন ও পরিবর্তিত করে এমন অনেকগুলি পদ্ধতির চেয়ে আমি এটির চেয়ে ভাল)
এমএস এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও ২০০৮-এ এই ধরণের জিনিসটি কীভাবে নির্ভরযোগ্যভাবে করা যায় তা এখানে (অন্যান্য সংস্করণের জন্যও কাজ করতে পারে):
এই দৃশ্যে আমার জন্য কাজ করা বিকল্পটি নিম্নরূপ:
এটা চেষ্টা কর:
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
ডাটাবেসের নামটিতে ডান ক্লিক করুন, সম্পত্তি উইন্ডোটি পেতে সম্পত্তিটিতে ক্লিক করুন, বিকল্প ট্যাবটি খুলুন এবং মাল্টি ব্যবহারকারী থেকে একক ব্যবহারকারীর "সীমাবদ্ধ অ্যাক্সেস" সম্পত্তিটি পরিবর্তন করুন। আপনি যখন ওকে বোতামটি চাপবেন, এটি আপনাকে সমস্ত উন্মুক্ত সংযোগ বন্ধ করতে অনুরোধ করবে, "হ্যাঁ" নির্বাচন করুন এবং আপনি ডাটাবেসটির নাম পরিবর্তন করতে প্রস্তুত ...
আমি এসকিউএল সার্ভার ২০০৮ আর 2 ব্যবহার করছি, আমার ডিবিটি ইতিমধ্যে একক ব্যবহারকারীর জন্য সেট করা ছিল এবং এমন একটি সংযোগ ছিল যা ডাটাবেসে কোনও ক্রিয়াকে সীমাবদ্ধ করে। এইভাবে প্রস্তাবিত এসকিউএলমেনিসের সমাধানটি ত্রুটির সাথে প্রতিক্রিয়া জানায়। এখানে আমার ক্ষেত্রে কাজ করা এক ।
আমি ডাটাবেসে সমস্ত প্রক্রিয়া তালিকা পেতে 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;
আপনি এসপি_ও কমান্ডটি ব্যবহার করতে পারেন এবং আপনার ডেটাবেস ব্যবহার করে এমন সমস্ত প্রক্রিয়া মুছে ফেলতে পারেন এবং তারপরে আপনার ডাটাবেসটির নাম পরিবর্তন করতে পারেন।