Transactional replication(트 랜 잭 션 복사)트 랜 잭 션 을 건 너 뛰 는 방법 에 대한 자세 한 설명

transactional replication 에 서 는 데이터 동기 화가 지연 되 는 경우 가 많다.때때로 이러한 지연 은 publication 에서 업 데 이 트 를 실 행 했 기 때 문 입 니 다.예 를 들 어 update ta set col=?Where ?,이 업 데 이 트 는 엄 청 난 데 이 터 를 포함 하고 있다.subscription 에서 이 업 데 이 트 는 여러 명령 으로 분해 되 어 subscription 에 적 용 됩 니 다.어 쩔 수 없 는 상황 에서 우 리 는 이 큰 일 을 뛰 어 넘 고 리 플 리 케 이 션 을 계속 실행 시 켜 야 한다.
이제 transactional replication 의 원리 와 구체 적 인 방법 을 소개 하 겠 습 니 다.
Publication database 의 article 이 업데이트 되면 해당 로그 가 생 깁 니 다.Log reader 는 이 로그 정 보 를 읽 고 Distribution 데이터베이스 에 기록 하 는 msrepltransactions 와 msreplcommands 중. 
Msrepl_transactions 의 모든 기록 에는 유일한 표지 xact 가 있 습 니 다.seqno,xact_seqno 대응 로그 의 LSN.그래서 xact 를 통 해seqno 는 publication database 에서 의 생 성 순 서 를 추정 합 니 다.번호 가 큰 생 성 시간 은 늦 고 번호 가 작은 생 성 시간 은 이 릅 니 다.
Distributionagent 는 두 개의 키 프로 세 스,reader 와 writer 를 포함 합 니 다.Reader 는 Distribution 데이터베이스 에서 데 이 터 를 읽 고 Writer 는 reader 가 읽 은 데 이 터 를 구독 데이터베이스 에 기록 합 니 다.
reader 는 sp 를 통 해MSget_repl_commands 에서 Distribution 데이터베이스 읽 기(Msrepl 읽 기)transactions 표 와 Msreplcommands 표)의 데이터
다음은 spMSget_repl_commands 의 매개 변수 정의

CREATE PROCEDURE sys.sp_MSget_repl_commands 

( 

@agent_id int, 

@last_xact_seqno varbinary(16), 

@get_count tinyint = 0, -- 0 = no count, 1 = cmd and tran (legacy), 2 = cmd only 

@compatibility_level int = 7000000, 

@subdb_version int = 0, 

@read_query_size int = -1 

) 

이 저장 과정 은 6 개의 매개 변수 가 있 습 니 다.Transactional replication 에 서 는 앞의 4 개 만 사용 합 니 다(또한 세 번 째 매개 변수 와 네 번 째 매개 변수의 값 은 고정 적 으로 변 하지 않 습 니 다.각각 0 과 10000000).다음은 하나의 예 이다.
execsp_MSget_repl_commands 46,0x0010630F000002A900EA00000000,0,10000000
@agent_id 는 Distributionagentid 를 표시 합 니 다.구독 할 때마다 하나의 단독 Distributionagent 가 데 이 터 를 처리 합 니 다.@agent 가 져 오기id 후 구독 에 대응 하 는 Publication 과 모든 article 를 찾 을 수 있 습 니 다.
@last_xact_seqno 는 지난번 에 구독 한 LSN 에 전달 되 었 음 을 표시 합 니 다.
대체적인 논 리 는:Reader 읽 기 subscription database 의 MSreplicationsubscriptions 표 의 transactiontimestamp 열 은 업 데 이 트 된 지난번 LSN 번 호 를 얻 은 다음 배포 데이터베이스 에서 LSN 이 이 번호 보다 큰 데 이 터 를 읽 습 니 다.Writer 는 읽 은 데 이 터 를 구독 에 기록 하고 MSreplication 을 업데이트 합 니 다.subscriptions 표 의 transactiontimestamp 열.그리고 Reader 는 계속해서 새로운 LSN 으로 후속 데 이 터 를 읽 고 Writer 에 전달 합 니 다.
하면,만약,만약...timestamp 열,이 값 을 현재 실행 중인 큰 업무 의 LSN 으로 설정 하면 distribution 에이전트 는 이 큰 사 무 를 읽 지 않 고 건 너 뜁 니 다.
다음은 실례 를 들 어 보 여 드 리 겠 습 니 다.
환경 은 다음 과 같다.
Publisher: SQL108W2K8R21
Distributor: SQL108W2K8R22
Subscriber: SQL108W2K8R23

그림 속 하 이 라이트 Publication 에는 aritcles,ta,tb,tc 3 개가 포함 되 어 있다.
그 중 에 18,218,200 만 데 이 터 를 포함 하고 있 습 니 다.그리고 저희 가 조작 을 해 봤 습 니 다.
11:00 에 업데이트 문 구 를 진행 하 였 습 니 다.
update ta set c=-11
표 타,tb,tc 에 대한 추가 삽입 작업 을 수행 합 니 다.
insert tb values(0,0)
insert tc values(0,0)
그 후에 우 리 는 replication monitor 를 시작 하 였 는데,매우 큰 지연 이 있 음 을 발견 하 였 으 며,distribution 에이전트 는 a)작업 으로 인해 발생 한 데 이 터 를 계속 전달 하고 있 음 을 발견 하 였 다.


subscription database 에서 아래 문 구 를 실행 하여 현재 최신 기록 의 트 랜 잭 션 번 호 를 얻 습 니 다.

declare @publisher sysname 

declare @publicationDB sysname 

declare @publication sysname 

set @publisher='SQL108W2K8R22' 

set @publicationDB='pubdb' 

set @publication='pubdbtest2'

select transaction_timestamp From MSreplication_subscriptions 

where 

publisher=@publisher and 

publisher_db=@publicationDB and 

publication=@publication 

나의 환경 에서 사무 번 호 는 0x 00000149000004E9A 00040000000000 이다.
distributiondatabase 로 돌아 가 아래 문 구 를 실행 하고 큰 사무 뒤에 있 는 사무 번 호 를 얻 습 니 다.실제 환경 에서 의 데이터 로 인 자 를 바 꾸 십시오.(다음 문 구 를 실행 하 는 데 성능 문제 가 발생 하면 파 라 메 터 를 직접 값 으로 바 꾸 십시오)

declare @publisher sysname 

declare @publicationDB sysname 

declare @publication sysname 

declare @transaction_timestamp [varbinary](16) 

set @publisher='SQL108W2K8R21' 

set @publicationDB='publicationdb2' 

set @publication='pubtest' 

set @transaction_timestamp= 0x0000014900004E9A0004000000000000

select top 1 xact_seqno from MSrepl_commands with (nolock) where xact_seqno>@transaction_timestamp and 

article_id in ( 

  select article_id From MSarticles a inner join MSpublications p on a.publication_id=p.publication_id and a.publisher_id=p.publisher_id and a.publisher_db=p.publisher_db 

  inner join sys.servers s on s.server_id=p.publisher_id 

  where p.publication=@publication and p.publisher_db=@publicationDB and s.name=@publisher 

) 

and publisher_database_id =( 

    select id From MSpublisher_databases pd inner join MSpublications p on pd.publisher_id=p.publisher_id 

    inner join sys.servers s on pd.publisher_id=s.server_id and pd.publisher_db=p.publisher_db 

    where s.name=@publisher and p.publication=@publication and pd.publisher_db=@publicationDB 

) 

Order by xact_seqno

내 환경 에서 사무 번 호 는 0x 0000018C 0000001000171 이다.
subscription database 에서 다음 문 구 를 실행 하고 큰 사 무 를 건 너 뜁 니 다.매개 변 수 를 실제 환경 에서 의 데이터 로 바 꾸 십시오.

declare @publisher sysname

declare @publicationDB sysname 

declare @publication sysname 

declare @transaction_timestamp [varbinary](16) 

set @publisher='SQL108W2K8R22' 

set @publicationDB='pubdb' 

set @publication='pubdbtest2' 

set @transaction_timestamp= 0x0000018C000001000171

update MSreplication_subscriptions set transaction_timestamp=@transaction_timestamp 

where publisher=@publisher and publisher_db=@publicationDB and publication=@publication 

실행 완료 후 distribution agent job 를 오픈 하면 됩 니 다.
그 다음 에 업무 가 성공 적 으로 건 너 뛰 었 습 니 다.그 는 구독 단 에서 업데이트 되 지 않 고 후속 업 데 이 트 는 구독 으로 전달 되 며 지연 되 어 사라 집 니 다.

좋은 웹페이지 즐겨찾기