Wie überprüfe ich den Fortschritt von DBCC SHRINKFILE?

31

Gibt es eine Möglichkeit, den Fortschritt der DBCC SHRINKFILEAussage herauszufinden ?

Hier ist, wie ich es betrieben habe

dbcc shrinkfile ('main_data', 250000)

Ich führe die obige Anweisung für SQL Server 2005 und 2008 aus.

[UPDATE] Hier ist die Abfrage, die ich ausgeführt habe, um den Fortschritt und den Text zu überprüfen, der ausgeführt wird.

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
quelle

Antworten:

33

Haben Sie in sys.dm_exec_requests percent_complete überprüft?

Aaron Alton
quelle
Derzeit wird geprüft, wie die von dieser DMV zurückgegebenen Daten gelesen werden.
dance2die
14

Aarons Antwort ist genau richtig, aber ich möchte Sie davor warnen, Datendateischrumpfen auszuführen, da dies zu schrecklichen Leistungsproblemen führt. Früher besaß ich den Verkleinerungscode, also weiß ich, wovon ich spreche. Checkout this blog post Ich habe gestern geschrieben, dass zeigt, was ich meine und wie Sie eine Verkleinerung durchführen können, ohne tatsächlich eine Verkleinerung vorzunehmen: Warum Sie Ihre Datendateien nicht verkleinern sollten

Hoffe das hilft!

PS Noch eine Sache, um zu überprüfen, ob es lange dauert und der Prozentsatz_komplett nicht zunimmt - achten Sie auf Blockierung. Shrink wartet unendlich lange auf die benötigten Sperren.

Paul Randal
quelle
4
"Früher besaß ich den Shrink-Code, also weiß ich, wovon ich spreche." nett!
Splattne
1
Es hat ewig gedauert, die 600G-Datendatei zu verkleinern. Vielen Dank, Paul!
dance2die
1
Denken Sie daran, dass ich diese Antwort gefunden habe, weil ich nach Fortschritten bei DBCC SHRINKFILE (MyFile, EMPTYFILE) gesucht habe. Ich verschiebe Daten zwischen Laufwerken, indem ich eine Datei zur Dateigruppe auf dem neuen Laufwerk hinzufüge, das Original leere und es lösche.
Sam Saffron
@ Paul, ich beobachte, dass das Verkleinern einer Datei auf eine Zielgröße eine Weile dauert, aber abgeschlossen ist (ich sehe, dass es die Dateigröße betrachtet) - aber obwohl es SCHEINT, als wäre es erfolgreich abgeschlossen, wird der Prozess des Verkleinerns fortgesetzt und für immer ausgeführt. Gleiches gilt für kleinere (einige MB oder größere (1 GB) Shink-Volumen). sys.dm_exec_requests zeigt kontinuierlich endlose Aktivitäten an und ändert die Ressourcensperren, während der Prozentsatz der Fertigstellung bei 32,8% bleibt. An diesem Punkt brich ich den Prozess ab und feiere offiziell einen Erfolg - wissend, dass noch ETWAS vor sich geht ... Hast du eine Idee, was los ist? 2008r2
Magier
Der Link zum Blog-Post ist defekt, dies scheint jetzt gültig zu sein: 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
quelle
2
Es kann hilfreich sein, eine Beschreibung der Funktionsweise Ihres Codes in Ihre Antwort aufzunehmen
BE77Y
+1 für eine exzellente Abfrage, -1 für die Wiederholung der Aussage des OP sechs Jahre nach der Tat. Wenn Ihre Anfrage in irgendeiner Hinsicht besser ist als seine, beschreiben Sie sie bitte, da sonst nur Speicherplatz verschwendet wird.
5

Die folgende Abfrage zeigt das Ergebnis wie folgt : Verfolgen Sie den dbcc-Verkleinerungsstatus

-------------------------------
--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
quelle
3

Durch Hinzufügen meiner eigenen Version für alle Interessierten werden die Millsekunden-Zeitspalten in besser lesbare Minuten und Sekunden umgewandelt.

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
user5947282
quelle
-1

Oder Sie können einfach exec sp_who3 ausführen.

darotweiler
quelle
2
Dies müsste besser erklärt werden.
Sven