ত্রুটি - এক্সক্লুসিভ অ্যাক্সেস পাওয়া যায়নি কারণ ডেটাবেস ব্যবহার করা হচ্ছে


119

আমি একটি ব্যাকআপ ফাইল থেকে একটি ডাটাবেস পুনরুদ্ধার করতে আসলে একটি স্ক্রিপ্ট তৈরি করার চেষ্টা করছি (এসকিউএল সার্ভার ২০০৮ সালে)। আমি নিম্নলিখিত কোডটি তৈরি করেছি এবং আমি একটি ত্রুটি পাচ্ছি -

Msg 3101, Level 16, State 1, Line 3
Exclusive access could not be obtained because 
the database is in use.
Msg 3013, Level 16, State 1, Line 3
RESTORE DATABASE is terminating abnormally.

আমি কীভাবে এই সমস্যাটি সমাধান করব?

IF DB_ID('AdventureWorksDW') IS NOT NULL 
BEGIN 
RESTORE DATABASE [AdventureWorksDW] 
FILE = N'AdventureWorksDW_Data' 
FROM  
DISK = N'C:\Program Files\Microsoft SQL Server\
MSSQL10_50.SS2008\MSSQL\Backup\AdventureWorksDW.bak' 
WITH  FILE = 1, 
MOVE N'AdventureWorksDW_Data' 
TO N'C:\Program Files\Microsoft SQL Server\
MSSQL10_50.SS2008\MSSQL\DATA\AdventureWorksDW.mdf', 
MOVE N'AdventureWorksDW_Log'  
TO N'C:\Program Files\Microsoft SQL Server\
MSSQL10_50.SS2008\MSSQL\DATA\AdventureWorksDW_0.LDF', 
NOUNLOAD,  STATS = 10 
END

যদি আমি এটি কাজ করতে পারি তবে সম্ভবত আমি একটি ফোল্ডার থেকে একাধিক ডাটাবেস পুনরুদ্ধার করার জন্য একটি নির্ভরযোগ্য স্ক্রিপ্ট তৈরি করতে পারি। নেটে কোনও নির্ভরযোগ্য কোড খুঁজে পেলাম না। আমার কোডটি নির্ভরযোগ্য হতে পারে কারণ এটি এসএস নিজেই উত্পন্ন।
বাষ্প

উত্তর:


106

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

USE master
GO

ALTER DATABASE AdventureWorksDW
SET SINGLE_USER
--This rolls back all uncommitted transactions in the db.
WITH ROLLBACK IMMEDIATE
GO

RESTORE DATABASE AdventureWorksDW
FROM ...
...
GO

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


লেনদেনে তিনটি বিবৃতি।
বাষ্প

1
আমার এসএসএমএস যখনই আমি সেই অ্যাডভেঞ্চারওয়ার্ক ডেটাবেস অ্যাক্সেস করার চেষ্টা করি তখন প্রতিক্রিয়াশীল মোডে যায় না।
স্টিম

2
তিনি আসলে USE masterনা, মানে USER master
async

7
ALTER DATABASE [AdventureWorksDW] SET MULTI_USERসাধারণ একাধিক ব্যবহারকারীর মোডে ডাটাবেসটি ফিরে এসেছে তা নিশ্চিত করতে কেবল শেষে যুক্ত করুন।
gnaanaa

1
@ gnaanaa: ব্যাকআপ গ্রহণ করা ডেটাবেস যদি SINGLE_USERব্যাকআপের সময় মোডে ছিল , SINGLE_USERব্যাকআপটি পুনরুদ্ধার করা হবে তখন এটি মোডে থাকবে । যদি এটি MULTI_USERব্যাকআপের সময়ে মোডে ছিল , এটি MULTI_USERপুনরুদ্ধার করার সময় এটি মোডে থাকবে । আপনি দুর্দান্ত বক্তব্য রেখেছেন: পুনরুদ্ধারটি শেষ হওয়ার পরে অবশ্যই এটি পরীক্ষা করা উপযুক্ত। আপনি ব্যাকআপ মিডিয়াতে পুনরুদ্ধার চালাতে পারেন এবং কলামটিতেIsSingleUser বিট-বুদ্ধিমান গণিত পরীক্ষা করতে বা করতে পারেন Flags
ডেভ ম্যাসন

236
  1. ফাইলটি পুনরুদ্ধার করার জন্য পথ নির্ধারণ করুন।
  2. বাম দিকে "বিকল্প" ক্লিক করুন।
  3. "পুনরুদ্ধার করার আগে লেজ-লগ ব্যাকআপ নিন" চেক করুন
  4. চেক বক্সটি টিক দিন - "গন্তব্য ডেটাবেজে বিদ্যমান সংযোগগুলি বন্ধ করুন"। এখানে চিত্র বর্ণনা লিখুন
  5. ঠিক আছে ক্লিক করুন।

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

3
এসকিউএল টাইপ করা থেকে বাঁচানোর জন্য আমাকে। সমস্ত উত্তরের মধ্যে একমাত্র জিইউআই পদ্ধতি।
লিওনেট চেন

আমি আশা করি এটি অন্যদের মতো আমার পক্ষে কাজ করত। তবে আমার জন্য চেক বাক্সটি সর্বদা গ্রে আউট ছিল। নীচে নীচে আন্দ্রে কার্চুয়েস্কির উত্তর , আমার পক্ষে কাজ করেছিল।
দেবরাজ গাদাবী

11
আমি পুনরুদ্ধার করতে সক্ষম হওয়ার আগে আমাকে "পুনরুদ্ধার করার আগে লেজ-লগ ব্যাকআপ নিন" আনচেক করতে হয়েছিল।
হিললে

3
"পুনরুদ্ধার করার আগে লেজ-লগ ব্যাকআপ নিন" এটিও চেক করা উচিত। ধন্যবাদ
jedu

50

ডাটাবেস পুনরুদ্ধার করার আগে এই ক্যোয়ারীটি কার্যকর করুন:

alter database [YourDBName] 
set offline with rollback immediate

এবং এটি পুনরুদ্ধারের পরে:

  alter database [YourDBName] 
  set online

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

3
এটি আমার জন্য কাজ করেছে। আপনি এটি পুনরুদ্ধার করার পরে এটি স্বয়ংক্রিয়ভাবে অনলাইনে আসে।
দিলিপ

3
এটি কাজ করে এবং এটি গৃহীত উত্তরের মধ্যে দৌড় শর্ত এড়িয়ে চলে।
স্কট হুইটলক

1
ধন্যবাদ আন্ড্রেই
এরদোগান

11

আমার জন্য, সমাধানটি হ'ল:

  1. বাম দিকে অপ্টিন ট্যাবটিতে বিদ্যমান ডাটাবেস (প্রতিস্থাপনের সাথে) ওভাররাইট পরীক্ষা করুন।

  2. অন্যান্য সমস্ত বিকল্প আনচেক করুন।

  3. উত্স এবং গন্তব্য ডাটাবেস নির্বাচন করুন।

  4. ঠিক আছে ক্লিক করুন।

এটাই.


1
আমার জন্যও কাজ করেছেন। পাশাপাশি "পুনরুদ্ধার করার আগে টেল-লগ ব্যাকআপ নিন" আনচেক করতে হয়েছিল।
যুবা

7

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

declare @sql as varchar(20), @spid as int

select @spid = min(spid)  from master..sysprocesses  where dbid = db_id('<database_name>') 
and spid != @@spid    

while (@spid is not null)
begin
    print 'Killing process ' + cast(@spid as varchar) + ' ...'
    set @sql = 'kill ' + cast(@spid as varchar)
    exec (@sql)

    select 
        @spid = min(spid)  
    from 
        master..sysprocesses  
    where 
        dbid = db_id('<database_name>') 
        and spid != @@spid
end 

print 'Process completed...'

আশা করি এটি সাহায্য করবে ...


3

আমি মনে করি নীচের মত পুনরুদ্ধার করার চেষ্টা করার আগে আপনার কেবলমাত্র ডিবিকে একক ব্যবহারকারী মোডে সেট করা দরকার, আপনি নিশ্চিত যে ব্যবহার করছেন তা নিশ্চিত করুন master

USE master
GO
ALTER DATABASE AdventureWorksDW
SET SINGLE_USER

2

আমি কেবল স্ক্লেক্সপ্রেস পরিষেবাটি পুনরায় চালু করেছি এবং তারপরে পুনরুদ্ধারটি জরিমানা শেষ করে


ডাউনটোট সম্পর্কে আমি কী বলতে পারি ... আমার জন্য এটি কাজ করেছিল!
বাবাউনিউ

1
ওপি-র পুনরুদ্ধার স্ক্রিপ্ট নিয়ে একটি সমস্যা ছিল কারণ তিনি তার ডিবি ইতিমধ্যে ব্যবহারের বিষয়টিকে বিবেচনায় নেননি। সমাধানটি হ'ল তার স্ক্রিপ্টটি সঠিক কমান্ড দিয়ে আপডেট করে তাকে ডিবিতে একচেটিয়া অ্যাক্সেসের অনুমতি দেয়। পরিষেবাটি পুনঃসূচনা করার সময় আপনার পক্ষে কাজ করতে পারে, এটি তাঁর সমস্যার উপযুক্ত সমাধান ছিল না।
পিএল

1
Use Master
alter database databasename set offline with rollback immediate;

--Do Actual Restore
RESTORE DATABASE databasename
FROM DISK = 'path of bak file'
WITH MOVE 'datafile_data' TO 'D:\newDATA\data.mdf',
MOVE 'logfile_Log' TO 'D:\newDATA\DATA_log.ldf',replace

alter database databasename set online with rollback immediate;
GO

1

সমাধান 1: এসকিউএল পরিষেবাগুলি পুনরায় চালু করুন এবং ডিবি সমাধান 2 পুনরুদ্ধার করার চেষ্টা করুন: সিস্টেম / সার্ভারটি পুনরায় শুরু করুন এবং ডিবি পুনরুদ্ধার করার চেষ্টা করুন 3: বর্তমান ডিবিকে পিছনে নিন, বর্তমান / গন্তব্য ডিবি মুছুন এবং ডিবি পুনরুদ্ধার করার চেষ্টা করুন।


1

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

ডায়লগে 'ড্রপ অল অ্যাক্টিভ সংযোগসমূহ' বিকল্পটি পরীক্ষা করে নেওয়ার বিষয়টি নিশ্চিত করুন।


0

উত্পাদন থেকে উন্নয়নে ডাটাবেস পুনরুদ্ধার করার জন্য এখানে একটি উপায় রয়েছে:

দ্রষ্টব্য: প্রযোজনীয় ডেটাবেসকে প্রতিদিন উন্নয়নের দিকে ঠেলে দেওয়ার জন্য আমি এসএসএএস কাজের মাধ্যমে এটি করছি:

পদক্ষেপ 1: বিকাশের আগের দিনের ব্যাকআপ মুছুন:

declare @sql varchar(1024);

set @sql = 'DEL C:\ProdAEandAEXdataBACKUP\AE11.bak'
exec master..xp_cmdshell @sql

পদক্ষেপ 2: উত্পাদন ডেটাবেস অনুলিপি করুন:

declare @cmdstring varchar(1000)
set @cmdstring = 'copy \\Share\SQLDBBackup\AE11.bak C:\ProdAEandAEXdataBACKUP'
exec master..xp_cmdshell @cmdstring 

স্টিপি 3:। এসকিউএল স্ক্রিপ্টটি চালিয়ে পুনরুদ্ধার করুন

SQLCMD -E -S dev-erpdata1 -b -i "C:\ProdAEandAEXdataBACKUP\AE11_Restore.sql"

AE11_Restore.sQL ফাইলের মধ্যে থাকা কোড:

RESTORE DATABASE AE11
FROM DISK = N'C:\ProdAEandAEXdataBACKUP\AE11.bak'
WITH MOVE 'AE11' TO 'E:\SQL_DATA\AE11.mdf',
MOVE 'AE11_log' TO 'D:\SQL_LOGS\AE11.ldf',
RECOVERY;

0

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


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