SQL Server 샌드 박스


9

보고서 개발자가 작업 할 수 있도록 샌드 박스를 설정하려고합니다. 현재 계획은 매일 저녁 데이터베이스를 "재설정"하는 것이지만 어떻게해야할지 잘 모르겠습니다. 재설정의 의미는 서버의 하나의 데이터베이스를 제외한 모든 사용자 테이블, 뷰, 저장 프로 시저 등을 본질적으로 삭제하려는 것입니다. 또 다른 옵션은 데이터베이스를 삭제하고 다시 작성하는 것이라고 가정하지만 적절한 모든 AD 그룹 / 사람에게 액세스 권한을 다시 부여한다는 것을 확신합니다.

나는 이것을하기위한 가장 좋은 방법이 무엇인지 정말로 모른다. 그래서 나는 당신 중 일부가 좋은 아이디어 / 제안을 제공 할 수 있기를 바랍니다. 감사.

명확성을 위해 기본적으로 http://try.discourse.org/t/this-site-is-a-sandbox-it-is-reset-every-day/57 데이터베이스에서이 작업을 수행하려고합니다 . 유일한 차이점은 우리가 매일 사용자를 다시 만들고 싶지 않다는 것입니다.

버전 : SQL Server 2008
Edition : 개발자 및 엔터프라이즈

답변:


8

또 다른 아이디어는 copy_only 백업을 수행하고 dev 서버 (또는 하나만있는 경우 동일한 서버)에 복원하는 야간 작업을 간단히 설정하는 것입니다. 이것에 대한 좋은 점은 복원이 모든 서버 (또는 여러 서버)로 이동할 수 있으며 기본 데이터베이스의 모든 활동과 완전히 분리 될 수 있다는 것입니다.

서버 1에서 :

BACKUP DATABASE db TO DISK = '\\someshare\file.bak' 
  WITH COPY_ONLY, INIT, COMPRESSION;

서버 2 :

RESTORE DATABASE db_dev FROM DISK = '\\someshare\file.bak'
  WITH REPLACE, RECOVERY;

MOVE서버 간의 디스크 레이아웃이 다르거 나 사본을 동일한 서버에 두는 경우 명령 을 추가해야 할 수도 있습니다 .

RESTORE DATABASE db_dev FROM DISK = '\\someshare\file.bak'
  WITH REPLACE, RECOVERY,
  MOVE 'data_file_name' TO 'D:\somepath\somefile.mdf',
  MOVE 'log_file_name'  TO 'E:\somepath\somefile.ldf';

동일한 서버에서 복원하는 경우 사용자에게 아무런 문제가 없습니다. 다른 서버로 복원하면 사용자는 존재하지만 서버 수준 로그인은 없을 수 있습니다. 이 문제를 해결하는 스크립트 와 SQL Server 2012 ( Contained Databases ) 의 새로운 기능으로 문제를 완전히 제거 할 수 있습니다.


우리는 dev / prod를 가지고 있지만 dev는 이것이 일어날 유일한 서버입니다. Prod는 즉시 준비된 프로세스에만 사용됩니다.
Kittoes0124

이것이 내가 선택하는 솔루션입니다. 대부분의 경우 프로덕션 환경을 단순히 프로덕션 환경으로 복사하고 싶지는 않습니다. 예를 들어 사용자의 전자 메일 주소, 연락처 세부 정보 등을 제거하거나 모호하게하는 조치 (스크립트?)를 준비하십시오. 개발자가 실수로 전자 메일을 사용자에게 보내지 않기를 바랍니다.
zeroDivisible

5

Enterprise Edition 엔진이있는 인스턴스가 있으므로 데이터베이스 스냅 샷을 사용 합니다 .

이를 통해 전체 데이터베이스를 복원하지 않고도 하루 동안 변경 한 내용을 빠르고 쉽게 롤백 할 수 있습니다.

개발자가 빅 데이터로드를 수행 할 계획이라면 (그렇지 않은 것처럼 들리는가?) 이것이 적절하지 않을 수 있습니다.


빅 데이터로드를 수행하는 것이 왜 적절하지 않습니까? 우리는 다음과 같이로드 할 수 있습니다. ... 언제나 100 개의 열에 대해 8 백만 개의 행이 (그런데 "하지 않아도"하더라도) 반드시 그렇게하지 못하도록하고 싶지는 않습니다. 우리가 정말로 염려하는 것은 하루가 끝날 때 모든 것이 마비된다는 것입니다.
Kittoes0124

2
소스 데이터가 변경 될 때 스냅 샷을 유지해야하므로 @Kittoes. 소스가 변경되면 소스에서 기존 페이지를 가져 와서 "전"보기를 유지해야합니다. 소스 데이터가 변경 될 때까지 (스냅 샷은 델타를 제외한 빈 스파 스 파일을 사용합니다) 그렇게하지 않습니다. 이 유지 보수는 상당히 비쌀 수 있습니다. 데이터베이스 스냅 샷 작동 방식을 참조하십시오 .
Aaron Bertrand

@AaronBertrand Ok, 하루 동안 데이터베이스가 8GB로 커지면 스냅 샷이 복원되면 모든 새 데이터가 제거되지만 데이터베이스 크기는 여전히 8GB입니까? 아니면 오해입니까?
Kittoes0124

@Kittoes 스냅 샷은 읽기 전용이므로 소스 데이터베이스에 새 데이터 만로드 할 수 있습니다. 하루 동안 8GB를 추가 하면 스냅 샷에 표시 되지 않습니다 . 스냅 샷을 되돌 리거나 삭제할 때 소스 데이터베이스에는 여전히 8GB의 데이터가 있으며 그에 따라 크기가 조정됩니다. 그런 다음 다른 스냅 샷을 만들면 새 데이터가 표시됩니다. 하루 동안 8GB를 제거 하면 스냅 샷에 추가 됩니다.
Aaron Bertrand

1
@Kittoes 스냅 샷이 생성 된 시점으로 되돌려 8GB 데이터로드를 취소하려는 경우 데이터 파일을 원래 크기로 되돌려 야합니다. 내일 8GB를 다시로드하면 더 많은 자동 증가가 또 다른 문제입니다). 그러나 나는 그 시나리오를 명시 적으로 테스트하지 않았습니다. 그리고 내가 언급 한 기사에서 언급했듯이 이것은 기본 저장소의 신뢰성에 달려 있기 때문에 반드시 바보 일 필요는 없습니다. 백업이 더 안전한 방법입니다.
Aaron Bertrand

0

그것이 당신에게 도움이되는지 확인하기 위해 몇 센트를 추가하겠습니다.

우리 회사에서는 매일 밤 개발자들이 하루 종일 사용하고있는 데이터베이스를 새로 고치려는 상황과 동일한 상황에 처해 있습니다. 이것은 우리가 Dev의 손길이 닿지 않는 데이터베이스 세트를 가지고 있음을 의미합니다 .A 와 정확한 사본 A 인 다른 데이터베이스 세트 는 말할 수 있지만 매일 밤 새로 고치기를 원합니다 .B라고 말합니다 . 이것은 하나의 단일 서버 인스턴스에서 발생합니다.

내가 구현 한 것은 이것을 달성하기위한 NIGHTLY RESTORE 프로세스입니다. 작동 방식은 다음과 같습니다.

매일 저녁 복원해야하는 데이터베이스 목록이있는 드라이버 테이블을 작성하십시오 (설명한대로).

테이블 : nightly_restore (OriginalDB, RestoreDB, 백업 위치, enabled_YN, 결과, PASS_FAIL)

그런 다음 위의 테이블에서 데이터베이스 목록을 반복하는 TSQL을 작성한 다음 복원을 수행하고 결과에 성공 및 실패를 기록하고 비트 1 = 패스 또는 0 = 실패를 기록 할 수 있습니다. Enabled_YN은 해당 데이터베이스를 복원해야하는지 여부를 결정합니다.

앞으로 추가 될 데이터베이스가 더 있으면 테이블에 데이터베이스를 삽입하고 enabled_YN 비트를 Y (활성화)로 설정하면됩니다.

이렇게하면 프로세스가보다 유연하고 관리 가능해집니다.

내가 작성한 SQL을 원한다면 (확실히 :-) 작성할 수 있습니다), 저를 핑하거나 주석을 추가하면 공유 할 것입니다.

HTH

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.