त्रुटि - अनन्य पहुँच प्राप्त नहीं की जा सकती क्योंकि डेटाबेस उपयोग में है


119

मैं वास्तव में एक बैकअप फ़ाइल से एक डेटाबेस को पुनर्स्थापित करने के लिए एक स्क्रिप्ट (Sql सर्वर 2008 में) बनाने की कोशिश कर रहा हूं। मैंने निम्नलिखित कोड बनाया है और मुझे एक त्रुटि मिल रही है -

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

अगर मुझे यह काम करने के लिए मिल सकता है, तो शायद मैं एक फ़ोल्डर से कई डेटाबेस को पुनर्स्थापित करने के लिए एक विश्वसनीय स्क्रिप्ट बना सकता हूं। मुझे नेट पर कोई विश्वसनीय कोड नहीं मिला। मेरा कोड विश्वसनीय हो सकता है क्योंकि यह SS द्वारा ही बनाया गया है।
स्टीम करें

जवाबों:


106

मुझे लगता है कि यदि आप एक db को पुनर्स्थापित कर रहे हैं, तो आप उस db पर किसी भी मौजूदा लेनदेन के बारे में परवाह नहीं करते हैं। सही? यदि हां, तो यह आपके लिए काम करना चाहिए:

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

अब, एक अतिरिक्त आइटम के बारे में पता होना चाहिए। जब आप db को एकल उपयोगकर्ता मोड में सेट करते हैं, तो कोई अन्य व्यक्ति db से जुड़ने का प्रयास कर सकता है। यदि वे सफल होते हैं, तो आप अपने पुनर्स्थापना के साथ आगे बढ़ने में सक्षम नहीं होंगे। यह एक दौड़ है! मेरा सुझाव है कि एक बार में सभी तीन बयानों को चलाएं।


एक लेन-देन में सभी तीन बयान।
स्टीम

1
जब भी मैं उस एडवेंचरस डेटाबेस को एक्सेस करने की कोशिश करता हूं तो मेरा एसएसएमएस जवाब नहीं देता है।
स्टीम

2
वह वास्तव में मतलब है USE master, नहीं USER master
async

7
ALTER DATABASE [AdventureWorksDW] SET MULTI_USERसामान्य बहु उपयोगकर्ता मोड में डेटाबेस को वापस सुनिश्चित करने के लिए बस अंत में जोड़ें ।
ज्ञाना

1
@gnaanaa: यदि SINGLE_USERबैकअप समय में बैकअप अप डेटाबेस मोड में था , तो SINGLE_USERबैकअप बहाल होने पर यह मोड में होगा । यदि MULTI_USERबैकअप समय में यह मोड में था, तो यह मोड में होगा MULTI_USERजब इसे बहाल किया जाएगा। आप एक महान बिंदु बनाते हैं: पुनर्स्थापना समाप्त होने के बाद यह निश्चित रूप से जांचने योग्य है। तुम भी चला सकते हैं HEADERONLY पुनर्स्थापित बैकअप मीडिया पर और जाँच 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 पर इस पद्धति पर स्विच करना समाप्त कर दिया। पुनर्स्थापना अनन्य पहुँच प्राप्त करने में विफल रही और पुराने db को SINGLE_USER मोड में छोड़ दिया गया।
स्मोगेस्बॉर्ड

3
यह मेरे लिए काम किया। और इसे पुनर्स्थापित करते ही यह स्वचालित रूप से ऑनलाइन हो जाता है।
दिलीप

3
यह काम करता है, और यह स्वीकृत उत्तर में दौड़ की स्थिति से बचा जाता है।
स्कॉट व्हिटलॉक

1
धन्यवाद आंद्रेई।
एर्दोगन

11

मेरे लिए, समाधान है:

  1. बाईं ओर स्थित टैब में ऑप्टिक्स टैब में मौजूदा डेटाबेस (REPLACE के साथ) को ओवरराइट करें।

  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

मैंने बस sqlexpress सेवा को फिर से शुरू किया और फिर पुनर्स्थापना पूरी की


मैं नीचे के बारे में क्या कह सकता हूं ... मेरे लिए यह काम कर गया!
बाबनेव

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: SQL सेवाओं को फिर से शुरू करें और DB समाधान 2 को पुनर्स्थापित करने का प्रयास करें: सिस्टम / सर्वर को फिर से शुरू करें और DB समाधान 3 को पुनर्स्थापित करने का प्रयास करें: वर्तमान DB को वापस लें, वर्तमान / गंतव्य DB को हटाएं और DB को पुनर्स्थापित करने का प्रयास करें।


1

DB को एकल-उपयोगकर्ता मोड पर सेट करना मेरे लिए काम नहीं करता था, लेकिन इसे ऑफ़लाइन ले जाना, और फिर इसे ऑनलाइन लाने से काम चल गया। यह कार्य के अंतर्गत DB के राइट-क्लिक मेनू में है।

डायलॉग में 'ड्रॉप ऑल एक्टिव कनेक्शन्स' विकल्प को अवश्य देखें।


0

यहां एक तरीका है जो मैं उत्पादन से विकास तक डेटाबेस को पुनर्स्थापित कर रहा हूं:

नोट: मैं इसे SSAS नौकरी के माध्यम से दैनिक विकास के लिए उत्पादन डेटाबेस को आगे बढ़ाने के लिए कर रहा हूँ:

Step1: विकास में पिछले दिन का बैकअप हटाएं:

declare @sql varchar(1024);

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

Step2: विकास के लिए उत्पादन डेटाबेस की प्रतिलिपि बनाएँ:

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

Step3: .sql स्क्रिप्ट चलाकर पुनर्स्थापित करें

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

मुझे यह त्रुटि तब मिली जब Db को पुनर्स्थापित करने के लिए पर्याप्त डिस्क स्थान नहीं था। कुछ जगह की सफाई ने इसे हल कर दिया।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.