오류-데이터베이스가 사용 중이므로 독점 액세스를 얻을 수 없습니다.
실제로 하나의 백업 파일에서 하나의 데이터베이스를 복원하는 스크립트 (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에 연결을 시도 할 수 있습니다. 성공하면 복원을 진행할 수 없습니다. 경주입니다! 내 제안은 세 가지 명령문을 모두 동시에 실행하는 것입니다.
이것이 효과가 있기를 바랍니다.
데이터베이스를 복원하기 전에 다음 쿼리를 실행하십시오.
alter database [YourDBName]
set offline with rollback immediate
그리고 이것은 복원 후 :
alter database [YourDBName]
set online
저에게 해결책은 다음과 같습니다.
왼쪽 옵토 인 탭에서 기존 데이터베이스 덮어 쓰기 (WITH REPLACE)를 선택합니다.
다른 모든 옵션을 선택 취소하십시오.
소스 및 대상 데이터베이스를 선택합니다.
확인을 클릭하십시오.
그게 다야.
다음 스크립트를 사용하여 데이터베이스를 복원하기 전에 데이터베이스에 대해 열려있는 모든 연결을 찾아 종료하십시오.
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.
'programing' 카테고리의 다른 글
유형이 숫자인지 확인하는 방법 (0) | 2020.09.04 |
---|---|
Pandas DataFrame에서 True / False를 1/0에 매핑하려면 어떻게해야합니까? (0) | 2020.09.04 |
SourceTree에서 푸시를 시도 할 때 "태그가 이미 있기 때문에 업데이트가 거부되었습니다." (0) | 2020.09.04 |
자바에서 문자 c까지 문자열에서 하위 문자열을 얻는 방법은 무엇입니까? (0) | 2020.09.04 |
정규식을 사용하여 문자열에서 모든 YouTube 동영상 ID를 찾으려면 어떻게하나요? (0) | 2020.09.04 |