53 votes

Comment vérifier la progression de DBCC SHRINKFILE ?

Existe-t-il un moyen de connaître l'état d'avancement du projet ? DBCC SHRINKFILE déclaration ?

Voici comment j'ai procédé

dbcc shrinkfile('main_data', 250000)

J'exécute l'instruction ci-dessus sur les serveurs SQL 2005 et 2008.

[MISE À JOUR] Voici la requête que j'ai lancée pour vérifier la progression et le texte exécuté.

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

47voto

Aaron Alton Points 1118

Avez-vous vérifié percent_complete dans sys.dm_exec_requests ?

19voto

Bernie Perez Points 5091

La réponse d'Aaron est exacte, mais j'aimerais vous mettre en garde contre la réduction des fichiers de données, qui entraîne d'horribles problèmes de performance. Je possédais le code de réduction, je sais donc de quoi je parle. Jetez un coup d'œil à ce billet de blog que j'ai écrit hier et qui vous montre ce que je veux dire et vous conseille sur la façon d'effectuer un rétrécissement sans réellement le faire : Pourquoi ne pas réduire vos fichiers de données

J'espère que cela vous aidera !

PS Une autre chose à vérifier si cela prend beaucoup de temps et que le pourcentage d'achèvement n'augmente pas - recherchez les blocages. Shrink attendra infiniment les verrous dont il a besoin.

17voto

Mark Varnas Points 221

La requête ci-dessous vous donnera le résultat suivant : suivi de l'état de rétrécissement de la 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%'

7voto

user5947282 Points 71

J'ai ajouté ma propre version pour les personnes intéressées, qui convertit les colonnes de temps en millisecondes en minutes et secondes plus lisibles.

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

5voto

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')

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X