risposta-alla-domanda-sullo-sviluppo-web-bd.com

Errore: impossibile ottenere l'accesso esclusivo perché il database è in uso

In realtà sto provando a creare uno script (in Sql Server 2008) per ripristinare un database da un file di backup. Ho fatto il seguente codice e sto ricevendo un errore - 

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.

Come posso risolvere questo problema? 

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

Assumerò che se stai ripristinando un db, non ti importa delle transazioni esistenti su quel db. Destra? Se è così, questo dovrebbe funzionare per voi:

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

Ora, un elemento aggiuntivo da tenere presente. Dopo aver impostato il db in modalità utente singolo, qualcun altro potrebbe tentare di connettersi al db. Se hanno successo, non sarai in grado di procedere con il ripristino. È una gara! Il mio suggerimento è di eseguire tutte e tre le dichiarazioni contemporaneamente.

72
Dave Mason
  1. Imposta il percorso per ripristinare il file.
  2. Fai clic su "Opzioni" sul lato sinistro.
  3. Spunta la casella di controllo - "Chiudi connessioni esistenti al database di destinazione" .  enter image description here
  4. Clicca OK.

Spero che questo funzioni.

135
Vinu M Shankar

eseguire questa query prima di ripristinare il database:

alter database [YourDBName] 
set offline with rollback immediate

e questo dopo il ripristino:

  alter database [YourDBName] 
  set online
30

Per me, la soluzione è:

  1. Controlla Sovrascrivi il database esistente (WITH REPLACE) nella scheda optoins sul lato sinistro.

  2. Deseleziona tutte le altre opzioni.

  3. Seleziona il database di origine e destinazione.

  4. Clicca ok.

Questo è tutto.

6
Aayush Verma

Utilizzare il seguente script per trovare e terminare tutte le connessioni aperte al database prima di ripristinare il database.

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

Spero che questo aiuti ...

6
Aqeel Haider

Penso che devi solo impostare la modalità db per utente singolo prima di provare a ripristinare, come di seguito, assicurati di utilizzare master

USE master
GO
ALTER DATABASE AdventureWorksDW
SET SINGLE_USER
2
Jason

Soluzione 1: riavviare i servizi SQL e provare a ripristinare DB Soluzione 2: riavviare il sistema/server e provare a ripristinare DB Soluzione 3: riprendere il DB corrente, eliminare il DB attuale/di destinazione e provare per ripristinare DB.

0
Joseph Joy

L'impostazione del DB in modalità utente singolo non ha funzionato per me, ma portarlo offline e quindi riportarlo online ha funzionato. È nel menu del tasto destro del DB, sotto Attività.

Assicurati di selezionare l'opzione 'Elimina tutte le connessioni attive' nella finestra di dialogo.

0
Jeffrey Harmon

Ho ricevuto questo errore quando non c'era abbastanza spazio su disco per ripristinare Db. Pulire un po 'di spazio lo ha risolto.

0
user3790083

Ecco come faccio il ripristino del database dalla produzione allo sviluppo:

NOTA: lo sto facendo tramite il processo SSAS per inviare quotidianamente il database di produzione allo sviluppo:

Passaggio 1: Elimina il backup del giorno precedente nello sviluppo:

declare @sql varchar(1024);

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

Passaggio 2: copia il database di produzione nello sviluppo:

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

Passaggio 3: ripristinare eseguendo lo script .sql

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

Codice che si trova nel file 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
NonProgrammer

Ho appena riavviato il servizio sqlexpress e il ripristino è stato completato correttamente

0
BabaNew