programing

오류-데이터베이스가 사용 중이므로 독점 액세스를 얻을 수 없습니다.

nasanasas 2020. 9. 4. 07:32
반응형

오류-데이터베이스가 사용 중이므로 독점 액세스를 얻을 수 없습니다.


실제로 하나의 백업 파일에서 하나의 데이터베이스를 복원하는 스크립트 (Sql Server 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

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. 왼쪽에있는 "옵션"을 클릭하십시오.
  3. "대상 데이터베이스에 대한 기존 연결 닫기"확인란을 선택합니다. 여기에 이미지 설명 입력
  4. 확인을 클릭하십시오.

이것이 효과가 있기를 바랍니다.


데이터베이스를 복원하기 전에 다음 쿼리를 실행하십시오.

alter database [YourDBName] 
set offline with rollback immediate

그리고 이것은 복원 후 :

  alter database [YourDBName] 
  set online

저에게 해결책은 다음과 같습니다.

  1. 왼쪽 옵토 인 탭에서 기존 데이터베이스 덮어 쓰기 (WITH REPLACE)를 선택합니다.

  2. 다른 모든 옵션을 선택 취소하십시오.

  3. 소스 및 대상 데이터베이스를 선택합니다.

  4. 확인을 클릭하십시오.

그게 다야.


다음 스크립트를 사용하여 데이터베이스를 복원하기 전에 데이터베이스에 대해 열려있는 모든 연결을 찾아 종료하십시오.

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

이것이 도움이되기를 바랍니다 ...


복원을 시도하기 전에 db를 단일 사용자 모드로 설정해야한다고 생각합니다. 아래와 같이 사용하고 있는지 확인하십시오. master

USE master
GO
ALTER DATABASE AdventureWorksDW
SET SINGLE_USER

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

방금 sqlexpress 서비스를 다시 시작한 다음 복원이 정상적으로 완료되었습니다.


프로덕션에서 개발로 데이터베이스 복원을 수행하는 방법은 다음과 같습니다.

참고 : SSAS 작업을 통해 프로덕션 데이터베이스를 매일 개발에 푸시하고 있습니다.

1 단계 : 개발중인 전날 백업 삭제 :

declare @sql varchar(1024);

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

Step2: Copy production database to development:

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

Step3: Restore by running .sql script

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

Code that is within AE11_Restore.sql file:

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;

I got this error when there was not enough disk space to restore Db. Cleaning some space solved it.


Solution 1 : Re-start SQL services and try to restore DB Solution 2 : Re-start system / server and try to restore DB Solution 3 : Take back of current DB, Delete the current/destination DB and try to restore DB.


Setting the DB to single-user mode didn't work for me, but taking it offline, and then bringing it back online did work. It's in the right-click menu of the DB, under Tasks.

Be sure to check the 'Drop All Active Connections' option in the dialog.

참고URL : https://stackoverflow.com/questions/22209499/error-exclusive-access-could-not-be-obtained-because-the-database-is-in-use

반응형