Dbcc shrinkdatabase (transact-sql)

nume_bază | database_id | 0

Numele sau identificatorul bazei de date care trebuie comprimat. Dacă este specificat 0, este utilizată baza de date curentă.

Procentul de spațiu liber care ar trebui să rămână în baza de date după comprimare.







Comprimă datele în fișiere prin mutarea paginilor distribuite de la sfârșitul fișierului la locul paginilor nealocate la începutul fișierului. Argumentul target_percent este opțional.

Spațiul liber de la sfârșitul fișierului nu este returnat sistemului de operare și dimensiunea fizică a fișierului nu se modifică. Prin urmare, dacă este specificat argumentul NOTRUNCATE, comprimarea fișierelor de date este neglijabilă.

Argumentul NOTRUNCATE se aplică numai fișierelor de date. Nu afectează fișierele jurnal.

Alocă toate spațiul liber de la sfârșitul fișierului la sistemul de operare, dar nu muta paginile din fișier. Fișierul de date va fi doar comprimat până la ultima extindere distribuită. Argumentul target_percent este ignorat dacă este specificat cu argumentul TRUNCATEONLY.

Argumentul TRUNCATEONLY se aplică numai fișierelor de date. Nu afectează fișierele jurnal.

Suprimă toate mesajele de informație cu grade de severitate de la 0 la 10.

Pentru a comprima toate fișierele de date și fișierele din baza de date specificată, emiteți comanda DBCC SHRINKDATABASE. Pentru a comprima un singur fișier de date sau un fișier jurnal în baza de date specificată, emiteți comanda DBCC SHRINKFILE.

Operațiile DBCC SHRINKDATABASE pot fi oprite în orice etapă a procesului și toate lucrările efectuate sunt salvate.

Dimensiunea acestei baze de date nu poate fi mai mică decât dimensiunea minimă a bazei de date. Dimensiunea minimă - este dimensiunea specificată atunci când baza de date a fost creată sau ultima dimensiune stabilită în mod explicit dimensiunea schimbare de operare a fișierului, cum ar fi o DBCC SHRINKFILE sau ALTER DATABASE. De exemplu, în cazul în care baza de date a fost creată cu o dimensiune de 10 MB, iar apoi a crescut la 100 MB, acesta poate fi comprimat numai 10 MB, chiar dacă ștergeți toate datele.

Operațiunea DBCC SHRINKDATABASE fără a specifica parametrul NOTRUNCATE sau TRUNCATEONLY este echivalent cu operarea DBCC SHRINKDATABASE cu NOTRUNCATE parametru după efectuarea DBCC SHRINKDATABASE cu parametrul TRUNCATEONLY.

O bază de date comprimabilă nu trebuie să fie în modul pentru un singur utilizator. Alți utilizatori pot lucra cu baza de date atunci când este comprimată. Acest lucru se aplică la bazele de date ale sistemului.

Nu este posibilă comprimarea bazei de date în timp ce este făcută o copie de rezervă. În schimb, nu puteți crea o copie de rezervă a unei baze de date în timpul unei operații de compresie.

Comanda DBCC SHRINKDATABASE

Instrucțiunea DBCC SHRINKDATABASE comprimă fișierele de date una câte una, iar fișierele jurnal ca și cum ar reprezenta toate un fond de jurnal contiguu. Comprimarea fișierelor se face întotdeauna de la sfârșit.

Să presupunem că există o bază de date numită mydb. care are un fișier de date și două fișiere log. Fiecare fișier de date și fișier log are o dimensiune de 10 MB, iar fișierul de date conține 6 MB de date.

Să presupunem că fișierul de date mydb conține 7 MB de date. Când specificați target_percent cu o valoare de 30, puteți comprima acest fișier pentru a elibera 30% din spațiu. Cu toate acestea, în cazul în care specifică valoarea fișierului de date argumentul target_percent 40 nu va fi comprimat, deoarece componenta Database Engine nu poate comprima imaginea la o dimensiune mai mică decât dimensiunea curentă ocupată de date. Această situație poate fi reprezentată într-un alt mod: 40% din spațiul liber dorit + 70% din fișierul de date complet (7 MB de 10 MB) este mai mult de 100%. Deoarece suma procentelor eliberabil dorită și procentul curent ocupat de fișierul de date depășește 100 (10 la sută), orice target_percent valoare. O valoare mai mare de 30 nu va comprima fișierul de date.







Pentru fișierul de jurnal, motorul de bază de date utilizează argumentul target_percent pentru a calcula dimensiunea țintă a întregului jurnal. Prin urmare, argumentul target_percent este cantitatea de spațiu liber din jurnal după operația de comprimare. Dimensiunea țintă a întregului jurnal este apoi recalculată în mărimea țintă a fiecărui fișier jurnal.

Instruciunea DBCC SHRINKDATABASE încearcă să comprime imediat fiecare fișier jurnal fizic la dimensiunea țintă. În cazul în care nici o parte a jurnalului logic nu este plasat în fișierele jurnal virtuale a căror dimensiune depășește dimensiunea țintă a fișierului jurnal, fișierul este trunchiat cu succes și declarația DBCC SHRINKDATABASE se termină fără nici un mesaj. Cu toate acestea, în cazul în care o parte din jurnalul logic este stocat în jurnalele virtuale dincolo de dimensiunea specificată, Database Engine eliberează cât mai mult spațiu posibil, apoi generează un mesaj informativ. Mesajul descrie pașii care trebuie întreprinși pentru a muta jurnalul logic de la jurnalele virtuale la sfârșitul fișierului. După ce toată acțiunea declarație DBCC SHRINKDATABASE poate fi folosit pentru a elibera spațiul rămas. Pentru informații suplimentare, consultați Comprimarea jurnalelor de tranzacții.

Deoarece fișierul jurnal poate fi comprimat numai la limita fișierului jurnal virtual, nu este posibilă comprimarea fișierului jurnal la o dimensiune mai mică decât mărimea fișierului jurnal virtual, chiar dacă acesta nu este utilizat. Dimensiunea fișierului jurnal virtual este selectată dinamic de către motorul de bază de date atunci când se creează sau se extind fișierele jurnal. Pentru mai multe informații despre fișierele jurnal virtuale, consultați Arhitectura jurnalului tranzacțiilor fizice.

Metodele cele mai optime

Rețineți următoarele informații atunci când planificați comprimarea bazei de date.

  • Cel mai mare efect al operației de comprimare este realizat atunci când este aplicat după o operație care creează o mulțime de spațiu neutilizat, de exemplu după trunchierea sau ștergerea unui tabel;
  • Cele mai multe baze de date necesită un spațiu liber pentru a efectua operații zilnice normale. Dacă baza de date este comprimată în mod regulat, dar din nou crește în mărime, aceasta înseamnă că spațiul eliberat în timpul comprimării este necesar pentru operațiile obișnuite. În acest caz, compresia regulată a bazei de date nu va aduce rezultate;
  • Operația de comprimare nu păstrează starea de fragmentare a indexurilor din baza de date și, de regulă, conduce la o fragmentare mai mare. Acesta este un alt motiv pentru care nu merită să comprimați periodic baza de date;
  • Nu setați parametrul de bază de date AUTO_SHRINK la ON fără motiv suficient.

Remediați problemele

Operațiile de comprimare pot fi blocate de o tranzacție care rulează cu un nivel de izolare bazat pe controlul versiunilor rândurilor. De exemplu, dacă în timpul operației de îndepărtare continuă, care rulează la nivel cu izolarea, bazată pe liniile de control al versiunii care rulează operare DBCC SHRINK DATABASE, operațiune de compresie va aștepta finalizarea operației de ștergere. În acest caz, operațiunea DBCC SHRINKFILE și DBCC SHRINKDATABASE mesajul de informații de ieșire (5202 și 5203 pentru SHRINKDATABASE pentru SHRINKFILE) în jurnalul de erori SQL Server la fiecare 5 minute în timpul primei ore, iar apoi un mesaj la fiecare oră. De exemplu, jurnalul de erori conține următorul mesaj de eroare:

Acest lucru înseamnă că operațiunea de contracție este blocată de instantaneu tranzacție care au marcajele de timp mai mari decât marca 109 reprezentând ultima tranzacție, încheie operația de compresie. Acest lucru arată, de asemenea, că coloanele transaction_sequence_num first_snapshot_sequence_num sau un management dinamic sys.dm_tran_active_snapshot_database_transactions de reprezentare conține numărul 15. În cazul în care coloanele sau transaction_sequence_num first_snapshot_sequence_num introducerea conțin număr mai mic decât ultima tranzacție executată etapa de compresie (109), operația de compresie va aștepta finalizarea acestor tranzacții.

Puteți rezolva această problemă urmând acești pași:

  • Opriți executarea tranzacției blocând operația de comprimare.
  • Terminați operația de comprimare. Toate lucrările finalizate vor fi salvate.
  • În timp ce operația de compresie așteaptă încheierea tranzacțiilor de blocare, nu este nevoie să faceți nimic.






Trimiteți-le prietenilor: