Transactional replication(트 랜 잭 션 복사)트 랜 잭 션 을 건 너 뛰 는 방법 에 대한 자세 한 설명
이제 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 를 오픈 하면 됩 니 다.그 다음 에 업무 가 성공 적 으로 건 너 뛰 었 습 니 다.그 는 구독 단 에서 업데이트 되 지 않 고 후속 업 데 이 트 는 구독 으로 전달 되 며 지연 되 어 사라 집 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redis의 기본 복제이 기사에서는 Redis에서 복제하는 방법에 대해 간략하게 살펴보겠습니다. 그러나 수동으로 복제하는 방법을 배우면 일부 임시 백업 또는 디버깅에 도움이 됩니다. 이 기사에서는 docker와 docker compose...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.