트랜잭션 복제중에 'sp_replcmds'을 실행할 수 없습니다. 라는 오류 발생할때.

트랜잭션 복제중에 'sp_replcmds'를 실행할수 없다는 오류가 발생해다. (오류 번호 : 18759)
일단 뭔 내용인지 몰라서, help를 뒤져 sp_replcmds가 뭔지 부터 확인했다.

sp_replcmds 설명 내용중에 보면,
"텍스트 포인터가 같은 트랜잭션에서 검색되지 않아 sp_replcmds가 텍스트 명령을 복제할 수 없는 경우에는 경고 메시지 18759번이 Microsoft® SQL Server™ 오류 로그 및 Microsoft Windows® 응용 프로그램 로그에 모두 추가됩니다." 라는 오류 18759에 대한 내용이 있다.

이것을 참고로 해서 텍스트 포인터를 확인해 주는 textvalid()함수를 이용해서 , 복제중에 오류를 발생시키고 있는 table의 text, ntext, image 필드에 대한 텍스트 포인터 유효성을 확인 해보았다.
일부 데이타중에 텍스트 포인터가 유효하지 않은것이 있어 해당 필드들에 대해서 초기화(update시킴)를 시켜주고,
다시 복제를 초기화를 진행해 주었다.

계속 모니터링을 해봐야 하겠지만, 현재로서는 복제가 잘되고 있다.

복제 - 복제필드중 text, ntext, varchar(max), image 등에 대한 복제 문제 해결

복제를 구성하다보면,
text, image 필드 같이 큰값을 게시 해야 하는 경우가 있는데, 이경우 insert, update, writetext 또는 updatetext작업이 구성된 제한값을 초과해서 아래와 같은 오류를 발생시키기도 한다.

해결 방법은
서버 구성 정보 중에 "max text repl size" 매개 변수를 재설정해주면된다.

1. sp_configure 로 서버 구성확인

2. "max text repl size" 수정.

EXEC sp_configure 'max text repl size', 2147483647
Go
RECONFIGURE WITH OVERRIDE
Go

MS-SQL 복제에서 distribution cleanup이 지연될때


복제 서버를 운영하다 보면, 복제 데이타베이스 정리가 지연되어 데이타베이스 사이즈가 계속 증가하는 경우가 생긴다.

이때, 복제의 모니터의 기타에이전트 에서 "배포 정리:distribution" 이 잘 실행되고 있는지 확인을 하여 제대로 실행되지 않거나, 지연되고 있다면, 아래 처럼 수동으로 처리를 해준다.

1. msrepl_transactions, MSrepl_commands 테이블의 row수를 확인한다.

2. distribution cleanup job의 최근 실행시간을 확인해본다.

 

만약 row수가 많이 늘어나있고, job의 실행시간도 많이 지연되어 있다면

log reader agent를 일단 중지시키고 복제 트랜잭션의 max retention 시간을 줄여본다.

 

EXEC dbo.sp_MSdistribution_cleanup @min_distretention = 0, @max_distretention = ??

위 명령의 ? 부분이 보통 기본값(120??)으로 되어있을텐데 용도에 따라서 줄여본다.

나의 경우에는 처음에는 10으로 그 다음에는 2로 실행했다.

외국 뉴스그룹 같은 경우에는 0으로 하던데 그럴때는 아직 반영되지 않은 트랜잭션이

삭제될 수 있으므로 주의해야한다.

distribution cleanup job의 실행주기를 짧게(분 단위로..) 조정하고 기다리면 실행될 것이다.

 

만약 delete 작업이 오래 걸리는 것 같으면 DB의 복구모델이 simple인지 반드시 확인~!!