একক-ব্যবহারকারী মোড থেকে প্রস্থান করুন


208

বর্তমানে, আমার ডাটাবেসটি একক ব্যবহারকারী মোডে রয়েছে। যখন আমি আমার ডাটাবেসটি প্রসারিত করার চেষ্টা করি তখন আমি একটি ত্রুটি পাই:

ডাটাবেস 'my_db' অ্যাক্সেসযোগ্য নয়। (অবজেক্ট এক্সপ্লোরার)

এছাড়াও, আমি যখন ডাটাবেস মুছতে চেষ্টা করি তখন ত্রুটিটি পাই:

'My_db' ডাটাবেসের স্টেট বা বিকল্পের পরিবর্তনগুলি এই সময়ে করা যাবে না। ডাটাবেসটি একক-ব্যবহারকারী মোডে রয়েছে এবং বর্তমানে একজন ব্যবহারকারী এটির সাথে সংযুক্ত আছেন।

আমি কীভাবে একক ব্যবহারকারী মোড থেকে বেরিয়ে যাব? এই ডাটাবেসটি ব্যবহার করে আমার কোনও ব্যবহারকারী নেই।

আমি যখন আইআইএস দিয়ে আমার সাইটটি ব্রাউজ করার চেষ্টা করি তখন আমার ত্রুটিটি হ'ল:

বর্তমান ওয়েব অনুরোধটি কার্যকর করার সময় একটি অযৌক্তিক ব্যতিক্রম উত্পন্ন হয়েছিল। ব্যতিক্রমের উত্স এবং অবস্থান সম্পর্কিত তথ্য নীচে ব্যতিক্রম স্ট্যাক ট্রেস ব্যবহার করে সনাক্ত করা যেতে পারে।

আমি মনে করি যেন একা-ব্যবহারকারীর মোড এটি ঘটায়।

উত্তর:


381

এসএসএমএস সাধারণভাবে পর্দার আড়ালে থাকা ডাটাবেসে বেশ কয়েকটি সংযোগ ব্যবহার করে।

অ্যাক্সেস মোড পরিবর্তন করার আগে আপনাকে এই সংযোগগুলি মারতে হবে।

প্রথমে নিশ্চিত হয়ে নিন যে অবজেক্ট এক্সপ্লোরার মাস্টারের মতো সিস্টেম ডাটাবেসে দেখানো হয়েছে।

দ্বিতীয়ত, একটি sp_Wo2 সম্পাদন করুন এবং ডাটাবেস 'মাই_ডিবি' এর সমস্ত সংযোগগুলি সন্ধান করুন। KILL { session id }সেশন আইডি SPIDতালিকাভুক্ত রয়েছে যেখানে করে সমস্ত সংযোগগুলি হত্যা করুন sp_who2

তৃতীয়ত, একটি নতুন ক্যোয়ারী উইন্ডো খুলুন।

নিম্নলিখিত কোডটি কার্যকর করুন।

-- Start in master
USE MASTER;

-- Add users
ALTER DATABASE [my_db] SET MULTI_USER
GO

ডাটাবেস ফাইল পরিচালনার বিষয়ে আমার ব্লগ নিবন্ধটি দেখুন । এটি ফাইলগুলি সরানোর জন্য লেখা হয়েছিল, তবে ব্যবহারকারীর পরিচালনা একই।


2
আমি যখন 'sp_Wo2' কমান্ডটি ব্যবহার করেছি, তখন কোনও ডিবি নাম 'মাই_ডিবি' এর সাথে সংযুক্ত থাকতে দেখি নি those সংযোগগুলির কোনওটিই আমি হত্যা করি নি। কমান্ডগুলি চালানোর পরে আমি একই ত্রুটি পেয়েছি = [: 'স্টেটে পরিবর্তন বা ডাটাবেস' my_db 'এর বিকল্পগুলি এখনই করা যাবে না। ডাটাবেসটি একক-ব্যবহারকারী মোডে রয়েছে এবং বর্তমানে একজন ব্যবহারকারী এটির সাথে সংযুক্ত আছেন। এমএসজি 5069, স্তর 16, রাজ্য 1, লাইন 1
ALL

2
আপনি কি নিশ্চিত হয়ে গেছেন যে আপনি মাস্টার রয়েছেন, sp_Wo2 ডাটাবেস = my_db সহ কোনও সারি দেখায় না এবং আপনার অবজেক্ট এক্সপ্লোরার মাই_ডিবিতে নেই।
CRAFTY DBA

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

1
এছাড়াও, আমার ইউএসপি_হো 2 স্ক্রিপ্টটি লোড করুন ( craftydba.com/wp-content/uploads/2011/09/usp-who2.txt )। এটি কার্যকর করুন। এটি ইউটিলিটিটি msdb.dbo.sp_ who2 এ রাখে। এটি আপনার ব্যবহারকারী আইডির অধীনে টেম্পডিবিতে একটি টেবিলের মধ্যে sp_who2 এর ফলাফলগুলি সংরক্ষণ করে, ডাটাবেসের নাম দ্বারা ফিল্টার করে। আমাদের আরও সহায়তা করতে ত্রুটির একটি চিত্র পোস্ট করুন। শুভকামনা।
ক্র্যাফটি ডিবিএ

3
এসপিআইডি সন্ধান করুন, নিম্নলিখিতটি ব্যবহার করুন: 100 হত্যা করুন 100 100টি সেশনের সংখ্যা (এসপিআইডি)।
ক্র্যাফটি ডিবিএ

45

প্রথমে অনুসন্ধান করুন এবং KILLবর্তমানে চলমান সমস্ত প্রক্রিয়া সন্ধান করুন।

তারপরে, মোডে T-SQLডাটাবেস সেট করতে নিম্নলিখিতটি চালান MULTI_USER

USE master
GO
DECLARE @kill varchar(max) = '';
SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(10), spid) + '; '
FROM master..sysprocesses 
WHERE spid > 50 AND dbid = DB_ID('<Your_DB_Name>')
EXEC(@kill);

GO
SET DEADLOCK_PRIORITY HIGH
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

এই সমাধান SQL সার্ভার 2016 উপর আমার জন্য কাজ করে তাহলে আমি ক্যোয়ারী master..sysprocesses, আমি বিভিন্ন সারি প্রদর্শিত দেখতে, কিন্তু তারপর সারি একটি ত্রুটির বার্তা দেওয়া ডাটাবেসের একক ব্যবহারকারী মোড, ইত্যাদি সঙ্গে প্রতিস্থাপিত হয়
youcantryreachingme

@ ইয়ুকান্ট্রিরিচিংমে, দয়া করে এখানে এসকিউএল সার্ভার ২০১ in এ আপনি যে ত্রুটি বার্তাটি পেয়েছিলেন তা এখানে সরবরাহ করুন যাতে আমি / অন্য কেউ এটি সমাধানের জন্য আপনাকে সহায়তা করতে সক্ষম হবে।
সতীশ

ওপি'র মতোই: এই মুহুর্তে 'মাই_ডিবি' ডাটাবেসের স্টেট বা বিকল্পের বিকল্পগুলি করা যাবে না। ডাটাবেসটি একক-ব্যবহারকারী মোডে রয়েছে এবং বর্তমানে একজন ব্যবহারকারী এটির সাথে সংযুক্ত আছেন।
youcantryreachingme

25

একক ব্যবহারকারী মোড থেকে স্যুইচআউট করতে, চেষ্টা করুন:

ALTER DATABASE [my_db] SET MULTI_USER

একক ব্যবহারকারী মোডে ফিরে যেতে, আপনি ব্যবহার করতে পারেন:

ALTER DATABASE [my_db] SET SINGLE_USER


1
আমি ত্রুটিটি পেয়েছি: 'রাজ্যে পরিবর্তন বা ডাটাবেস' মাই_ডিবি 'বিকল্পগুলি এই মুহুর্তে করা যাবে না। ডাটাবেসটি একক-ব্যবহারকারী মোডে রয়েছে এবং বর্তমানে একজন ব্যবহারকারী এটির সাথে সংযুক্ত আছেন। এমএসজি 5069, স্তর 16, রাজ্য 1, লাইন 1 ALL DATABASE বিবৃতি ব্যর্থ হয়েছে ''
লায়নড্যান্সার

1
আপনি কি ডাটাবেস বন্ধ করে পুনরায় চালু করতে পারবেন (স্পষ্টতই যদি এটি এমন কোনও উত্পাদন ব্যবস্থা না হয় যা অন্যান্য ব্যবহারকারীদের উপর প্রভাব ফেলবে) এবং তারপরে কমান্ডটি আবার চেষ্টা করবেন? এবং @ CRAFTYDBA হিসাবে কমান্ডটি মাস্টার ডাটাবেস থেকে কার্যকর করা উচিত।
আরএসবারো

1
আমি 'সিস্টেম ডেটাবেসস' প্রসারিত করেছি এবং ডান ক্লিক করা 'মাস্টার' এবং 'নিউ ক্যোয়ারী' নির্বাচন করেছি এবং আপনার এবং @ সিআরএফটিওয়াইডিবিএ'র কমেড দুটিতে চেষ্টা করেছি। একই ত্রুটি = [
লায়নড্যান্সার

1
বিদ্যমান সংযোগটি নষ্ট করতে আপনি কি ডাটাবেস বন্ধ এবং পুনরায় চালু করার চেষ্টা করেছিলেন? : আপনি আরো উপায় একটি ডাটাবেস সংযোগ হত্যা করার জন্য এখানে সন্ধান করতে পারেন stackoverflow.com/questions/11620/...
rsbarro

2
বাম ফলকের সার্ভারে ডান ক্লিক করুন এবং 'সংযোগ বিচ্ছিন্ন করুন' ক্লিক করুন। আপনার ডাটাবেসে আপনার কেবল একটি এসএসএমএস ট্যাব খোলা আছে তা নিশ্চিত করুন (ডান ক্লিক করুন এবং 'অন্যান্য সংযোগ বিচ্ছিন্ন করুন' নির্বাচন করুন) এবং তারপরে বিবৃতিটি কার্যকর করুন। প্রতিটি ট্যাব এবং অবজেক্ট এক্সপ্লোরার একটি সংযোগ; আপনার কেবলমাত্র একটি সংযোগ ডাটাবেসে খোলা থাকতে পারে (অতএব, 'একক ব্যবহারকারী মোড')। একক ব্যবহারকারীর 'একক সংযোগ' হওয়া উচিত :) শুভকামনা
tommy_o

20
  1. ডাটাবেস বিভাগে আপনার ডাটাবেস রাইট ক্লিক করুন
  2. "সম্পত্তি" নির্বাচন করুন
  3. "বিকল্পগুলি" পৃষ্ঠা নির্বাচন করুন
  4. "অন্যান্য বিকল্পগুলি" নীচে স্ক্রোল করুন এবং "অ্যাক্সেস সীমাবদ্ধ করুন" ফিল্ডটি পরিবর্তন করুন

এসকিউএল সার্ভারের অপশন পাতার স্ক্রিনশট


1
এই সমাধানটি এসকিউএল সার্ভার ২০১ 2016-এ আমার পক্ষে কাজ করবে না properties বৈশিষ্ট্য অ্যাক্সেস করার চেষ্টা করা একটি ত্রুটি দেখায় যে ডাটাবেসটি একক ব্যবহারকারী মোডে রয়েছে এবং ইতিমধ্যে একটি ব্যবহারকারী সংযুক্ত রয়েছে।
youcantryreachingme


8

আমার একই সমস্যা ছিল, এবং হত্যা করার সেশন_আইডিটি এই ক্যোয়ারীটি ব্যবহার করে পাওয়া গেছে:

Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');

এটি নিখুঁত ছিল। পেস্কি এসপিআইডি খুঁজে পেয়ে ডিবি আবার অনলাইনে পেল। অনেক ধন্যবাদ!
রাসেল স্পাইট

8

CTRL + 1 টিপুন

আপনার ডাটাবেস লক করে এমন প্রক্রিয়াটি সন্ধান করুন। আপনার ডিবির জন্য কলাম ডিবি নামটি দেখুন এবং স্পিডটি নোট করুন। এখন আপনাকে সেই বিবৃতি কার্যকর করতে হবে:

kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;

CTRL + 1 হ'ল একটি খুব সহজ শর্টকাট আমি সম্পর্কে জানতাম না!
টাইলার ফারসিথ

7

নিম্নলিখিত আমার জন্য কাজ করেছে:

USE [master]
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE

7

অন্য বিকল্পটি হ'ল:

  • অফলাইন ডাটাবেস গ্রহণ; এসএমএসএসে, ডানদিকের ডাটাবেসটি ক্লিক করুন এবং অফলাইন গ্রহণ করুন, 'সমস্ত সংযোগ ফেলে দিন' তে টিক দিন
  • চালান ALTER DATABASE [Your_Db] SET MULTI_USER

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

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

6

কেবলমাত্র যদি কেউ এই থ্রেডটিতে হোঁচট খায় তবে এখানে এসকিউএল সার্ভারের একটি বুলেট প্রুফ সমাধানটি একক ব্যবহারকারী মোডে আটকে রয়েছে

- আপনাকে যে সংযোগটি মারতে হবে তার প্রসেস আইডি (স্পাইড) পান
- 'ডিবি নাম' প্রতিস্থাপন করুন ডিবিটির আসল নাম দিয়ে

SELECT sd.[name], sp.spid, sp.login_time, sp.loginame 
FROM sysprocesses sp 
INNER JOIN sysdatabases sd on sp.dbid = sd.dbid  
WHERE sd.[name] = 'DBName'

বিকল্প হিসাবে, আপনি খোলা সংযোগের "স্পিড" পেতে "sp_ whoo" কমান্ডটিও ব্যবহার করতে পারেন:

- অথবা পরিবর্তে এই এসপি ব্যবহার করুন

exec sp_who

- তারপরে নিম্নলিখিতটি সম্পাদন করুন এবং [স্পাইড] এবং [ডিবি নাম] সঠিক মান সহ প্রতিস্থাপন করুন

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

অতিরিক্ত তথ্যের জন্য ধন্যবাদ, একটি বড় পার্থক্য তৈরি!
ড্যানিয়েল

5

এটি কারও সাহায্য করে কিনা তা নিশ্চিত নয় তবে আমার একই সমস্যা ছিল এবং যে প্রক্রিয়াটি আমাকে ধরে রেখেছে তা খুঁজে পেলাম না। আমি এসএসএমএস বন্ধ করে দিয়েছি এবং স্থানীয় পরিষেবাগুলিতে আঘাত করা সমস্ত পরিষেবা বন্ধ করে দিয়েছি। তারপরে একবার আমি andুকলাম এবং এক্সিকিউট স্পিও_হো 2 চালিয়েছি, এটি আমাকে অপরাধীকে দেখিয়েছিল। আমি প্রক্রিয়াটি মেরেছি এবং মাল্টি_উসারকে কাজ করতে সক্ষম হয়েছি, তারপরে পরিষেবাগুলি পুনরায় চালু করতে সক্ষম হয়েছি। নির্দিষ্ট প্যাকেজগুলির জন্য আমাদের কয়েক মিনিট / সেকেন্ডে আইআইএস হিট করে।


3

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


3

আরও কার্যকর হতে জেস্পারদের উত্তর যুক্ত করা :

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGHDEADLOCK_PRIORITY5 এর ব্যবহার ।

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

এটি অন্যান্য স্পাইড (যা বেশ কয়েকবার করার প্রয়োজন হতে পারে) সন্ধান এবং হত্যা বন্ধ করে দেয়।

এটি সম্ভবত আপনার ALTER DATABASEএকাধিকবার চালানো দরকার , (তবে জেস্পার তা করেন)। সংশোধিত কোড:

USE [master]
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE

3

এই স্ক্রিপ্ট ব্যবহার করুন

exec sp_who

Dbname এবং স্পিড কলামটি সন্ধান করুন

এখন এক্সিকিউট

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;

2

আজ আমি একই সমস্যার মুখোমুখি হয়েছি যেখানে আমার ডাটাবেসটি মাল্টি ব্যবহারকারী থেকে একক ব্যবহারকারী মোডে পরিবর্তিত হয়েছিল এবং এটি শেষ পর্যন্ত আমাকে ডাটাবেস প্রকাশ করতে বাধা দিচ্ছিল।

এই সমস্যাটি সমাধান করার জন্য, আমাকে সমস্ত ভিজ্যুয়াল স্টুডিও দৃষ্টান্ত বন্ধ করতে হয়েছিল এবং এসকিএল সার্ভারের ক্যোয়ারী উইন্ডোতে নীচের কমান্ডটি চালাতে হয়েছিল -

USE [Your_Database_Name]; ALTER DATABASE [Your_Database_Name] SET MULTI_USER GO

এই কমান্ডটি একক ব্যবহারকারী থেকে একাধিক ব্যবহারকারীকে ডিবি পরিবর্তন করেছে এবং এর পরে, আমি সফলভাবে প্রকাশ করতে সক্ষম হয়েছি।


1

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

-- Actual Code to change my_db to multi user mode
USE MASTER;
GO
ALTER DATABASE [my_db] SET MULTI_USER

দ্রষ্টব্য: এটি এসকিউএল সার্ভার 2005 এ একটি সম্ভাব্য বাগ বলে মনে হচ্ছে!


1

আমরা এটি এসকিউএল ২০১২ এ সবেমাত্র অনুভব করেছি we আমরা মূল সেশনটি মেরে ফেললে একটি প্রতিলিপি প্রক্রিয়া লাফিয়ে উঠল যা এটি একক ব্যবহারকারীর কাছে সেট করে। তবে এসপি_ওহো 2 ডিবিতে যুক্ত হওয়া নতুন প্রক্রিয়াটি দেখায় নি। এসএসএমএস বন্ধ করে পুনরায় খোলার পরে ডাটাবেসে আমাদের এই প্রক্রিয়াটি দেখার অনুমতি দেয় এবং তারপরে আমরা এটিকে মেরে ফেলতে পারি এবং তাত্ক্ষণিকভাবে মাল্টি_উজার মোডে স্যুইচ করতে পারি এবং এটি কাজ করে।

আমি এর পিছনে যুক্তিটি কার্যকর করতে পারি না তবে এটি এসএসএমএসে একটি বাগ হিসাবে দেখা গেছে এবং এটি এসকিউএল ২০১২-এ নিজেকে প্রকাশ করছে।


0

মাস্টার ব্যবহার করুন

যাওয়া

d.name, d.dbid, spid, login_Time, nt_domain, nt_username, sysprocesses থেকে loginame p অভ্যন্তরীণ যোগসূত্র সিডডেটাবেসেস d এ p.dbid = d.dbid এ নির্বাচন করুন যেখানে d.name = 'ডাটাবেস নাম'

568 বধ - স্পাইড হত্যা

ডেটাবেসের ডাটাবেসের নাম পরিবর্তন করুন '

মাল্টি_উসার সেট করুন

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