SQL Server : 복제에서 로그 리더가 작동하는지 확인하는 쿼리 및 재부팅 절차

10579 단어 SQLServer복제
가끔 로그 리더가 멈추기 때문에 상황 확인을 위한 쿼리를 정리해 둡니다.

로그 리더가 실행 중인지 확인 ①


use distribution

select count(*) from dbo.MSrepl_commands with(nolock)

push/pull 관계없이 게시자 측에서 실행합니다. 로그 리더가 읽은 복제 대상 명령을 저장하는 테이블이므로 몇 초에서 몇 분마다 값이 변경되었을 것입니다.

여기가 예를 들면 10분 정도 변화하지 않는 경우는 로그 리더가 정지하고 있거나, 데이터 갱신이 일절 되어 있지 않을 가능성이 있다.

로그 리더가 실행 중인지 확인 ②


select top 10 last_request_end_time, * from sys.dm_exec_sessions where program_name like '%logreader%'

게시자 측의 모든 DB에서 실행. 로그 리더에 대한 세션이 두 개 있어야 합니다.


last_request_end_time이 마지막으로 로그 리더가 실행된 날짜와 시간. 한쪽은 몇 분 단위로 밖에 가동하지 않지만, 한쪽은 몇 초 단위로 점점 가동 일시가 갱신되어 갈 것.

이 쿼리를 실행했을 때, last_request_end_time이 2행 모두 10분 이상 전이면, 로그 리더가 정지하고 있을 가능성을 의심한다.

성능 카운터에서 확인


select top 1000 * from sys.dm_os_performance_counters
where object_name like '%replication%'
and counter_name like '%cmds%'
--and instance_name in ('***')

퍼블리셔측에서 확인한다. cntr_value의 값이 변화하고 있으면 복제 움직이고 있다. 정상적으로 실행 중인 경우에도 이 카우 "프로세스가 실행 중이고 서버로부터의 응답을 기다리고 있습니다."라는 메시지가 남아 있습니다. 몇 분에 한 번 정도의 카운트업 빈도의 경우가 있었다. 그 때문에, 보조적인 정보로서 확인할 정도로 좋을지도.

로그 리더 에이전트 프로그램이 실행 중인지 확인




DB 서버에 로그인하고 작업 관리자에서 "legread.exe"가 "실행 중"인지 확인합니다.
로그 리더 에이전트를 중지하면 작업 관리자에서 사라집니다.

실제로 로그 리더가 멈출 때의 거동


-- 直近 6 時間の情報を取得
DECLARE @targetTime datetime
SET @targetTime = DATEADD(mm, -6, GETDATE())

SELECT
    dh.time,
    da.id,
    da.local_job,
    da.publication,
    pd.publisher_db,
    da.subscriber_db,
    da.name,
    da.subscriber_name,
    CASE dh.runstatus
        WHEN 1 THEN '開始'
        WHEN 2 THEN '成功'
        WHEN 3 THEN '実行中'
        WHEN 4 THEN 'アイドル'
        WHEN 5 THEN '再試行'
        WHEN 6 THEN '失敗'
    END AS runstatus,
    rt.entry_time,
    dh.start_time,
    dh.comments,
    dh.duration,
    dh.current_delivery_rate,
    dh.current_delivery_latency,
    dh.delivered_commands,
    dh.average_commands,
    dh.delivery_latency,
    dh.total_delivered_commands,
    dh.xact_seqno,
    dh.error_id
FROM
    distribution.dbo.MSrepl_transactions AS rt
    LEFT JOIN
    distribution.dbo.MSdistribution_history AS dh
    ON
    dh.xact_seqno = rt.xact_seqno
    LEFT JOIN
    distribution.dbo.MSpublisher_databases AS pd
    ON
    pd.id = rt.publisher_database_id
    LEFT JOIN
    distribution.dbo.MSdistribution_agents AS da
    ON
    da.id = dh.agent_id
WHERE
    dh.time IS NOT NULL
    AND
    dh.time >= @targetTime
ORDER BY
    dh.time DESC

SE 잡기 의 오자와씨에게 작성해 주셨습니다.


쿼리 실행 결과가 "프로세스가 실행 중이고 서버로부터의 응답을 기다리고 있습니다."라는 메시지가 남아 있습니다.

수동으로 로그 리더 에이전트를 다시 시작할 때의 포인트



중단되었다고 판단되면 로그 리더를 다시 시작해야 할 수 있습니다.
그 순서와 조심하는 포인트를 정리해 둡니다.

0. 다음 쿼리를 게시자 측 서버의 어느 DB에서도 좋기 때문에 실행. 2레코드 취할 수 있는지 확인
select top 10 * from sys.dm_exec_sessions where program_name like '%logreader%'

1. 에이전트 중지

2. 즉시 다시 시작하지 않고 다음 쿼리를 다시 실행합니다. 0 레코드가 되는 것을 확인.
select top 10 * from sys.dm_exec_sessions where program_name like '%logreader%'

→ 이때 일시적으로 1레코드만 취득할 수 있는(=곧은 정지하지 않는) 경우가 있다.

그 경우는 1-2분 기다려 다시 쿼리를 실행하면, 0 레코드가 된다(=완전 정지)

3. 에이전트 재개

재개 후, 일시적으로 로그 리더가 활발하게 가동하는 것으로 복제 에이전트 주위에서 블로킹이 일어나는 경우가 자주 있지만,
이 블로킹에 관해서는 기다리고 있으면 자연 해소되기 때문에 문제 없다.

좋은 웹페이지 즐겨찾기