프로덕션 환경에서 테스트 데이터베이스 내의 일부 테이블 만 새로 고치는 가장 좋은 방법은 무엇입니까?


12

SQL Server 2008R2에는 매우 큰 프로덕션 데이터베이스와 매우 큰 테스트 환경 데이터베이스가 있습니다. 두 데이터베이스 모두 유사한 테이블 구조를 갖지만 사용자 / 로그인 / 권한 / 역할은 다릅니다.

프로덕션 환경에서 한 달에 한 번 테스트 데이터베이스에서 몇 개의 테이블 만 새로 고쳐야합니다.

내가 이것을 계획하고있는 현재의 방법은

  1. BCP 유틸리티를 사용하여 프로덕션에서 필요한 테이블을 내 보냅니다.
  2. bcp 내보내기 파일을 테스트 서버에 복사
  3. Test에서 새로 고치는 모든 테이블에서 인덱스 및 제약 조건을 비활성화하십시오.
  4. 테스트 데이터베이스 테이블 자르기
  5. BCP를 사용하여 데이터를 테스트 데이터베이스 테이블로 다시로드하십시오.
  6. Test에서 인덱스 재 구축 및 제약 조건 재 활성화

이 작은 작업에는이 모든 것이 너무 복잡해 보입니다. 또한 많은 리두를 생성하는 것처럼 보입니다 (t-log에서) 이것을 수행하는 더 좋은 방법이 있습니까?

내가 생각한 또 다른 방법은 프로덕션 환경에서 테스트 환경으로 백업을 복원하는 것입니다. 그러나 내가 가진 문제는 전체 백업이 상당히 클 수 있으며 모든 테이블을 새로 고칠 필요가 없다는 것입니다. 또한 프로덕션 데이터베이스의 사용자 및 보안은 테스트와 다릅니다. 전체 데이터베이스를 복원하면 프로덕션 데이터베이스의 보안 설정으로 덮어 씁니다.


답변:


4

귀하의 필요에 맞는 두 가지 방법이 있습니다.

(참고 : 테이블이 외래 키로 참조되면을 사용할 수 없습니다 TRUNCATE. 청크 에서 삭제 해야합니다 . 또는 모든 인덱스 + 외래 키를 삭제하고 데이터를로드 한 다음 다시 만들 수 있습니다).

  • BCP OUT 및 BULK INSERT INTO 대상 데이터베이스 .

    • 테스트 데이터베이스를 단순 / 대량 로그 복구 모드로 설정하십시오.
    • 추적 플래그 610 사용-색인화 된 테이블에 최소한으로 기록 된 삽입.

      /************************************************************************************************************************************************
      Author      :   KIN SHAH    *********************************************************************************************************************
      Purpose     :   Move data from one server to another*********************************************************************************************
      DATE        :   05-28-2013  *********************************************************************************************************************
      Version     :   1.0.0   *************************************************************************************************************************
      RDBMS       :   MS SQL Server 2008R2 and 2012   *************************************************************************************************
      *************************************************************************************************************************************************/
      
      -- save below output in a bat file by executing below in SSMS in TEXT mode
      -- clean up: create a bat file with this command --> del D:\BCP_OUT\*.dat 
      
      select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" '-- path to BCP.exe
              +  QUOTENAME(DB_NAME())+ '.'                                    -- Current Database
              +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
              +  QUOTENAME(name)  
              +  ' out D:\BCP_OUT\'                                           -- Path where BCP out files will be stored
              +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
              +  REPLACE(name,' ','') 
              + '.dat -T -E -SSERVERNAME\INSTANCE -n'                         -- ServerName, -E will take care of Identity, -n is for Native Format
      from sys.tables
      where is_ms_shipped = 0 and name <> 'sysdiagrams'                       -- sysdiagrams is classified my MS as UserTable and we dont want it
      and schema_name(schema_id) <> 'some_schema_exclude'                     -- Optional to exclude any schema 
      order by schema_name(schema_id)                         
      
      
      
      --- Execute this on the destination server.database from SSMS.
      --- Make sure the change the @Destdbname and the bcp out path as per your environment.
      
      declare @Destdbname sysname
      set @Destdbname = 'destination_database_Name'               -- Destination Database Name where you want to Bulk Insert in
      select 'BULK INSERT '                                       -- Remember Tables **must** be present on destination Database
              +  QUOTENAME(@Destdbname)+ '.'
              +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.' 
              +  QUOTENAME(name) 
              + ' from ''D:\BCP_OUT\'                             -- Change here for bcp out path
              +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'
              +  REPLACE(name,' ','') 
              +'.dat'' 
              with (
              KEEPIDENTITY,
              DATAFILETYPE = ''native'',  
              TABLOCK
              )'  + char(10) 
              + 'print ''Bulk insert for '+REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'+  REPLACE(name,' ','')+' is done... '''+ char(10)+'go' 
      from sys.tables
      where is_ms_shipped = 0 and name <> 'sysdiagrams'           -- sysdiagrams is classified my MS as UserTable and we dont want it
      and schema_name(schema_id) <> 'some_schema_exclude'         -- Optional to exclude any schema 
      order by schema_name(schema_id)

-

  • 방법 2 : SSIS-이 경우 선호하는 방법입니다.

    • 디스크 스테이징이 필요하지 않습니다. 모든 처리는 메모리에서 수행됩니다.
    • 매달 SQL 에이전트 작업을 사용하여 SSIS 패키지를 예약하여 PROD에서 TEST 서버로 테이블 새로 고침을 자동화 할 수 있습니다.
    • " 빠른로드 "옵션을 선택하십시오
    • 배치 번호 당 올바른 행을 선택해야합니다 (너무 높은 값을 선택하면 잠금 에스컬레이션이 발생 함-5K보다 낮게 유지)

참조 : 데이터로드 성능 안내서내 대답-테이블에 삽입 선택 * 테이블에서 대량 삽입으로


1
SSIS는 확실히 여기가는 길입니다. 데이터 펌핑은 설계된 것입니다.
Steve Mangiameli

3

백업 및 복원을 수행하거나 외부 프로세스 (예 : BCP)를 호출 / 조정하거나 SSIS를 망칠 필요가 없습니다 (매우 강력하고 매우 멋지지만 피할 수 있다면 확실히 할 것입니다). SQL 에이전트를 통해 예약 할 수있는 저장 프로시 저나 한 달에 한 번 실행하는 스크립트 (프로세스에서 예약하고 예약 작업이 오래 걸리지 않지만)를 통해 T-SQL에서 편하게 모든 것을 처리 할 수 ​​있습니다. 운영). 어떻게? SqlBulkCopyBCP 호출의 번거 로움없이 본질적으로 BCP이므로 .NET 의 클래스에 액세스하기 위해 SQLCLR을 사용합니다 . 직접 코딩 할 수 있습니다.SqlBulkCopy클래스는 거의 모든 것을 처리합니다 (트리거 크기, 트리거 발생 여부 등을 설정할 수 있음). 또는 어셈블리 컴파일 및 배포를 망설이지 않으 려면 SQL # SQLCLR 라이브러리 의 일부인 DB_BulkCopy 와 같은 사전 구축 된 SQLCLR 저장 프로 시저를 사용할 수 있습니다 (저는 필자이지만 절차는 무료 버전에 있습니다). 다음 답변에서 DB_BulkCopy 사용 예를 포함하여 이것을 자세히 설명합니다 .

한 데이터베이스에서 다른 스크립트로 데이터 가져 오기

현재 계획에서 어디에 배치해야할지 확실하지 않은 경우 다음을 수행하십시오.

  • 1 단계와 2 단계 제거 (woo hoo!)
  • 5 단계 EXECDB_BulkCopy 또는 코드를 직접 코딩하는 경우 호출하는 모든 것으로 바꾸 십시오. 데이터는 지점 A에서 지점 B로 이동합니다.

또한, 지적되어야 SqlBulkCopy하고 DB_BulkCopy :

  • 결과 집합을 받아 들일 수 있음 : 저장 프로 시저의 SELECT 또는 EXEC인지는 중요하지 않습니다.
  • 이러한 테이블 중 하나를 스키마로 변경하면 업데이트가 매우 쉽습니다. 이 SQLCLR 저장 프로 시저를 호출하는 저장 프로 시저에서 쿼리를 변경하십시오.
  • 필요한 경우 필드를 다시 매핑 할 수 있습니다.

SqlBulkCopy를 통한 최소 로깅 작업 관련 업데이트

최소한으로 기록 된 작업을 얻을 수 있지만 다음을 알아야합니다.

  • TableLock 대량 복사 옵션 을 사용해야합니다
  • 이렇게하면 클러스터형 인덱스가있는 테이블의 경우 먼저 데이터를로드 [tempdb]한 다음 순서대로 삽입을 대상에 수행합니다. 따라서 tempdb (데이터 및 로그 파일)에 대한 물리적 I / O와 정렬 작업 ( ORDER BY최소로 기록 된 작업을 가져 오기 위해 필요한 작업으로 인해) 측면에서 추가로드가 발생합니다.
  • 일부 테스트는 여기에 결과 : 백서 : SqlBulkCopy의 성능
  • 일부 테스트 결과는 다음과 같습니다. SqlBulkCopy가 최소 로깅을 수행하지 않는 문제 해결
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.