Expired Subscription Clean Up
작업이 실패하는 경우는 주로 리플리케이션 구성 문제, 권한 부족, 데이터 손상, 내부 시스템 오류 때문입니다. 이 작업은 만료된 구독(subscription) 을 제거하는 역할을 하며, 리플리케이션을 유지관리하는 데 중요합니다.
✅ 주요 원인 및 해결 방법
1. 구독자 정보 손상 또는 일치하지 않음
MSsubscriptions
,MSreplication_subscriptions
테이블에 구독 정보가 손상되었거나 Publisher/Subscriber 간 메타데이터 불일치가 발생한 경우.
🛠️ 해결:
distribution
DB에서 손상된 구독 정보 확인.- 필요 시 수동으로 잘못된 레코드를 삭제하거나
sp_subscription_cleanup
사용.
2. 배포자(Distributor)에 잘못된 연결 또는 설정
- 배포자에서 Publisher 또는 Subscriber에 대한 연결 설정이 잘못되어 오류 발생.
🛠️ 해결:
sp_helpdistributor
,sp_helpdistributiondb
,sp_helpdistpublisher
등을 사용해 구성 확인.linked server
설정 문제 확인.
3. 에이전트 권한 부족
- SQL Server Agent 계정 또는 실행 계정이 필요한 권한(예:
db_owner
)을 가지고 있지 않음.
🛠️ 해결:
- SQL Agent 작업을 실행하는 계정에
distribution
DB에 대한 충분한 권한 부여. - SSMS에서 작업 속성 →
Steps
→ 실행 계정 확인.
4. 오래된/비정상적인 구독이 삭제되지 않음
- 일부 구독은 이미 수동으로 삭제되었지만, 관련 메타데이터가 남아 있어 작업이 실패함.
🛠️ 해결:
MSsubscriptions
,MSreplication_subscriptions
등의 테이블에서 orphan된 항목을 확인하고 수동 삭제 가능.- 예: sql복사편집
SELECT * FROM distribution.dbo.MSsubscriptions WHERE status = 0;
5. Job이 오래 걸려 Timeout 또는 Deadlock 발생
- 구독 수가 많거나 오래된 레코드가 많아 삭제 시 시간이 오래 걸려 Job이 Timeout됨.
🛠️ 해결:
- 작업 시간 늘리기 (Job 설정 → Advanced → Retry/Timeout 설정)
- 필요 시 구독을 분할하여 수동 정리
🔍 에러 메시지 예시별 원인
에러 메시지 | 원인 및 설명 |
---|---|
Cannot drop the subscription because it does not exist. | 구독이 이미 삭제되었는데 메타데이터가 남아있음 |
The subscription does not exist. | 위와 동일 |
The process could not execute 'sp_MSsubscription_cleanup' | 내부 프로시저 호출 실패, 권한 또는 데이터 손상 |
Timeout expired | 삭제 작업이 오래 걸려 시간 초과 |
Violation of PRIMARY KEY constraint | 삭제 과정에서 무결성 제약 위반 발생 |
✅ 확인 쿼리 예시
-- 배포자에서 만료된 구독 조회
USE distribution;
SELECT * FROM MSsubscriptions WHERE status = 0;
-- 만료된 구독 중 삭제 대상 확인
EXEC sp_replmonitorhelppublisher;
EXEC sp_replmonitorhelpsubscription;
🧼 수동 정리 방법 (주의 필요!)
⚠️ 항상 백업 후 진행하세요.
-- 수동 구독 삭제 예시
USE distribution;
DELETE FROM MSsubscriptions WHERE status = 0 AND subscriber_db = 'Your_SubDB_Name';
✳️ 권장 조치 순서
- SQL Agent Job > Expired Subscription Clean Up → 작업 히스토리 확인
distribution
DB 내 구독 관련 테이블 조회sp_replmonitorhelppublisher
,sp_replmonitorhelpsubscription
실행해 상태 점검- 필요 시 수동 정리 또는 리플리케이션 재설정 고려