DBCC SHRINKDATABASE (Transact-SQL)

  • 07/17/2017
  • 8 minuuttia luettavaa
    • p
    • M
    • j
    • i
    • K
    • +12

Käytetään: SQL Server (kaikki tuetut versiot) Azure SQL -tietokanta Azure Synapse Analytics

Vähentää määritetyn tietokannan tieto- ja lokitiedostojen kokoa.

Transact-SQL-syntaksikonventiot

Syntaksi

DBCC SHRINKDATABASE ( database_name | database_id | 0 ) 
-- Azure Synapse AnalyticsDBCC SHRINKDATABASE ( database_name ) 

Huomautus

Katso SQL Server 2014:n ja sitä aikaisempien versioiden Transact-SQL-syntaksia kohdasta Aiempien versioiden dokumentointi.

Argumentit

database_name | database_id | 0
On kutistettavan tietokannan nimi tai ID. 0 määrittää, että käytetään nykyistä tietokantaa.

target_percent
On prosenttiosuus vapaasta tilasta, jonka haluat jättää tietokantatiedostoon sen jälkeen, kun tietokanta on kutistettu.

NOTRUNCATE
Liikuttaa osoitetut sivut tiedoston lopusta tiedoston etupuolella oleville osoittamattomille sivuille. Tämä toiminto tiivistää tiedot tiedoston sisällä. target_percent on valinnainen. Azure Synapse Analytics ei tue tätä vaihtoehtoa.

Tiedoston lopussa olevaa vapaata tilaa ei palauteta käyttöjärjestelmään, eikä tiedoston fyysinen koko muutu. Näin ollen tietokanta ei näytä pienenevän, kun määrität NOTRUNCATE.

NOTRUNCATE koskee vain datatiedostoja. NOTRUNCATE ei vaikuta lokitiedostoon.

TRUNCATEONLY
Vapauttaa kaiken tiedoston lopussa olevan vapaan tilan käyttöjärjestelmälle. Ei siirrä mitään sivuja tiedoston sisällä. Datatiedosto kutistuu vain viimeiseen määritettyyn laajuuteen. Jättää huomiotta target_prosentin, jos se on määritetty TRUNCATEONLY:n kanssa. Azure Synapse Analytics ei tue tätä vaihtoehtoa.

TRUNCATEONLY vaikuttaa lokitiedostoon. Jos haluat katkaista vain datatiedoston, käytä DBCC SHRINKFILE.

WITH NO_INFOMSGS
Katkaisee kaikki informatiiviset viestit, joiden vakavuusaste on 0-10.

Tulosjoukot

Seuraavassa taulukossa kuvataan tulosjoukon sarakkeet.

Sarakkeen nimi Kuvaus
DbId Tietokannan tunnistenumero tiedostosta, jota tietokantamoottori yritti kutistaa.
FileId Tiedoston tunnistenumero, jota tietokantamoottori yritti kutistaa.
CurrentSize Tiedoston tällä hetkellä käytössä olevien 8-KB:n sivujen määrä.
MinimumSize Tiedoston käytössä olevien 8-KB:n sivujen määrä. Tämä arvo vastaa tiedoston minimikokoa tai alun perin luotua kokoa.
UsedPages Tiedoston tällä hetkellä käyttämien 8-KB:n sivujen määrä.
EstimatedPages Tietokantamoottorin arvion mukaan tiedosto voitaisiin kutistaa 8-KB:n sivujen määrään.

Huomautus

Tietokantamo ei näytä rivejä niistä tiedostoista, joita ei ole kutistettu.

Huomautukset

Huomautus

Tämän komennon suorittamista ei suositella, koska tämä on i/o-intensiivinen toiminto, ja se voi viedä tietovaraston offline-tilaan. Lisäksi tietovaraston tilannekuviin kohdistuu kustannusvaikutuksia tämän komennon suorittamisen jälkeen.

Voit kutistaa tietyn tietokannan kaikki tieto- ja lokitiedostot suorittamalla komennon DBCC SHRINKDATABASE. Jos haluat kutistaa yhden tieto- tai lokitiedoston kerrallaan tietylle tietokannalle, suorita DBCC SHRINKFILE-komento.

Käytä sp_spaceused-komento, jos haluat tarkastella tietokannan tämänhetkistä vapaan (varaamattoman) tilan määrää.

DBCC SHRINKDATABASE-toiminnot voidaan pysäyttää missä vaiheessa tahansa, ja kaikki suoritettu työ säilyy.

Tietokannasta ei voi muodostua pienempää kuin tietokantaan määritetty minimikoko. Minimikoko määritetään, kun tietokanta alun perin luodaan. Tai vähimmäiskoko voi olla viimeisin nimenomaisesti määritetty koko käyttämällä tiedostokoon muutosoperaatiota. Operaatiot, kuten DBCC SHRINKFILE tai ALTER DATABASE, ovat esimerkkejä tiedostokokoa muuttavista operaatioista.

Esitettäköön, että tietokanta on alun perin luotu 10 Mt:n kokoisena. Sitten se kasvaa 100 MB:n kokoiseksi. Tietokanta voidaan pienentää pienimmillään 10 MB:n kokoiseksi, vaikka kaikki tietokannan tiedot olisi poistettu.

Määritä joko NOTRUNCATE- tai TRUNCATEONLY-vaihtoehto, kun suoritat DBCC SHRINKDATABASE -ohjelman. Jos et tee sitä, tulos on sama kuin jos suoritat DBCC SHRINKDATABASE-operaation NOTRUNCATE-valinnalla ja sen jälkeen suoritat DBCC SHRINKDATABASE-operaation TRUNCATEONLY-valinnalla.

Supistetun tietokannan ei tarvitse olla yhden käyttäjän tilassa. Muut käyttäjät voivat työskennellä tietokannassa, kun sitä kutistetaan, mukaan lukien järjestelmätietokannat.

Tietokantaa ei voi kutistaa, kun tietokannan varmuuskopiointi on käynnissä. Kääntäen et voi varmuuskopioida tietokantaa, kun tietokantaan kohdistuva kutistustoiminto on käynnissä.

Miten DBCC SHRINKDATABASE toimii

DBCC SHRINKDATABASE kutistaa datatiedostot tiedostokohtaisesti, mutta kutistaa lokitiedostot ikään kuin kaikki lokitiedostot olisivat yhdessä yhtenäisessä lokipoolissa. Tiedostot kutistetaan aina lopusta alkaen.

Asettele, että sinulla on pari lokitiedostoa, datatiedosto ja tietokanta nimeltä mydb. Data- ja lokitiedostot ovat kumpikin 10 Mt ja datatiedosto sisältää 6 Mt dataa. Database Engine laskee kullekin tiedostolle tavoitekoon. Tämä arvo on koko, johon tiedosto kutistetaan. Kun DBCC SHRINKDATABASE määritetään target_prosentin kanssa, tietokantamoottori laskee tavoitekoon tiedostossa kutistamisen jälkeen vapaana olevan tilan määrän target_prosentiksi.

Jos esimerkiksi määrität target_prosentiksi mydb:n kutistamiselle 25, tietokantamoottori laskee datatiedoston tavoitekooksi 8 Mt (6 Mt dataa plus 2 Mt vapaata tilaa). Näin ollen tietokantamoottori siirtää datatiedoston viimeisten 2 Mt:n tiedot datatiedoston ensimmäisten 8 Mt:n vapaaseen tilaan ja pienentää sitten tiedostoa.

Asettele, että datatiedosto mydb sisältää 7 Mt dataa. Määrittämällä target_percent arvoksi 30 tämä datatiedosto voidaan kutistaa vapaaseen prosenttiin 30. Sen sijaan target_percentin määrittäminen 40:ksi ei kutista datatiedostoa, koska tietokantamoottori ei kutista tiedostoa pienemmäksi kuin mitä data tällä hetkellä vie.

Voit ajatella tätä asiaa myös toisella tavalla: 40 prosenttia haluttua vapaata tilaa + 70 prosenttia täyttä datatiedostoa (7 Mt 10 Mt:stä) on enemmän kuin 100 prosenttia. Mikään target_size, joka on suurempi kuin 30, ei kutista datatiedostoa. Se ei kutistu, koska haluamasi vapaan tilan prosenttiosuus plus datatiedoston tämänhetkinen prosenttiosuus on yli 100 prosenttia.

Lokitiedostojen osalta tietokantamoottori käyttää target_prosenttia koko lokin tavoitekoon laskemiseen. Siksi target_percent on lokin vapaan tilan määrä kutistustoiminnon jälkeen. Koko lokin tavoitekoko muunnetaan sitten kunkin lokitiedoston tavoitekooksi.

DBCC SHRINKDATABASE yrittää kutistaa jokaisen fyysisen lokitiedoston tavoitekokoon välittömästi. Oletetaan, että mikään osa loogisesta lokitiedostosta ei jää virtuaalisiin lokitiedostoihin yli lokitiedoston tavoitekoon. Tällöin tiedoston karsiminen onnistuu ja DBCC SHRINKDATABASE päättyy ilman viestejä. Jos kuitenkin osa loogisesta lokista jää virtuaalisiin lokitiedostoihin tavoitekokoa suuremmaksi, tietokantamoottori vapauttaa niin paljon tilaa kuin mahdollista ja antaa sitten tiedotusviestin. Viestissä kuvataan, mitä toimia tarvitaan loogisen lokin siirtämiseksi pois virtuaalilokeista tiedoston loppuun. Kun toimenpiteet on suoritettu, jäljellä olevan tilan vapauttamiseen voidaan käyttää DBCC SHRINKDATABASE -ohjelmaa.

Lokitiedosto voidaan kutistaa vain virtuaalisen lokitiedoston rajalle. Siksi lokitiedoston kutistaminen virtuaalisen lokitiedoston kokoa pienemmäksi ei välttämättä ole mahdollista. Se ei ehkä ole mahdollista edes silloin, kun sitä ei käytetä. Tietokantamoottori valitsee virtuaalisen lokitiedoston koon dynaamisesti, kun lokitiedostoja luodaan tai laajennetaan.

Parhaat käytännöt

Huomioi seuraavat tiedot, kun suunnittelet tietokannan kutistamista:

  • Kutistamisoperaatio on tehokkaimmillaan sellaisen operaation jälkeen, joka luo käyttämätöntä tilaa, kuten taulukon karsimis- tai taulukon pudottamistoiminnon jälkeen.
  • Useimmiten tietokannat vaativat jonkin verran vapaata tilaa tavallisiin päivittäisiin toimintoihin. Saatat pienentää tietokantaa toistuvasti ja huomata, että tietokannan koko kasvaa uudelleen. Tämä kasvu osoittaa, että kutistettua tilaa tarvitaan säännöllisiin toimintoihin. Näissä tapauksissa tietokannan toistuva kutistaminen on turha operaatio.
  • Kutistaminen ei säilytä tietokannan indeksien pirstoutumistilaa, vaan se yleensä lisää pirstoutumista jonkin verran. Tämä tulos on toinen syy siihen, miksi tietokantaa ei kannata kutistaa toistuvasti.
  • Jos sinulla ei ole erityistä vaatimusta, älä aseta AUTO_SHRINK-tietokantaoptiota ON-asentoon.

Vianmääritys

Rivien versiointiin perustuvalla eristystasolla suoritettava transaktio voi blokata kutistamisoperaatiot. Esimerkiksi suuri poisto-operaatio, joka suoritetaan riviversiointiin perustuvalla eristystasolla, on käynnissä, kun DBCC SHRINK DATABASE -operaatio suoritetaan. Tässä tilanteessa kutistamisoperaatio odottaa, että poisto-operaatio on valmis, ennen kuin se kutistaa tiedostot. Kun kutistamisoperaatio odottaa, DBCC SHRINKFILE- ja DBCC SHRINKDATABASE-operaatiot tulostavat informatiivisen viestin (5202 SHRINKDATABASE-operaatiolle ja 5203 SHRINKFILE-operaatiolle). Tämä viesti tulostuu SQL Serverin virhelokiin viiden minuutin välein ensimmäisen tunnin aikana ja sen jälkeen joka seuraava tunti. Jos virheloki sisältää esimerkiksi seuraavan virheilmoituksen:

DBCC SHRINKDATABASE for database ID 9 is waiting for the snapshot transaction with timestamp 15 and other snapshot transactions linked to timestamp 15 or with timestamps older than 109 to finish. 

Tämä virhe tarkoittaa, että tilannekuvatapahtumat, joiden aikaleimat ovat vanhempia kuin 109, estävät kutistustoiminnon. Kyseinen transaktio on viimeinen transaktio, jonka kutistustoiminto suoritti loppuun. Se osoittaa myös, että sys.dm_tran_active_snapshot_database_transactions (Transact-SQL) -dynaamisen hallinnanäkymän sarakkeissa transaction_sequence_num tai first_snapshot_sequence_num on arvo 15. Näkymän transaction_sequence_num- tai first_snapshot_sequence_num-sarakkeessa saattaa olla luku, joka on pienempi kuin viimeinen kutistustoiminnolla (109) suoritettu transaktio. Jos näin on, kutistustoiminto odottaa näiden tapahtumien päättymistä.

Voit ratkaista ongelman tekemällä jonkin seuraavista tehtävistä:

  • Päättää kutistustoiminnon estävän tapahtuman.
  • Päättää kutistustoiminnon. Kaikki suoritettu työ säilyy.
  • Ei tehdä mitään ja annetaan kutistustoiminnon odottaa, kunnes estävä tapahtuma valmistuu.

Oikeudet

Edellyttää jäsenyyttä kiinteässä palvelinroolissa sysadmin tai kiinteässä tietokantaroolissa db_owner.

Esimerkkejä

A. Tietokannan pienentäminen ja vapaan tilan prosenttiosuuden määrittäminen

Seuraava esimerkki pienentää UserDB-käyttäjätietokannan data- ja lokitiedostojen kokoa, jotta tietokannassa on 10 prosenttia vapaata tilaa.

DBCC SHRINKDATABASE (UserDB, 10); GO 

B. Tietokannan typistäminen

Seuraava esimerkki pienentää AdventureWorks-näytetietokannan data- ja lokitiedostot viimeiseen määritettyyn laajuuteen.

DBCC SHRINKDATABASE (AdventureWorks2012, TRUNCATEONLY); 

C. Azure Synapse Analytics -tietokannan kutistaminen

DBCC SHRINKDATABASE (database_A);DBCC SHRINKDATABASE (database_B, 10); 

Katso myös

ALTER DATABASE (Transact-SQL)
DBCC (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)
Tietokannan kutistaminen

.

Vastaa

Sähköpostiosoitettasi ei julkaista.