Ho un database 21 Gb; 20 Gb di loro sono file (FileStream) e ho eliminato tutti i file dalla tabella, ma quando faccio un backup il file di backup ancora 21 GB.Avanzamento per DBCC SHRINKFILE
Per risolvere questo problema sono diventato l'idea "liberare lo spazio inutilizzato".
Così sto cercando di compattare mio database come il seguente:
USE Db;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE Db
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (Db, 100);
GO
-- Reset the database recovery model.
ALTER DATABASE Db
SET RECOVERY FULL;
GO
SELECT file_id, name
FROM sys.database_files;
GO
DBCC SHRINKFILE (1, TRUNCATEONLY);
Se faccio un backup per il database dopo XX minuti, quindi la dimensione del file di backup è di 1 Gb in questo modo, io può vedere che lo spazio non utilizzato è stato pulito con successo. In altre parole, il codice Sql sopra riportato funziona correttamente (Database dopo XX minuti è schrunk).
Il problema ho bisogno di aspettare fino a questa query (operazione Shrinking) è finito in modo che sto cercando di fare quanto segue:
SELECT percent_complete, start_time, status, command, estimated_completion_time, cpu_time, total_elapsed_time
FROM sys.dm_exec_requests
non riesco a trovare alcuna informazione circa la SHRINKFILE comando nei risultati della query precedente.
ho fatto qualcosa di sbagliato? perché non riesco a vedere l'andamento delle operazioni di riduzione dei DB?
E la mia quesiton principale è: come posso aspettare fino a quando lo SHRINKFILE è finito? Per esempio posso inviare dalla mia query di codice C# e nel risultato di questa query otterrò l'informazione che l'operazione SHRINKFILE è finita o no?
Ci si rende conto che questo frammenta il database e interrompe la catena di log, giusto? Questo non è qualcosa che dovresti * mai * automatizzare perché 1) non dovresti * mai * automatizzare la riduzione di un database e 2) La capacità di recupero del tuo database è in pericolo fino al completamento del successivo backup completo. Dovresti farlo sempre manualmente, in via eccezionale, e sorvegliarlo personalmente fino a quando non viene completato. Altrimenti stai invitando una serie di problemi, alcuni dei quali disastrosi. – RBarryYoung
Sono d'accordo con tutto; Questo è il motivo per cui ho bisogno di bloccare tutto cambiando il database mentre riduco ad esempio aggiungere rimuovere le voci di backup, ecc. Il problema è che i nostri requisiti dei clienti hanno bisogno dello spazio inutilizzato sul disco fisso che devo fare. –
Anche per me è sufficiente sapere quando questo processo è finito e non una barra di progresso tutto ciò che devo sapere Quando l'operazione ShrinkFile è terminata nell'istruzione SQL, ad esempio il processo SPID non è più disponibile e posso raggrupparlo da C# –