¿Qué job actualizo mi tabla?

Estimados,

Les voy a contar una anécdota que me sucedió hace algún tiempo y que me sirvió para poder buscar información y aprender más sobre historial de los jobs de base de datos lo cual me fue de mucha ayuda en esa situación. Pues bueno tenía una base de datos que contenía muchas tablas y estas eran llenadas desde diversos jobs los cuales estaban programados en diversos servidores, no se tenía un mapa completo del origen de los datos de cada una de esas tablas; hasta que un desafortunado día un jefe me dice: “… Hey, ¿puedes verificar por qué la tabla X no se ha llenado?”

OK dije, esto no debe ser tan difícil, empecé a revisar y eran 5 servidores los que podían llenar esta tabla, de los cuales sumados eran más de 200 jobs, lo cual me hizo recapacitar en la factibilidad del trabajo, ¿sería capaz de abrir cada uno de los jobs y verificar cuál de ellos era el que llenaba esta tabla?, pues claro que no, esto sería una locura y una pérdida de tiempo tremenda. Entonces qué puedo hacer, bueno ya que esta tabla solo se llenaba por este job, es decir no habían usuarios que hicieran inserciones ni modificaciones en ella, solo lecturas, decidí que lo primero que debía hacer era obtener el momento exacto de la última modificación, para esto utilice este script:

SELECT TBL.object_id,
       TBL.name,
       TBL.create_date,
       TBL.modify_date,
       IUS.last_user_update,
       COALESCE(IUS.last_user_seek, IUS.last_user_lookup, IUS.last_user_scan) AS last_user_read,
       SUM(PST.row_count) AS rows,
       ROUND((SUM(pst.reserved_page_count) * 8.00) / 1024.00, 2) AS [space_reserved (MB)]
FROM sys.tables TBL
     INNER JOIN sys.dm_db_partition_stats PST
	   ON TBL.object_id = PST.object_id
        AND PST.index_id < 2
     LEFT JOIN sys.dm_db_index_usage_stats IUS
	   ON IUS.database_id = DB_ID()
        AND IUS.object_id = TBL.object_id
WHERE TBL.name = 'MiTablaX'
GROUP BY TBL.object_id,
         TBL.name,
         TBL.create_date,
         TBL.modify_date,
         IUS.last_user_update,
         IUS.last_user_seek,
         IUS.last_user_lookup,
         IUS.last_user_scan;

Listo, ya tengo la fecha de última modificación, con esta fecha voy a buscar en las tablas del historial de los jobs, el cual pude encontrar debido al post que encontré en esta página.

DECLARE @jobsRunningAt DATETIME;

SET @jobsRunningAt = '2014-07-16 01:00:02.130';
WITH JobHistorySummary AS
(
SELECT
jobs.job_id,
job_name = jobs.[name],
step_id,
step_name,
run_time,
run_time_hours = run_time/10000,
run_time_minutes = (run_time%10000)/100,
run_time_seconds = (run_time%10000)%100,
run_time_elapsed_seconds =
(run_time/10000 /*run_time_hours*/ * 60 * 60 /* hours to minutes to seconds*/) +
((run_time%10000)/100 /* run_time_minutes */ * 60 /* minutes to seconds */ ) +
(run_time%10000)%100,
Start_Date = CONVERT(DATETIME, RTRIM(run_date)),
Start_DateTime =
CONVERT(DATETIME, RTRIM(run_date)) +
((run_time/10000 * 3600) + ((run_time%10000)/100*60)
+ (run_time%10000)%100 /*run_time_elapsed_seconds*/)
/ (23.999999*3600 /* seconds in a day*/),
End_DateTime =
CONVERT(DATETIME, RTRIM(run_date))
+ ((run_time/10000 * 3600)
+ ((run_time%10000)/100*60)
+ (run_time%10000)%100)
/ (86399.9964 /* Start Date Time */)
+ ((run_duration/10000 * 3600)
+ ((run_duration%10000)/100*60)
+ (run_duration%10000)%100 /*run_duration_elapsed_seconds*/)
/ (86399.9964 /* seconds in a day*/)
FROM msdb.dbo.sysjobs jobs WITH(NOLOCK)
inner join msdb.dbo.sysjobhistory history WITH(NOLOCK) ON
jobs.job_id = history.job_id
WHERE step_name <> '(Job outcome)' --Only interested in final outcome of jobs
)
SELECT distinct
job_id,
job_name,
step_id,
Start_DateTime,
End_DateTime
<span></span>FROM JobHistorySummary
<span></span>WHERE @jobsRunningAt between Start_DateTime and End_DateTime
ORDER BY End_DateTime DESC;

Entonces lo único que restaba hacer era ejecutarlo en los 5 servidores y verificar que paso se estaba ejecutando a esa hora exacta y de esa manera fue muy sencillo poder encontrarlo. Finalmente encontré que el problema fue por un cambio de estructura que no estaba siendo reflejado en el paquete SSIS que pasaba los datos a esa tabla, se realizó el cambio y el problema fue resuelto.

Espero les haya servido esta experiencia para poder resolver posibles problemas que tengan con el historial de Jobs.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s