Comment vérifier la progression de DBCC SHRINKFILE?


31

Existe-t-il un moyen de connaître l'état d'avancement de la DBCC SHRINKFILEdéclaration?

Voici comment je le dirigeais

dbcc shrinkfile ('main_data', 250000)

J'exécute la déclaration ci-dessus sur SQL Server 2005 et 2008.

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

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

Réponses:


33

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


Je vérifie actuellement comment lire les données renvoyées par ce DMV.
dance2die

14

La réponse d'Aaron est parfaite, mais je voudrais vous mettre en garde contre l'exécution de la réduction du fichier de données car cela provoque d'horribles problèmes de performances. Je possédais le code de réduction, donc je sais de quoi je parle. Consultez ce billet de blog que j'ai écrit hier qui vous montre ce que je veux dire et vous conseille comment effectuer une réduction sans réellement effectuer une réduction: pourquoi vous ne devriez pas réduire vos fichiers de données

J'espère que cela t'aides!

PS Une dernière chose pour vérifier si cela prend du temps et si le pourcentage_complet n'augmente pas - recherchez le blocage. Shrink attendra infiniment les verrous dont il a besoin.


4
"Je possédais le code de réduction, donc je sais de quoi je parle." agréable!
splattne

1
Il a fallu une éternité pour réduire le fichier de données 600G ... Je vais le lire et envisager d'utiliser la défragmentation d'index. Merci Paul!
dance2die

1
Gardez à l'esprit que j'ai trouvé cette réponse car je cherchais des progrès sur DBCC SHRINKFILE (MyFile, EMPTYFILE) ... Je déplace des données entre les lecteurs en ajoutant un fichier au groupe de fichiers sur le nouveau lecteur, en vidant l'original et en le supprimant.
Sam Saffron

@Paul, j'observe que la réduction d'un fichier à une taille cible prend un certain temps mais se termine (je le vois en regardant la taille du fichier) -mais bien qu'il SEMBLE être terminé avec succès, le processus de shinking continue et se poursuit indéfiniment. Idem avec des volumes plus petits (certains Mo ou plus (1 Go) de shink). sys.dm_exec_requests affiche en continu une activité sans fin, changeant les verrous de ressources tandis qu'en même temps percent_completion se situe à environ 32,8%. À ce stade, j'ANNULE le processus et célèbre officiellement un succès - sachant que QUELQUE CHOSE se passait encore ... une idée de ce qui ne va pas? 2008r2
Magier

Le lien vers le blog est cassé, cela semble être valide maintenant: 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')

2
Il peut être utile d'inclure une description de ce que fait votre code dans votre réponse
BE77Y

+1 pour une excellente requête, mais -1 pour répéter ce que le PO a dit six ans après les faits. Si votre requête est meilleure que la sienne à certains égards, veuillez la décrire, sinon c'est juste de l'espace perdu.

5

La requête ci-dessous vous montrera le résultat comme ceci: suivre le statut de rétrécissement 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%'

3

Ajouter ma propre version pour toute personne intéressée, cela 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

-1

Ou vous pouvez simplement exécuter exec sp_who3.


2
Cela aurait besoin d'une meilleure explication.
Sven

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.