2009-09-17 4 views
1

현재 Access 데이터베이스에서 변환중인 SQL 데이터베이스가 있습니다. Access 데이터베이스의 기능 중 하나는 'Copy DB'에 있으며 'dev'사이트에서 작업 할 때 사용됩니다. 프로덕션 파일을 dev 사이트로 물리적으로 복사하여 모든 프로덕션 데이터를 복사합니다. 이런 식으로 모든 프로덕션 데이터와 구조 및 쿼리와 모든 것이 dev 버전으로 복제됩니다. 이것은 우리가 무언가가 일어나고 생산 데이터에서 놀고 싶지 않은 이유를 테스트 할 때 가끔씩 수행되어야합니다. 희귀 한 것은 아니지만 빈번하지는 않습니다. 한 달에 한두 번 정도. 나는 SQL로 작업 할 때 이것을 완성하기 위해 다른 사람들이 무엇을했는지 궁금합니다.SQL Server 데이터베이스의 작업 복사본을 만드는 가장 좋은 방법은 무엇입니까?

DEV 버전으로 복원 한 다음 DB 백업을 수행 할 수 있다고 생각하지만이 백업이 일반 백업 프로세스를 방해하지 않게하려고합니다. 하나의 DB에서 파일 시스템으로 이동하는 대신 다른 DB로 직접 수행 할 수있는 방법이 없으며 백업이 발생하지 않은 것처럼 보입니다 (즉, REAL 백업은 실제로 백업해야하는 모든 항목을 백업합니다).

다른 옵션은 있습니까? 나는 SQL Compare와 SQL Data Compare를 Red Gate에서 가지고 있지만,이 기능을 특정 사용자 (높은 priv와 DEV 사이트에 대한 액세스 권한)에 노출시켜야하며 필요하지 않습니다.

답변

3

잘 살펴본 후에 파일 시스템을 통과해야한다는 결론에 도달했지만 정상적인 백업 프로세스에 영향을 미치지 않으면 서 백업/복구 작업을 수행 할 수있는 방법이 있습니다. 복사 전용 '모드입니다. 여기에 스크립트가 그것을 할 수있다 : (가) 원래 실제 파일, NOT 데브 DB 파일을 백업에

BACKUP DATABASE [ProductionDB] 
TO DISK = N'D:\ProductionDBToDevTransfer.bak' 
WITH 
    COPY_ONLY, 
    NOFORMAT, 
    INIT, 
    NAME = N'DB-Full Backup', 
    SKIP, 
    NOREWIND, 
    NOUNLOAD, 
    STATS = 10 

RESTORE DATABASE [DevDB] 
FROM DISK = N'D:\ProductionDBToDevTransfer.bak' 
WITH 
    FILE = 1, 
    MOVE N'ProductionDB' TO N'D:\Microsoft\SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\DevDB.mdf', 
    MOVE N'ProductionDB_log' TO N'D:\Microsoft\SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\DevDB_log.ldf', 
    NOUNLOAD, 
    REPLACE, 
    STATS = 10 

, 파일을 복원 RESTORE 기본적으로 RESTORE 명령 ...의 MOVE 문으로 특히 주목를 타고 , 당신이 DEV db로 복원하고 있다는 사실에도 불구하고 ... 나는 복원을했을 때 아주 힘든 방법을 발견했으며, SSMS는 파일이 다른 db에 의해 사용되었다고 불평했다 ... OMG, 비 직관적 인 방법 .

1

다른 데이터베이스에서 데이터베이스를 직접 복원 할 수 있습니다.

SQL Management Studio를 사용하는 경우 데이터베이스 복원 대화 상자의 "장치에서"대신 "데이터베이스에서"를 선택하십시오.

+0

동일한 작업을 수행하기 위해 SQL 코드를 알고 있습니까? –

+0

흠 ... 또한 이것은 DB 백업에서 복원하는 것처럼 보입니다. DB의 '실행중인 버전'이 아닙니다 ... 즉, DB를 선택하는 것은 단순히 수행 된 백업을 나열하는 편리한 방법 일뿐입니다 DB에. –

+0

와우, 네 말이 맞아. 나는 모든 데이터베이스를 백업했기 때문에 그 사실을 알지 못했습니다. 파일 시스템을 살펴 봐야합니다. –

0

프로덕션 데이터의 주문형 백업을 수행 한 다음 dev 컴퓨터에서 백업을 복원합니다.

1

일반적으로 백업에서 전체 데이터베이스를 복원하려고합니다. 실제 실행중인 데이터베이스에서 직접 실행하려고하면 사용자에게 잠금 문제가 발생할 수 있습니다. SSIS를 사용하여이 작업을 수행 할 수 있지만 간단하게 설정하지 않아도됩니다.

또 다른 가능성은 사용자가 데이터베이스에없는 기간이있는 경우에만 한동안 prod를 해제 할 수 있는지 여부입니다. 그런 다음 데이터베이스를 분리하십시오. dev 데이터베이스를 분리하고 삭제하십시오. 파일을 dev 서버에 복사하고 두 데이터베이스를 다시 연결하십시오. 이는 복원보다 빠를 수 있지만 프로덕션 환경에서 24 시간 데이터 액세스 권한이없는 드문 환경입니다.

덧붙여 말하자면, dev와 prod를 별도의 서버에 설치하는 것이 좋습니다.

dev로 복원하는 경우 아직 준비가 완료되지 않은 모든 변경 사항을 스크립팅하므로 복원 직후에 실행할 수 있습니다. 데이터베이스 변경 사항을 스크립트로 작성하여 소스 제어에 저장하는 것이 가장 좋습니다. 그렇게하면 더 쉽게 할 수 있습니다.

2

위의 스크립트는 작동하지만 복사 된 서버의 논리 파일 이름은 변경하지 않습니다. 따라서 프로세스를 되돌리기 위해 다시 실행하려고하면 MOVE 문에서 실패합니다.

스크립트를 조금 수정하고 나에게 맞는 것으로 보이는 다음을 생각해 냈습니다. 나는 이걸 처음 접했어. 조심해!

DECLARE @SOURCEDB nvarchar(100) 
DECLARE @SOURCEDBLOG nvarchar(100) 
DECLARE @DESTINATIONDB nvarchar(100) 
DECLARE @DESTINATIONDBLOG nvarchar(100) 
DECLARE @BACKUPDIR nvarchar(100) 
DECLARE @BACKUPFILE nvarchar(100) 
DECLARE @BACKUPNAME nvarchar(100) 
DECLARE @SQLDATADIR nvarchar(100) 
DECLARE @SQLDATABACKUPFILE nvarchar(100) 
DECLARE @SQLDATABACKUPLOGFILE nvarchar(100) 

--CHANGE THESE VALUES TO MATCH YOUR SYSTEM 
SET @SOURCEDB = N'test' 
SET @DESTINATIONDB = N'test-backup' 
SET @BACKUPDIR = N'C:\SHARED\' 
SET @SQLDATADIR = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\' 

--CALCULATED VALUES 
SET @SOURCEDBLOG = @SOURCEDB + N'_log' 
SET @DESTINATIONDBLOG = @DESTINATIONDB + N'_log' 
SET @BACKUPFILE = @BACKUPDIR + @SOURCEDB + N'-to-' + @DESTINATIONDB + N'.bak' 
SET @BACKUPNAME = @SOURCEDB + N'-Full Backup' 
SET @SQLDATABACKUPFILE = @SQLDATADIR + @DESTINATIONDB + N'.mdf' 
SET @SQLDATABACKUPLOGFILE = @SQLDATADIR + @DESTINATIONDBLOG + N'.ldf' 

--BACKUP THE DATABASE 
BACKUP DATABASE @SOURCEDB 
TO DISK = @BACKUPFILE 
WITH 
     COPY_ONLY, 
     NOFORMAT, 
     INIT, 
     NAME = @BACKUPNAME, 
     SKIP, 
     NOREWIND, 
     NOUNLOAD, 
     STATS = 10 

--RESTORE THE BACKUP TO THE NEW DATABASE NAME 
RESTORE DATABASE @DESTINATIONDB 
FROM DISK = @BACKUPFILE 
WITH 
     FILE = 1, 
     MOVE @SOURCEDB TO @SQLDATABACKUPFILE, 
     MOVE @SOURCEDBLOG TO @SQLDATABACKUPLOGFILE, 
     NOUNLOAD, 
     REPLACE, 
     STATS = 10 

--UPDATE THE LOGICAL FILE NAMES 
DECLARE @TEMPLATE varchar(500) 
DECLARE @SCRIPT varchar(500) 
SET @TEMPLATE = N'ALTER DATABASE [{DBNAME}] MODIFY FILE (NAME = [{OLD}], NEWNAME = [{NEW}])' 
SET @SCRIPT = REPLACE(REPLACE(REPLACE(@TEMPLATE, '{DBNAME}', @DESTINATIONDB),'{OLD}',@SOURCEDB),'{NEW}',@DESTINATIONDB) 
EXEC(@SCRIPT) 
SET @SCRIPT = REPLACE(REPLACE(REPLACE(@TEMPLATE, '{DBNAME}', @DESTINATIONDB),'{OLD}',@SOURCEDBLOG),'{NEW}',@DESTINATIONDBLOG) 
EXEC(@SCRIPT) 
관련 문제