트랜잭션 복제에 대한 고려 사항

트랜잭션 복제에 대한 고려 사항은 다음과 같습니다.

  • 트랜잭션 로그 공간

  • 배포 데이터베이스의 디스크 공간

  • 게시된 각 테이블에 대한 기본 키

  • 트리거

  • LOB(Large Object) 데이터 형식

  • 업데이트할 수 있는 구독(사용되는 경우). 업데이트할 수 있는 구독의 고려 사항에 대한 자세한 내용은 트랜잭션 복제를 위한 업데이트 가능 구독을 참조하십시오.

트랜잭션 로그 공간

트랜잭션 복제를 사용하여 게시될 각 데이터베이스에 대해 충분한 공간이 트랜잭션 로그에 할당되어 있는지 확인합니다. 로그 레코드는 배포 데이터베이스로 이동될 때까지 잘리지 않기 때문에 게시된 데이터베이스의 트랜잭션 로그에는 게시되지 않은 동일한 데이터베이스의 로그보다 더 많은 공간이 필요할 수 있습니다.

배포 데이터베이스를 사용할 수 없거나 로그 판독기 에이전트가 실행되고 있지 않는 경우 게시 데이터베이스의 트랜잭션 로그는 계속 증가합니다. 배포 데이터베이스에 배달되지 않은 가장 오래 전에 게시된 트랜잭션 이후에는 로그를 자를 수 없습니다. 트랜잭션 로그 파일이 자동 증가하도록 설정하는 것이 좋습니다. 이렇게 하면 로그가 이러한 상황에서도 대처할 수 있습니다. 자세한 내용은 CREATE DATABASE(Transact-SQL)ALTER DATABASE(Transact-SQL)를 참조하십시오.

배포 데이터베이스에서 sync with backup 옵션을 설정하는 것이 좋습니다. 이렇게 하면 배포 데이터베이스에 있는 해당 트랜잭션이 백업될 때까지 게시 데이터베이스에 있는 로그의 잘림이 지연됩니다. 이로 인해 게시 데이터베이스의 트랜잭션 로그가 더 커질 수 있습니다. 이 옵션에 대한 자세한 내용은 스냅숏 및 트랜잭션 복제의 백업 및 복원을 위한 전략을 참조하십시오.

배포 데이터베이스의 디스크 공간

복제된 트랜잭션을 저장하기에 충분한 공간이 배포 데이터베이스에 있는지 확인합니다.

  • 구독자에서 스냅숏 파일을 즉시 사용할 수 있도록 설정하지 않으면(기본값) 트랜잭션이 모든 구독자에게 복제될 때까지 또는 보존 기간이 초과될 때까지 중 덜 오래 걸리는 작업이 완료될 때까지 트랜잭션이 저장됩니다.

  • 트랜잭션 게시를 만들고 구독자에서 스냅숏 파일을 즉시 사용할 수 있도록 설정하면 트랜잭션이 모든 구독자에게 복제될 때까지 또는 스냅숏 에이전트가 실행되고 새 스냅숏을 만들 때까지 중 더 오래 걸리는 작업이 완료될 때까지 트랜잭션이 저장됩니다. 스냅숏 에이전트 실행 사이에 경과된 시간이 게시에 대한 최대 배포 보존 기간(기본값: 72시간)보다 긴 경우 보존 기간보다 오래된 트랜잭션은 배포 데이터베이스에서 제거됩니다. 자세한 내용은 구독 만료 및 비활성화를 참조하십시오.

구독자에서 스냅숏 파일을 즉시 사용할 수 있도록 설정하면 새 구독자가 게시에 액세스하는 속도가 향상되지만 이로 인해 배포 데이터베이스에 대한 디스크 용량이 증가될 수 있습니다. 또한 스냅숏 에이전트가 실행될 때마다 새 스냅숏이 생성됩니다. 이 옵션을 사용하지 않으면 새 구독이 있는 경우에만 새 스냅숏이 생성됩니다.

게시된 각 테이블에 대한 기본 키

트랜잭션 복제에서 모든 게시된 테이블에는 선언된 기본 키가 포함되어야 합니다. Transact-SQL 문인 ALTER TABLE(Transact-SQL)을 사용하여 기본 키를 추가하면 게시를 위해 기존 테이블을 준비할 수 있습니다.

트리거

구독 데이터베이스에서 트리거를 사용하는 경우 다음 사항에 유의하십시오.

  • 기본적으로 XACT_ABORT 설정이 ON인 상태로 트리거가 실행됩니다. 배포 에이전트가 구독자에서 변경 내용을 적용하는 동안 트리거 내의 문에 오류가 발생하면 개별 문이 아닌 일괄 변경 전체가 실패합니다. 트랜잭션 복제에서 배포 에이전트의 -SkipErrors 매개 변수를 사용하여 오류 발생 문을 건너뛸 수 있습니다. XACT_ABORT가 ON인 상태로 -SkipErrors를 사용하면 문에 오류가 발생할 경우 일괄 변경 전체가 생략됩니다. 트리거에서 XACT_ABORT를 ON으로 설정해야 하는 경우가 아니면 -SkipErrors 매개 변수 사용 시에는 이 옵션을 OFF로 설정하는 것이 좋습니다. 이 옵션을 해제하려면 트리거 정의에서 SET XACT_ABORT OFF를 지정합니다. XACT_ABORT에 대한 자세한 내용은 SET XACT_ABORT(Transact-SQL)를 참조하십시오. -SkipErrors 매개 변수에 대한 자세한 내용은 트랜잭션 복제의 오류 건너뛰기를 참조하십시오.

  • 구독자에서는 트리거에 명시적 트랜잭션을 포함하지 않는 것이 좋습니다. 트랜잭션 복제는 트랜잭션 일괄 처리를 사용하여 네트워크 왕복을 줄이고 그 결과 성능이 향상됩니다. ROLLBACK 문을 포함하는 트리거를 구독자에 추가하면 트랜잭션의 일괄 처리가 취소될 수 있고 서버 오류 266(EXECUTE 후 트랜잭션 개수는 COMMIT 또는 ROLLBACK TRANSACTION 문이 없음을 나타냅니다. 이전 개수 = %ld, 현재 개수 = %ld)이 발생할 수 있습니다. 일괄 처리는 여러 트랜잭션의 명령을 포함하거나 게시자에서 큰 트랜잭션의 일부일 수 있으므로 트랜잭션을 롤백하면 트랜잭션 무결성이 손상될 수 있습니다.

    명시적 트랜잭션을 포함시키는 경우에는 트리거의 모든 COMMIT 문에 해당하는 BEGIN TRANSACTION 문이 있는지 확인합니다. COMMIT에 해당하는 BEGIN TRANSACTION이 없으면 구독자에 대한 행 변경 내용이 비트랜잭션 방식으로 적용됩니다. 또한 배포 에이전트에 서버 오류 266이 발생하고 트랜잭션이나 명령 일괄 처리를 롤백하여 다시 적용하려는 경우 나중에 오류가 발생할 수 있습니다. 에이전트가 이미 적용된 명령을 적용하면 중복 키 오류가 발생합니다.

트리거에 대한 자세한 내용은 NOT FOR REPLICATION으로 제약 조건, ID 및 트리거 제어를 참조하십시오.

LOB(Large Object) 데이터 형식

트랜잭션 복제는 LOB 게시를 지원하고 LOB 열에서 부분 업데이트를 수행합니다. LOB 열이 업데이트된 경우 열에 있는 모든 데이터 대신 변경된 데이터 조각만 복제됩니다.

게시된 테이블에 LOB이 포함된 경우 -UseOledbStreaming, -OledbStreamThreshold-PacketSize와 같은 배포 에이전트 매개 변수를 사용하십시오. 이러한 매개 변수를 설정하는 가장 간단한 방법은 OLEDB 스트리밍에 대한 배포 프로필이라는 배포 에이전트 프로필을 사용하는 것입니다. 자세한 내용은 복제 에이전트 프로필을 참조하십시오. 미리 정의된 이러한 프로필 외에도 생성 또는 수정하는 에이전트 프로필이나 명령줄에서 매개 변수를 지정할 수 있습니다. 자세한 내용은 아래의 항목을 참조하십시오.

text, ntext 및 image 데이터 형식

트랜잭션 게시에서 text, ntext 및 image 데이터 형식을 복제할 때는 고려해야 할 사항이 많습니다. text, ntext 및 image 데이터 형식 대신 각각 varchar(max), nvarchar(max), varbinary(max)를 사용할 것을 권장합니다.

text, ntext 또는 image를 사용하는 경우에는 다음 사항에 유의하십시오.

  • WRITETEXT 및 UPDATETEXT 문을 명시적 트랜잭션에 포함시켜야 합니다.

  • 게시된 테이블의 WITH LOG 옵션과 함께 WRITETEXT 및 UPDATETEXT를 사용하여 로그된 텍스트 작업을 복제할 수 있습니다. 트랜잭션 복제는 트랜잭션 로그의 변경 내용을 추적하므로 WITH LOG 옵션이 필요합니다.

  • 모든 구독자가 SQL Server를 실행하는 경우에만 UPDATETEXT 작업을 사용할 수 있습니다. WRITETEXT 작업은 UPDATE 문으로 복제되므로 비-SQL Server(Non-SQL Server) 구독자에서도 사용될 수 있습니다.

  • 구성할 수 있는 매개 변수인 max text repl size는 복제할 수 있는 text, ntext, varchar(max), nvarchar(max) 및 image 데이터의 최대 크기(바이트)를 제어합니다. 따라서 ODBC 드라이버 및 OLE DB 공급자, 이러한 데이터 형식의 큰 값을 처리할 수 없는 SQL Server 데이터베이스 엔진의 인스턴스, 시스템 리소스(가상 메모리) 제약 조건이 있는 배포자가 지원됩니다. 이러한 데이터 형식의 열이 게시되고 INSERT, UPDATE, WRITETEXT 또는 UPDATETEXT 작업이 구성된 제한을 초과하여 실행되면 작업은 실패합니다.

    sp_configure(Transact-SQL) 시스템 저장 프로시저를 사용하여 max text repl size 매개 변수를 설정할 수 있습니다.

  • text, ntext 및 image 열을 게시할 때는 같은 트랜잭션 내에서 UPDATETEXT 또는 WRITETEXT 작업을 사용하여 텍스트 포인터를 검색해야 합니다. 이때 해당 작업은 데이터베이스에서 읽기를 반복합니다. 예를 들어 하나의 트랜잭션에서 검색한 텍스트 포인터를 다른 트랜잭션에 사용하지 않습니다. 위치가 이동되었거나 유효하지 않을 수 있습니다.

    또한 텍스트 포인터를 가져올 경우 UPDATETEXT 또는 WRITETEXT 문을 실행하기 전 텍스트 포인터가 가리킨 텍스트 위치를 변경할 수 있는 어떤 작업(기본 키 업데이트 등)도 수행해서는 안 됩니다.

    다음은 복제될 데이터와 함께 UPDATETEXT 및 WRITETEXT 작업을 사용할 때 권장되는 방법입니다.

    1. 트랜잭션을 시작합니다.

    2. REPEATABLE READ 격리 수준과 함께 TEXTPTR() 함수를 사용하여 텍스트 포인터를 가져옵니다.

    3. UPDATETEXT 또는 WRITETEXT 작업에서 텍스트 포인터를 사용합니다.

    4. 트랜잭션을 커밋합니다.

      [!참고]

      같은 트랜잭션에서 텍스트 포인터를 가져오지 못하면 수정 내용은 게시자에서 허용되지만 변경 내용은 구독자로 게시되지 않습니다.

    예를 들면 다음과 같습니다.

    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
    BEGIN TRAN
    DECLARE @mytextptr varbinary(16)
    SELECT @mytextptr = textptr(Notes)
    FROM Employees 
    WHERE EmployeeID = '7'
    IF @mytextptr IS NOT NULL 
    BEGIN
    UPDATETEXT Employees.Notes @mytextptr 0 NULL 'Terrific job this review period.'
    -- Dummy update to fire trigger that will update metadata and ensure the update gets propagated to other Subscribers.
    UPDATE Employees 
    -- Set value equal to itself.
    SET Notes = Notes
    WHERE EmployeeID = '7' 
    END
    COMMIT TRAN 
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    

[!참고]

이 예는 기본적으로 설치되지 않는 Northwind 데이터베이스를 기반으로 합니다. 이 데이터베이스를 설치하는 방법은 Microsoft 다운로드 센터에서 Northwind 및 pubs 예제 데이터베이스를 참조하십시오.

구독자 데이터베이스의 크기 조정 시 고려 사항은 복제된 text, ntext 및 image 열의 텍스트 포인터가 게시자에서 초기화되지 않을 때에도 구독자 테이블에서 초기화되어야 한다는 것입니다. 결과적으로 배포 작업으로 구독자 테이블에 추가된 각 text, ntext 및 image 열은 내용이 없어도 적어도 43바이트의 데이터베이스 저장소를 사용합니다.