¿Cómo verificar el progreso de DBCC SHRINKFILE?

31

¿Hay alguna manera de averiguar el progreso de la DBCC SHRINKFILEdeclaración?

Así es como lo estaba ejecutando

dbcc shrinkfile ('main_data', 250000)

Estoy ejecutando la declaración anterior en SQL Server 2005 y 2008.

[ACTUALIZACIÓN] Aquí está la consulta que ejecuté para verificar el progreso y el texto que se está ejecutando.

select  T.text, R.Status, R.Command, DatabaseName = db_name(R.database_id)
        , R.cpu_time, R.total_elapsed_time, R.percent_complete
from    sys.dm_exec_requests R
        cross apply sys.dm_exec_sql_text(R.sql_handle) T
dance2die
fuente

Respuestas:

33

¿Ha verificado percent_complete en sys.dm_exec_requests?

Aaron Alton
fuente
Actualmente revisando cómo leer los datos devueltos por ese DMV.
dance2die
14

La respuesta de Aaron es acertada, pero me gustaría advertirle sobre la ejecución de la reducción del archivo de datos, ya que causa problemas de rendimiento horribles. Solía ​​tener el código de reducción, así que sé de lo que estoy hablando. Consulte esta publicación de blog que escribí ayer que muestra lo que quiero decir y aconseja cómo efectuar una reducción sin realmente hacer una reducción: ¿Por qué no debe reducir sus archivos de datos?

¡Espero que esto ayude!

PD: Una cosa más para verificar si está tardando mucho y el porcentaje_completo no está aumentando: busque el bloqueo. Shrink esperará infinitamente las cerraduras que necesita.

Paul Randal
fuente
44
"Solía ​​poseer el código de reducción, así que sé de lo que estoy hablando". ¡bonito!
splattne
1
Me llevó una eternidad reducir el archivo de datos 600G ... Lo leeré y consideraré usar la desfragmentación de índice. Gracias paul!
dance2die
1
tenga en cuenta que encontré esta respuesta porque estaba buscando progreso en DBCC SHRINKFILE (MyFile, EMPTYFILE) ... Estoy moviendo datos entre unidades agregando un archivo al grupo de archivos en la nueva unidad, vaciando el original y soltándolo.
Sam Saffron
@Paul, estoy observando que reducir un archivo a un tamaño objetivo lleva un tiempo pero se completa (lo veo mirando el tamaño del archivo), pero aunque parece que se completó con éxito, el proceso de parpadeo aún continúa y se ejecuta para siempre. Lo mismo con cantidades más pequeñas (algunos MB o cantidades mayores (1 GB) de volumen shink). sys.dm_exec_requests muestra continuamente una actividad sin fin, cambiando los bloqueos de recursos mientras que al mismo tiempo percent_completion se bloquea en algo alrededor del 32,8%. En este punto, CANCELO el proceso y celebro oficialmente un éxito, sabiendo que ALGO todavía estaba sucediendo ... ¿alguna idea de lo que está mal? 2008r2
Magier
El enlace a la publicación del blog está roto, esto parece ser válido ahora: sqlskills.com/blogs/paul/…
Jonathan Gilbert
5
SELECT 
    d.name,
    percent_complete, 
    session_id,
    start_time, 
    status, 
    command, 
    estimated_completion_time, 
    cpu_time, 
    total_elapsed_time
FROM 
    sys.dm_exec_requests E left join
    sys.databases D on e.database_id = d.database_id
WHERE
    command in ('DbccFilesCompact','DbccSpaceReclaim')
Francisco Figueiredo
fuente
2
Puede ser útil incluir una descripción de lo que hace su código en su respuesta
BE77Y
+1 para una consulta excelente, pero -1 para repetir lo que dijo el OP seis años después del hecho. Si su consulta es mejor que la suya en algún aspecto, descríbala, de lo contrario, es solo espacio desperdiciado.
5

La consulta a continuación le mostrará un resultado como este: rastrear el estado de reducción de dbcc

-------------------------------
--Track DBCC shrink status
-------------------------------
select
a.session_id
, command
, b.text
, percent_complete
, done_in_minutes = a.estimated_completion_time / 1000 / 60
, min_in_progress = DATEDIFF(MI, a.start_time, DATEADD(ms, a.estimated_completion_time, GETDATE() ))
, a.start_time
, estimated_completion_time = DATEADD(ms, a.estimated_completion_time, GETDATE() )
from sys.dm_exec_requests a
CROSS APPLY sys.dm_exec_sql_text(a.sql_handle) b
where command like '%dbcc%'
Mark Varnas
fuente
3

Al agregar mi propia versión para cualquier persona interesada, esto convierte las columnas de tiempo de milisegundos en minutos y segundos más legibles.

select 
[status],
start_time,
convert(varchar,(total_elapsed_time/(1000))/60) + 'M ' + convert(varchar,(total_elapsed_time/(1000))%60) + 'S' AS [Elapsed],
convert(varchar,(estimated_completion_time/(1000))/60) + 'M ' + convert(varchar,(estimated_completion_time/(1000))%60) + 'S' as [ETA],
command,
[sql_handle],
database_id,
connection_id,
blocking_session_id,
percent_complete
from  sys.dm_exec_requests
where estimated_completion_time > 1
order by total_elapsed_time desc
usuario5947282
fuente
-1

O simplemente puede ejecutar exec sp_who3.

darotweiler
fuente
2
Esto necesitaría una mejor explicación.
Sven