এসকিউএল সার্ভার ডাটাবেস <dbname> ছাড়তে পারে না কারণ এটি বর্তমানে ব্যবহৃত হচ্ছে ... তবে কোনও সেশন প্রদর্শিত হয়নি


72

যখন আমি একটি ডাটাবেস ফেলে দেওয়ার চেষ্টা করি তখন ত্রুটিটি পাই "ডাটাবেস" ডিবি নাম "ফেলে দেওয়া যায় না কারণ এটি বর্তমানে ব্যবহৃত হচ্ছে"। যাইহোক, আমি যখন রান করি তখন sp_who2অবশ্যই এই ডাটাবেসের সাথে কোনও সেশন সংযুক্ত নেই। আমি ডাটাবেস সেট করে রেখেছি single_user mode with rollback immediate

ইহা কি জন্য ঘটিতেছে?

উত্তর:


20

আপনি যে ডিবি মুছে ফেলতে চান তাতে ডেটাবেস স্ন্যাপশটের মতো নির্ভরতা না রয়েছে তা নিশ্চিত করুন। যদিও, ত্রুটি বার্তা অন্যথায় চেহারা হবে। আপনি কি নিশ্চিত যে এমন কোনও গোপন প্রক্রিয়া নেই যা আপনার ডাটাবেসে সংযুক্ত হচ্ছে? একটি স্ক্রিপ্ট চালানো একটি ভাল পদ্ধতি হ'ল যা সমস্ত সেশনকে হত্যা করে এবং সাথে সাথে ডাটাবেসটির অন্য নামকরণ করে এবং তারপরে ডাটাবেস ড্রপ করে।

এই নির্বাচনের উপর ভিত্তি করে একটি কার্সার তৈরি করুন:

  select  d.name , convert (smallint, req_spid) As spid
      from master.dbo.syslockinfo l, 
           master.dbo.spt_values v,
           master.dbo.spt_values x, 
           master.dbo.spt_values u, 
           master.dbo.sysdatabases d
      where   l.rsc_type = v.number 
      and v.type = 'LR' 
      and l.req_status = x.number 
      and x.type = 'LS' 
      and l.req_mode + 1 = u.number
      and u.type = 'L' 
      and l.rsc_dbid = d.dbid 
      and rsc_dbid = (select top 1 dbid from 
                      master..sysdatabases 
                      where name like 'my_db')

কার্সারের ভিতরে ইস্যু:

SET @kill_process =  'KILL ' + @spid      
            EXEC master.dbo.sp_executesql @kill_process
                   PRINT 'killed spid : '+ @spid

কার্সারটি বন্ধ হয়ে যাওয়ার পরে:

sp_dboption 'my_db', 'single user', 'TRUE'

go

sp_renamedb 'my_db', 'my_db_old'

go

DROP DATABASE MY_DB_OLD 

কোডটির জন্য ধন্যবাদ - এটি কার্যকর হতে পারে। আমি যা বুঝতে পারি না তা হ'ল "লুকানো" সেশন কী? আমি ভাবতাম sp_ কে এবং অন্যান্য মেটাডেটা (ডিএমভি) সমস্ত সেশন দেখায় , অন্যরা কী ব্যবহার করে?
tusau

হ্যাঁ সাধারণত আপনার সমস্ত সক্রিয় / অ্যানএ্যাকটিভ sp_Wo এর মাধ্যমে দেখতে পারা উচিত বা মাস্টার ডিবি থেকে সিসপ্রসেসেস টেবিলটি অনুসন্ধান করা উচিত। গোপনে আমি একটি প্রক্রিয়া বলতে চাইছিলাম যা একটি অ্যাপ্লিকেশন পরিষেবা থেকে পুনরায় সংযোগ স্থাপন করে। চিয়ার্স।
yrushka

1
এটি একাধিক কারণে পুরানো:
অ্যারন বারট্র্যান্ড

1
দুর্ভাগ্যক্রমে আমি এই প্রশ্নের উত্তর মনে করি না - প্রশ্নকারী জিজ্ঞাসা করছেন কেন এটি হচ্ছে, কীভাবে সমাধান করা যায় না। উত্তরের সরবরাহটি কাজ করে, তবে এখনও আমি জানি না যে কী আমাকে একটি ডাটাবেস মুছে ফেলতে আটকাচ্ছে। অ্যারোনবার্ট্র্যান্ড উল্লেখ করেছেন "এমনকি অবজেক্ট এক্সপ্লোরারও অপরাধী হতে পারে" যা আসলে ডাটাবেসের অন্যতম কারণ হয়ে দাঁড়ায়, তবে আমি কীভাবে বলতে পারি এটি নিশ্চিতভাবে অবজেক্ট এক্সপ্লোরার?
শিখুনবাইরেড

এটি আমাকে ত্রুটি দেয় "আপনার নিজের প্রক্রিয়াটি হত্যার জন্য কিল ব্যবহার করতে পারে না"
নুয়ান্ডার

80

অন্য ডাটাবেসের সাথে সংযুক্ত একটি অধিবেশনটিতে একটি উন্মুক্ত লেনদেন হতে পারে যা আপনার ডাটাবেসকেও প্রভাবিত করে - sp_Wh2 কেবল একটি ডাটাবেস দেখায়। এটি এসএসএমএসে অবজেক্ট এক্সপ্লোরার বা অবজেক্ট এক্সপ্লোরার বিশদ হিসাবে খোলার মত সাধারণ কিছু হতে পারে, যা কেবলমাত্র sp_Wo2 তে একটি ডাটাবেস দেখায়।

দায়বদ্ধ যে অধিবেশন সন্ধান করার চেষ্টা করবেন না ; কেবলমাত্র একটি বিবৃতি দিয়ে তাদের সকলকে হত্যা করুন (এবং নিশ্চিত হন যে এটি আপনার সংযুক্ত এসএসএমএসের অনুলিপি নয়, উদাহরণস্বরূপ অন্য কোয়েরি উইন্ডো, অবজেক্ট এক্সপ্লোরার ইত্যাদি):

USE master;
GO
ALTER DATABASE dbname SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO

এখন আপনি এটি ফেলে দিতে সক্ষম হবেন এবং ইউডি নয়, ডিডিএল ব্যবহার করে এটি করতে পারবেন:

DROP DATABASE dbname;

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

1
আসলে, আমাকে যা করতে হয়েছিল তা হ'ল USE masterতখন DROP DATABASE dbname। স্পষ্টতই কেবলমাত্র ডিবি প্রকাশ করার জন্য অন্য কিছু "ব্যবহার" করা দরকার।
vapcguy

2
@ ভ্যাপকগুই এটি কেবল সত্য যদি আপনার বর্তমান ক্যোয়ারী উইন্ডোটি কেবলমাত্র সংযোগ। এটি সাধারণত কেস হয় না (এবং এজন্যই আমার উত্তরগুলি বলে "এবং নিশ্চিত করুন যে এটি আপনার সংযুক্ত এসএসএমএসের অনুলিপি নয়)"।
অ্যারন বারট্র্যান্ড

20

আপনি DROPকমান্ড দেওয়ার সময় আপনার বর্তমান ডাটাবেসটি কী ? এটা চেষ্টা কর:

use master
go
drop database mydb
go

এছাড়াও আপনি যে কোনও ডাটাবেসকে ফেলে রাখতে চান saতা হিসাবে এবং আপনি সংযুক্ত আছেন তাও নিশ্চিত হন dbo


আমি অবশ্যই মাস্টারের সাথে সংযুক্ত আছি। একটি ডেটাবেস ড্রপ করার জন্য আমাকে সা হিসাবে সংযুক্ত হওয়া উচিত নয়। এটি আমার কাছে ত্রুটির মতো দেখাচ্ছে - এটি কোনও সেশন প্রদর্শন করছে না, বা এটি মনে করে যে একটি অধিবেশন ব্যবহারের মধ্যে রয়েছে তবে সেখানে নেই।
tusau

3
আমি কেবল এটির সাথে ধরা পড়লাম - sqlcmd প্রম্পট থেকে ডাটাবেসে সেট করা প্রসঙ্গটি সহ ড্রপ স্ক্রিপ্টটি চালানোর চেষ্টা করেছি! দোহ
জনিআআআআআআআআ।

18

আপনি যখন ইউআই ব্যবহার করেন তবে এই কর্মের জন্য কোনও স্ক্রিপ্ট জারি করতে বলুন তখন এসএসএমএস কী করে তা দেখার বিষয়? আপনি যখন সঠিকভাবে ডিবিতে ক্লিক করেন এবং মুছুন পছন্দ করেন তখন এসএসএমএস কী করে তা এখানে বিদ্যমান সংযোগগুলি বন্ধ করতে বাক্সটি চেক করুন:

EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'yourdbname'
GO

USE [master]
GO
ALTER DATABASE [yourdbname] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

USE [master]
GO

DROP DATABASE [yourdbname]
GO

... ধরে
নিচ্ছি

4
আপনি ডাটাবেস বাদ দিচ্ছেন, আমি ধরে নিব এটি ঠিক আছে।
জর্জিপসিত

1
এটি আমার পক্ষে কাজ করেছিল! :)
লিওনার্দো ত্রিমারচি

5

আমি অনেকবার এই পরিস্থিতির মুখোমুখি হয়েছি এবং নীচে আমি যা করছি তা হল:

যখন সুস্পষ্ট পদ্ধতিগুলি কার্যকর না হয় ..... (ঠিক আপনার অবস্থার মতো):

সিসডাটাবেসগুলি থেকে ডাটাবেস আইডিটি সন্ধান করুন।

তারপরে এক্সিকিউট করুন - sp_lockএটি স্পিড এবং ডিবিডের সাথে সমস্ত লক প্রদর্শন করবে।

আপনি অফলাইনে বা ড্রপ করার চেষ্টা করছেন এমন ডিবিডের সাথে স্পিডগুলি বধ করুন।

যদিও, প্রক্রিয়াটি একটি সামান্য ম্যানুয়াল, এটি নীচে হিসাবে স্বয়ংক্রিয়ভাবে করা যেতে পারে:

IF OBJECT_ID('tempdb.dbo.#temp', 'U') IS NOT NULL
  DROP TABLE #temp;
create table #temp (spid int
                , dbid int
                ,ObjId bigint
                , IndId bigint
                ,Type varchar(5)
                ,resource varchar(max)
                ,Mode varchar(5)
                ,status varchar(10));
declare @dbid int
select @dbid =DB_ID(db_name())

insert into #temp
exec sp_lock

select * from #temp
where dbid = @dbid

2

স্ট্যাকওভারফ্লোতে সত্যিই সহজ উত্তর পাওয়া গেছে যা আমার জন্য প্রথমবারের মতো কাজ করেছে:

https://stackoverflow.com/a/7469167/261405

উত্তরটি থেকে এসকিউএলটি এখানে:

DECLARE @DatabaseName nvarchar(50)
SET @DatabaseName = N'YOUR_DABASE_NAME'

DECLARE @SQL varchar(max)

SELECT @SQL = COALESCE(@SQL,'') + 'Kill ' + Convert(varchar, SPId) + ';'
FROM MASTER..SysProcesses
WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId

--Use this to see results
SELECT @SQL 
--Uncomment this to run it
--EXEC(@SQL)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.