Загрузка данных
USE [distribution];
SET NOCOUNT ON;
DECLARE @sample int = 1;
WHILE @sample <= 2
BEGIN
SELECT
N'00_SAMPLE' AS section,
@sample AS sample_no,
SYSDATETIME() AS captured_at,
@@SERVERNAME AS server_name;
-- 1. Размер очереди именно нужной подписки.
EXEC dbo.sp_replmonitorsubscriptionpendingcmds
@publisher = N'WIN-5ODCFIGQRP3\SQL2016SQL',
@publisher_db = N'myNewVasya',
@publication = N'V3Trans',
@subscriber = N'WIN-5ODCFIGQRP3\SQL2016SQL',
@subscriber_db = N'replTransVas',
@subscription_type = 0;
-- 2. Последние сообщения Distribution Agent.
-- delivered_commands сравниваем только внутри одного start_time.
SELECT
N'01_DISTRIBUTION' AS section,
a.id AS agent_id,
a.name AS agent_name,
a.subscriber_db,
h.[time] AS history_time,
h.start_time,
h.runstatus,
CASE h.runstatus
WHEN 1 THEN N'START'
WHEN 2 THEN N'SUCCEED'
WHEN 3 THEN N'IN_PROGRESS'
WHEN 4 THEN N'IDLE'
WHEN 5 THEN N'RETRY'
WHEN 6 THEN N'FAIL'
END AS agent_status,
h.delivered_commands,
h.current_delivery_rate AS commands_per_second,
h.error_id,
h.comments
FROM dbo.MSdistribution_agents AS a
CROSS APPLY
(
SELECT TOP (15) hh.*
FROM dbo.MSdistribution_history AS hh
WHERE hh.agent_id = a.id
ORDER BY hh.[time] DESC
) AS h
WHERE a.publisher_db = N'myNewVasya'
AND a.publication = N'V3Trans'
AND a.subscriber_db = N'replTransVas'
ORDER BY a.id, h.[time] DESC;
-- 3. История чтения журнала основной базы.
SELECT
N'02_LOG_READER' AS section,
a.name AS agent_name,
h.[time] AS history_time,
h.runstatus,
h.delivered_commands,
h.delivery_rate,
h.error_id,
h.comments
FROM dbo.MSlogreader_agents AS a
CROSS APPLY
(
SELECT TOP (10) hh.*
FROM dbo.MSlogreader_history AS hh
WHERE hh.agent_id = a.id
ORDER BY hh.[time] DESC
) AS h
WHERE a.publisher_db = N'myNewVasya'
ORDER BY a.id, h.[time] DESC;
-- 4. Текущие запросы, ожидания и непосредственные блокировщики.
;WITH relevant AS
(
SELECT s.session_id
FROM sys.dm_exec_sessions AS s
LEFT JOIN sys.dm_exec_requests AS r
ON r.session_id = s.session_id
WHERE s.session_id <> @@SPID
AND
(
s.program_name LIKE N'%Repl%'
OR s.program_name LIKE N'%V3Trans%'
OR r.database_id IN
(
DB_ID(N'myNewVasya'),
DB_ID(N'replTransVas'),
DB_ID(N'distribution')
)
)
),
wanted AS
(
SELECT session_id FROM relevant
UNION
SELECT r.blocking_session_id
FROM sys.dm_exec_requests AS r
JOIN relevant AS x ON x.session_id = r.session_id
WHERE r.blocking_session_id > 0
)
SELECT
N'03_REQUESTS_AND_BLOCKERS' AS section,
s.session_id,
s.program_name,
s.login_name,
s.status AS session_status,
DB_NAME(r.database_id) AS database_name,
r.status AS request_status,
r.command,
r.blocking_session_id,
r.wait_type,
r.wait_time AS wait_ms,
r.wait_resource,
r.total_elapsed_time AS elapsed_ms,
r.cpu_time AS request_cpu_ms,
r.logical_reads,
r.reads,
r.writes,
s.open_transaction_count,
CASE
WHEN r.sql_handle IS NOT NULL THEN
SUBSTRING(
txt.text,
r.statement_start_offset / 2 + 1,
(
CASE r.statement_end_offset
WHEN -1 THEN DATALENGTH(txt.text)
ELSE r.statement_end_offset
END - r.statement_start_offset
) / 2 + 1
)
ELSE txt.text
END AS current_or_last_sql
FROM wanted AS w
JOIN sys.dm_exec_sessions AS s
ON s.session_id = w.session_id
LEFT JOIN sys.dm_exec_requests AS r
ON r.session_id = s.session_id
LEFT JOIN sys.dm_exec_connections AS c
ON c.session_id = s.session_id
OUTER APPLY sys.dm_exec_sql_text(
COALESCE(r.sql_handle, c.most_recent_sql_handle)
) AS txt
ORDER BY r.blocking_session_id DESC, s.session_id;
-- 5. Состояние SQL Agent job нужной подписки.
SELECT
N'04_AGENT_JOB' AS section,
j.name,
j.enabled,
ja.start_execution_date,
ja.stop_execution_date,
CASE
WHEN ja.start_execution_date IS NOT NULL
AND ja.stop_execution_date IS NULL
THEN N'RUNNING'
ELSE N'NOT_RUNNING'
END AS job_state
FROM msdb.dbo.sysjobs AS j
LEFT JOIN msdb.dbo.sysjobactivity AS ja
ON ja.job_id = j.job_id
AND ja.session_id =
(SELECT MAX(session_id) FROM msdb.dbo.syssessions)
WHERE j.name LIKE N'%V3Trans%';
IF @sample = 1
WAITFOR DELAY '00:00:15';
SET @sample += 1;
END;
-- 6. Последние ошибки именно нужного Distribution Agent.
SELECT TOP (20)
N'05_DISTRIBUTION_ERRORS' AS section,
a.name AS agent_name,
h.[time] AS history_time,
h.runstatus,
h.comments,
e.*
FROM dbo.MSdistribution_agents AS a
JOIN dbo.MSdistribution_history AS h
ON h.agent_id = a.id
JOIN dbo.MSrepl_errors AS e
ON e.id = h.error_id
WHERE a.publisher_db = N'myNewVasya'
AND a.publication = N'V3Trans'
AND a.subscriber_db = N'replTransVas'
ORDER BY h.[time] DESC;