Come verificare l'avanzamento di DBCC SHRINKFILE?


31

C'è un modo per scoprire lo stato di avanzamento della DBCC SHRINKFILEdichiarazione?

Ecco come lo stavo eseguendo

dbcc shrinkfile ('main_data', 250000)

Sono in esecuzione sopra la dichiarazione su SQL Server 2005 e 2008.

[AGGIORNAMENTO] Ecco la query che ho eseguito per verificare l'avanzamento e il testo in esecuzione.

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

Risposte:


33

Hai controllato percent_complete in sys.dm_exec_requests?


Attualmente sto controllando come leggere i dati restituiti da quel DMV.
dance2die,

14

La risposta di Aaron è perfetta, ma vorrei metterti in guardia dal fatto che i file di dati in esecuzione si riducono perché causano orribili problemi di prestazioni. Possedevo il codice di riduzione, quindi so di cosa sto parlando. Dai un'occhiata a questo post sul blog che ho scritto ieri che ti mostra cosa intendo e ti consiglia come effettuare una riduzione senza effettivamente ridurre: Perché non dovresti ridurre i tuoi file di dati

Spero che sia di aiuto!

PS Un'altra cosa da verificare se sta impiegando molto tempo e il percent_complete non sta aumentando: cerca il blocco. Shrink attenderà all'infinito i blocchi di cui ha bisogno.


4
"Ero proprietario del codice di riduzione, quindi so di cosa sto parlando." simpatico!
splattne,

1
Stava impiegando un'eternità a ridurre il file di dati 600G ... Lo rileggerò e prenderò in considerazione l'utilizzo della deframmentazione dell'indice. Grazie Paolo!
dance2die,

1
tieni a mente che ho trovato questa risposta perché stavo cercando progressi su DBCC SHRINKFILE (MyFile, EMPTYFILE) ... Sto spostando i dati tra le unità aggiungendo un file al filegroup sulla nuova unità, svuotando l'originale e rilasciandolo.
Sam Saffron,

@Paul, sto osservando che la riduzione di un file a una dimensione di destinazione richiede un po 'di tempo ma completa (lo vedo guardando la dimensione del file), ma sebbene SEMBRA che sia completato con successo, il processo di shinking continua e continua per sempre. Lo stesso vale per quantità minori (alcuni MB o maggiori (1 GB) di volume shink). sys.dm_exec_requests mostra continuamente attività infinite, modificando i blocchi delle risorse e allo stesso tempo percent_completion si attesta a circa il 32,8%. A questo punto ANNULLO il processo e celebro ufficialmente un successo - sapendo che QUALCOSA stava ancora andando ... qualche idea di cosa non va? 2008r2
Magier,

Il collegamento al post del blog è interrotto, questo sembra essere valido ora: 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
Potrebbe essere utile includere una descrizione di ciò che fa il tuo codice nella tua risposta
BE77Y

+1 per una query eccellente, ma -1 per ripetere ciò che l'OP ha detto sei anni dopo il fatto. Se la tua query è migliore della sua in un certo senso, descrivila, altrimenti è solo uno spazio sprecato.

5

La query di seguito mostrerà i risultati in questo modo: traccia lo stato di riduzione di 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

Aggiungendo la mia versione per chiunque sia interessato, questo converte le colonne dei millesimi di secondo in minuti e secondi più leggibili.

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

Oppure puoi semplicemente eseguire exec sp_who3.


2
Ciò avrebbe bisogno di una spiegazione migliore.
Sven

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.