Shrink il file di dati di SQL Server, ma non tutti in una volta?

Ho un file di database attualmente 150 GB, ma solo 75 GB viene utilizzato – è perché ho spostato tutti gli indici (l'altro 75 GB) in un nuovo file di dati. Vorrei recuperare alless parte dello spazio da questo file di dati, ma quando tento di ridurre il file, "Esegue" a tempo indeterminato, eventualmente cancellato a causa di un'interruzione di networking o di qualcos'altro fuori dal mio controllo (dopo un giorno di corsa). Anche utilizzando la funzionalità "riduzione a dimensione specifica" e specificando che è sufficiente ridimensionare 10 MB non sembra mai tornare – è solo seduto fino al process interrotto.

C'è un altro modo per recuperare questo spazio, anche un po 'alla volta?

  • Come posso accedere a SQL Server senza wherer utilizzare "Esegui come amministratore" quando si avvia Management Studio in Windows 7?
  • Come trovare quando la stored procedure è stata eliminata e chi l'ha cancellata?
  • Rinominato un SQL Server, tuttavia i piani di manutenzione hanno ancora un nome vecchio
  • La posta del database non invia messaggi di posta elettronica
  • Registro di transazione SQL Server RAID
  • Che cosa dovrebbe essere escluso da una scansione antivirus su un server basato su Microsoft (IIS, MSSQL, ecc.)?
  • EDIT: Qualcuno ha postato un link che spiega perché non dovrei ridursi il mio database. Capisco, e voglio ridurlo comunque. Lo spazio su disco è un premio su questo server e il database non si espanderà nuovamente in questo spazio inutilizzato per molto tempo – come ho già detto, ho migrato gli indici dal file di dati per liberare questo spazio, quindi ora è sprecato .

  • Copiare i database di SQL Server
  • Diventare una DBA, cosa devo sapere?
  • Quanto sforzo è l'amministrazione di SQL Server 2008?
  • Come dimensionare le size dei server SQL (RAM, CPU e altri)
  • Come posso scaricare un utente MySQL il cui nome utente contiene caratteri non printingbili?
  • MySQL: creazione di un utente che può connettersi da più host
  • 3 Solutions collect form web for “Shrink il file di dati di SQL Server, ma non tutti in una volta?”

    No, utilizzando DBCC SHRINKFILE ('filename', target_size) è il modo giusto per farlo.

    Se vuoi farlo in "pezzi", puoi impostare gradualmente i tag di destinazione più piccoli, oppure lasciarlo funzionare finché puoi annullare.

    Alcuni commenti:

    • Mettere una dimensione ragionevole di destinazione, con un certo margine di spazio libero consentito. Forse 90 GB totale per 75 GB di dati?
    • Mentre lo strizzacervello è in esecuzione, controllare il monitor di attività per verificare se lo SPID è bloccato. Se esiste una transazione aperta in una pagina all'estremità del file, quindi la restrizione non sarà in grado di spostarla fino a quando la transazione non viene eseguita o viene rimessa indietro.
    • Il ragno sta facendo progressi? (I numbers di CPU e IO stanno cambiando)
    • La restrizione a volte può assumere un tempo molto lungo, ma dovrebbe risparmiare il suo progresso (vale a dire che si muove una pagina alla volta e quando viene annullata, tutte le operazioni di pagina completate sono già state eseguite)
    • Dopo aver annullato lo shrink, provare a fare DBCC SHRINKFILE ('filename', TRUNCATEONLY) . Dovrebbe recuperare tutto lo spazio già liberato alla fine del file (vedere il mio punto precedente)
    • Se sei disperato, prova a riavviare SQL in modalità utente singolo, quindi sai che niente altro sta lavorando contro il db in quel momento (ovviamente questo potrebbe essere imansible su un prod server)
    • Una volta riuscito a completare il restringimento, assicurati di eseguire un reindex completo nel database per eliminare la frammentazione che crea il restringimento. Questo può recuperare alcuni degli spazi appena liberati.
    • Se ancora non riesci a get il rigetto per lavorare, controlla alcune discussioni su questa domanda SO . Ci sono apparentemente alcune situazioni in cui i rissa potrebbero non andare avanti.

    Abbiamo avvicinato diverse opzioni nel nostro ambiente:

    1. Se si possono affrontare vecchie tabelle, creare nuove tabelle in un nuovo filegroup e predisporre il database. Ore di lavoro, abbandonare le vecchie tabelle fino a quando il precedente filegroup è vuoto. Poi farlo cadere.
    2. Se non si possono affrontare vecchie tabelle, ma contengono dati storici che possono essere distriggersti ​​per diverse ore, creare un nuovo tavolo vuoto che indica un nuovo filegroup. Scambia le tabelle e inizia a copiare le righe dalla vecchia tabella al nuovo in batch. Ciò può causare frammentazione.
    3. Emettere un DBCC SHRINKFILE con l'opzione EMTPYFILE e il DB sposterà tutti gli oggetti al nuovo file. Quindi puoi lasciare il vecchio file. Ciò può richiedere molto tempo.
    4. Ricreare l'indice cluster (chiave primaria con DROP_EXISTING) di tutte le tabelle nel nuovo filegroup. Questo bloccerà la tabella però.

    In bocca al lupo

    Se non si desidera recuperare semplicemente lo spazio (che in particolare si è rifiutato di voler fare), ma insistere sul tentativo di ridurre il database, si aspetta che questo prenda un tempo molto lungo e l'espansione del registro delle transactions dovrebbe riguardare solo qualsiasi spazio hai reclamato dal database. Come bonus, guarda la tua prestazione DB passare attraverso il pavimento dopo. Se Paul Randal non riesce a convincerti (che JL ha commentato, ma qui riprenderò: perché non dovresti ridurre i tuoi file di dati che la contrazione è un'idea terribile, non sono sicuro che qualcuno possa. SQL Server (o alless essere modificato in modo da funzionare come Paul raccomanda) nella prossima revisione.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.