sql-server - সফটওয - রিলেশনাল ডাটাবেজ কি




কিভাবে আপনি একটি SQL সার্ভার 2005 ডাটাবেসের সব বর্তমান সংযোগ হত্যা করবেন? (13)

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

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

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

আমি একটি ডাটাবেস পুনঃনামকরণ করতে চাই, তবে ডাটাবেসটিতে 'একচেটিয়া লক পেতে পারে না এমন ত্রুটিটি পেতে থাকি, যা বোঝায় যে কিছু সংযোগ এখনও সক্রিয় আছে।

ডেটাবেসে সমস্ত সংযোগ আমি কিভাবে বানাতে পারি যাতে আমি এটির নামকরণ করতে পারি?


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

আমার মতে সবচেয়ে কঠিন উপায়:

ডান ক্লিক ডিবি বিচ্ছিন্ন করুন -> কার্যসমূহ -> বিচ্ছিন্ন করুন ... চেক করুন "ড্রপ সংযোগগুলি" ঠিক আছে

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


আমি SQL সার্ভার 2008 R2 ব্যবহার করছি, আমার ডিবি ইতোমধ্যে একক ব্যবহারকারীর জন্য সেট করা হয়েছে এবং একটি সংযোগ ছিল যা ডাটাবেসের যেকোনো ক্রিয়া সীমাবদ্ধ করেছিল। সুতরাং প্রস্তাবিত SQLMenace's সমাধান ত্রুটি সঙ্গে প্রতিক্রিয়া। এখানে আমার ক্ষেত্রে কাজ যে এক


আমি ডাটাবেস মধ্যে সব প্রক্রিয়া তালিকা পেতে 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

ফল
আপনি যে প্রক্রিয়াটি করতে চান সেটি খারিজ করতে আপনি KillCommand কলামে কমান্ড ব্যবহার করতে পারেন।

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

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

অথবা "services.msc" খুলুন এবং "SQL সার্ভার (MSSQLSERVER)" খুঁজে বের করুন এবং ডান-ক্লিক করুন, "পুনঃসূচনা করুন" নির্বাচন করুন।

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

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


এই কাজটি সম্পন্ন করার জন্য স্ক্রিপ্টটি, '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

এটা হত্যা, এবং আগুন দিয়ে এটি হত্যা:

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

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


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


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

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

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


একটি ডাটাবেস সব সক্রিয় সংযোগগুলো দেখুন দেখুন।

অ্যাডাম যে প্রস্তাবটি অনুসরণ করেছেন তা কার্যকরী করবে না কারণ যে সময় আপনি সক্রিয় সংযোগগুলির উপর লুপ করছেন সে সময় নতুন একটি প্রতিষ্ঠিত হতে পারে, এবং আপনি এটি মিস করবেন। আমি সংযুক্ত নিবন্ধটি নিম্নলিখিত পদ্ধতির ব্যবহার করে যা এই ত্রুটিহীনতাটি না করে:

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

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

'মাস্টার' ডাটাবেসটি ব্যবহার করুন এবং এই প্রশ্নের চালান, এটি আপনার ডেটাবেস থেকে সমস্ত সক্রিয় সংযোগগুলিকে হত্যা করবে।






sql-server-2005