DBCC SHRINKDATABASE (Transact-SQL)

  • 17/07/2017
  • 8 minutter at læse
    • p
    • M
    • j
    • i
    • K
    • +12

Gælder for: SQL Server (alle understøttede versioner) Azure SQL Database Azure Synapse Analytics

Krympes størrelsen af data- og logfiler i den angivne database.

Transact-SQL-syntaks-konventioner

Syntaks

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

Note

For at få vist Transact-SQL-syntaks for SQL Server 2014 og tidligere, se Dokumentation for tidligere versioner.

Argumenter

database_name | database_id | 0
Er det databasenavn eller ID, der skal krympes. 0 angiver, at den aktuelle database anvendes.

target_percent
Er den procentdel af ledig plads, der skal være tilbage i databasefilen, efter at databasen er blevet skrumpet.

NOTRUNCATE
Flytter tildelte sider fra filens ende til ikke-tildelte sider i filens forreste del. Denne handling komprimerer dataene i filen. target_percent er valgfri. Azure Synapse Analytics understøtter ikke denne indstilling.

Den frie plads i slutningen af filen returneres ikke til operativsystemet, og den fysiske størrelse af filen ændres ikke. Det ser således ud til, at databasen ikke skrumper, når du angiver NOTRUNCATE.

NOTRUNCATE gælder kun for datafiler. NOTRUNCATE påvirker ikke logfilen.

TRUNCATEONLY
Giver al ledig plads i slutningen af filen videre til operativsystemet. Flytter ikke nogen sider i filen. Datafilen krymper kun til det sidst tildelte omfang. Ignorerer target_percent, hvis den er angivet med TRUNCATEONLY. Azure Synapse Analytics understøtter ikke denne indstilling.

TRUNCATEONLY påvirker logfilen. Hvis du kun vil trunkerer datafilen, skal du bruge DBCC SHRINKFILE.

WITH NO_INFOMSGS
Undertrykker alle informationsmeddelelser, der har sværhedsgrader fra 0 til 10.

Resultatsæt

Den følgende tabel beskriver kolonnerne i resultatsættet.

Spaltenavn Beskrivelse
DbId Databaseidentifikationsnummer for den fil, som databasemotoren forsøgte at krympe.
FileId Filidentifikationsnummer for den fil, som databasemotoren forsøgte at krympe.
CurrentSize Antal 8-KB-sider, som filen i øjeblikket optager.
MinimumSize Antal 8-KB-sider, som filen som minimum kunne optage. Denne værdi svarer til filens minimumsstørrelse eller oprindeligt oprettede størrelse.
UsedPages Antal 8-KB-sider, som filen i øjeblikket bruger.
EstimatedPages Antal 8-KB-sider, som databasemotoren vurderer, at filen kan skrumpes ned til.

Note

Databasemotoren viser ikke rækker for de filer, der ikke er krympet.

Remarks

Note

Det anbefales ikke at køre denne kommando, da dette er en i/o intensiv operation og kan tage dit datawarehouse offline. Desuden vil der være omkostningsmæssige konsekvenser for dine snapshots af datawarehouset efter at have kørt denne kommando.

For at krympe alle data- og logfiler for en bestemt database skal du udføre kommandoen DBCC SHRINKDATABASE. Hvis du vil skrumpe én data- eller logfil ad gangen for en bestemt database, skal du udføre kommandoen DBCC SHRINKFILE.

Kør sp_spaceused for at få vist den aktuelle mængde ledig (ikke-allokeret) plads i databasen.

DBCC SHRINKDATABASE-operationer kan stoppes på et hvilket som helst tidspunkt i processen, og alt udført arbejde bevares.

Databasen kan ikke være mindre end databasens konfigurerede minimumsstørrelse. Du angiver minimumsstørrelsen, når databasen oprindeligt oprettes. Eller minimumsstørrelsen kan være den sidste størrelse, der eksplicit er angivet ved hjælp af en operation til ændring af filstørrelsen. Operationer som DBCC SHRINKFILE eller ALTER DATABASE er eksempler på operationer til ændring af filstørrelsen.

Lad os sige, at en database oprindeligt er oprettet med en størrelse på 10 MB i størrelse. Derefter vokser den til 100 MB. Det mindste, databasen kan reduceres til, er 10 MB, selv om alle data i databasen er blevet slettet.

Specificer enten indstillingen NOTRUNCATE eller indstillingen TRUNCATEONLY, når du kører DBCC SHRINKDATABASE. Hvis du ikke gør det, er resultatet det samme, som hvis du kører en DBCC SHRINKDATABASE-operation med NOTRUNCATE efterfulgt af en DBCC SHRINKDATABASE-operation med TRUNCATEONLY.

Den krympede database behøver ikke at være i enkeltbrugertilstand. Andre brugere kan arbejde i databasen, når den krympes, herunder systemdatabaser.

Du kan ikke krympe en database, mens der tages sikkerhedskopiering af databasen. Omvendt kan du ikke sikkerhedskopiere en database, mens en krympningsoperation på databasen er i gang.

Sådan fungerer DBCC SHRINKDATABASE

DBCC SHRINKDATABASE krymper datafiler på filbasis, men krymper logfiler, som om alle logfiler fandtes i én sammenhængende logpool. Filerne krympes altid fra slutningen.

Antag, at du har et par logfiler, en datafil og en database ved navn mydb. Data- og logfilerne er på 10 MB hver, og datafilen indeholder 6 MB data. Database Engine beregner en målstørrelse for hver fil. Denne værdi er den størrelse, som filen skal skrumpes til. Når DBCC SHRINKDATABASE angives med target_percent, beregner databasemotoren målstørrelsen som den target_percent af ledig plads i filen efter krympning.

Til eksempel, hvis du angiver en target_percent på 25 for krympning af mydb, beregner databasemotoren målstørrelsen for datafilen til 8 MB (6 MB data plus 2 MB ledig plads). Database Engine flytter derfor alle data fra datafilens sidste 2 MB til al ledig plads i datafilens første 8 MB og krymper derefter filen.

Antag, at datafilen for mydb indeholder 7 MB data. Hvis du angiver en target_percent på 30, kan denne datafil krympes til den frie procentdel på 30. Men hvis du angiver en target_percent på 40, krymper datafilen ikke, fordi databasemotoren ikke vil krympe en fil til en størrelse, der er mindre end den størrelse, som dataene i øjeblikket fylder.

Du kan også se på dette problem på en anden måde: 40 procent ønsket ledig plads + 70 procent fuld datafil (7 MB ud af 10 MB) er mere end 100 procent. Enhver target_size større end 30 vil ikke skrumpe datafilen. Den vil ikke krympe, fordi den ønskede procentdel ledig plus den aktuelle procentdel, som datafilen optager, er over 100 procent.

For logfiler bruger databasemotoren target_percent til at beregne målstørrelsen for hele logfilen. Derfor er target_percent den mængde ledig plads i logfilen efter krympningsoperationen. Målstørrelsen for hele loggen oversættes derefter til en målstørrelse for hver logfil.

DBCC SHRINKDATABASE forsøger at krympe hver fysisk logfil til målstørrelsen med det samme. Lad os sige, at ingen del af den logiske log forbliver i de virtuelle logfiler ud over målstørrelsen for logfilen. Så er filen blevet afkortet med succes, og DBCC SHRINKDATABASE afsluttes uden nogen meddelelser. Men hvis en del af den logiske logfil forbliver i de virtuelle logfiler ud over målstørrelsen, frigør databasemotoren så meget plads som muligt og udsender derefter en informationsmeddelelse. Meddelelsen beskriver, hvilke handlinger der er nødvendige for at flytte den logiske log ud af de virtuelle logfiler i slutningen af filen. Når handlingerne er udført, kan DBCC SHRINKDATABASE bruges til at frigøre den resterende plads.

En logfil kan kun krympes til en grænse for en virtuel logfil. Derfor er det muligvis ikke muligt at skrumpe en logfil til en størrelse, der er mindre end størrelsen af en virtuel logfil. Det er måske ikke muligt, selv om den ikke bliver brugt. Størrelsen af den virtuelle logfil vælges dynamisk af databasemotoren, når logfiler oprettes eller udvides.

Bedste praksis

Tænk på følgende oplysninger, når du planlægger at krympe en database:

  • En krympningsoperation er mest effektiv efter en operation, der skaber ubrugt plads, f.eks. en truncate table- eller en drop table-operation.
  • De fleste databaser kræver, at der er noget ledig plads til rådighed til almindelige daglige operationer. Du kan muligvis krympe en database gentagne gange og bemærke, at databasens størrelse vokser igen. Denne vækst indikerer, at den skrumpede plads er nødvendig til regelmæssige operationer. I disse tilfælde er gentagne gange at krympe databasen en spildt operation.
  • En krympningsoperation bevarer ikke fragmenteringstilstanden for indekser i databasen og øger generelt fragmenteringen til en vis grad. Dette resultat er endnu en grund til ikke at krympe databasen gentagne gange.
  • Medmindre du har et specifikt krav, skal du ikke indstille AUTO_SHRINK-databaseindstillingen til ON.

Forsøgning af problemer

Det er muligt at blokere krympningsoperationer af en transaktion, der kører under et rækkeversioneringsbaseret isolationsniveau. Der er f.eks. en stor sletningsoperation, der kører under et isolationsniveau baseret på rækkeversionering, i gang, når der udføres en DBCC SHRINK DATABASE-operation. Når denne situation opstår, venter shrink-operationen på, at sletteoperationen er afsluttet, før den krymper filerne. Når krympningsoperationen venter, udskriver DBCC SHRINKFILE- og DBCC SHRINKDATABASE-operationerne en informationsmeddelelse (5202 for SHRINKDATABASE og 5203 for SHRINKFILE). Denne meddelelse udskrives til SQL Server-fejlloggen hvert femte minut i den første time og derefter hver kommende time. Hvis fejlloggen f.eks. indeholder følgende fejlmeddelelse:

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. 

Denne fejl betyder, at snapshot-transaktioner, der har tidsstempler, der er ældre end 109, blokerer krympningsoperationen. Den pågældende transaktion er den sidste transaktion, som krympningsoperationen afsluttede. Den angiver også, at kolonnerne transaction_sequence_num eller first_snapshot_sequence_num i den dynamiske forvaltningsvisning sys.dm_tran_active_snapshot_database_transactions (Transact-SQL) indeholder en værdi på 15. Kolonnen transaction_sequence_num eller first_snapshot_sequence_num i visningen kan indeholde et tal, der er mindre end den sidste transaktion, der er afsluttet ved en krympningsoperation (109). Hvis det er tilfældet, venter krympningsoperationen på, at disse transaktioner afsluttes.

For at løse problemet kan du udføre en af følgende opgaver:

  • Afslut den transaktion, der blokerer for krympningsoperationen.
  • Afslut krympningsoperationen. Eventuelt udført arbejde bevares.
  • Gør ingenting, og lad krympningsoperationen vente, indtil den blokerende transaktion er afsluttet.

Permissioner

Kræver medlemskab af den faste serverrolle sysadmin eller den faste databasefunktion db_owner.

Eksempler

A. Skrumpning af en database og angivelse af en procentdel ledig plads

Det følgende eksempel reducerer størrelsen af data- og logfilerne i UserDB-brugerdatabasen, så der er 10 procent ledig plads i databasen.

DBCC SHRINKDATABASE (UserDB, 10); GO 

B. Afkortning af en database

Det følgende eksempel formindsker data- og logfilerne i AdventureWorks-prøvedatabasen til det sidst tildelte omfang.

DBCC SHRINKDATABASE (AdventureWorks2012, TRUNCATEONLY); 

C. Skrumpning af en Azure Synapse Analytics-database

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

Se også

ALTER DATABASE (Transact-SQL)
DBCC (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)
Shrinking a Database

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.