DBCC SHRINKDATABASE (Transact-SQL)

Zmniejsza rozmiar plików danych i dziennika we wskazanej bazie danych.

Topic link iconKonwencje składni języka Transact-SQL

DBCC SHRINKDATABASE 
( database_name | database_id | 0 
     [ , target_percent ] 
     [ , { NOTRUNCATE | TRUNCATEONLY } ] 
)
[ WITH NO_INFOMSGS ]

Argumenty

  • database_name | database_id | 0
    Jest to nazwa lub identyfikator bazy danych ma być ściągnąć.Jeśli określono wartość 0, używana jest bieżąca baza danych.

  • target_percent
    Jest wyrażoną w procentach ilością wolnego miejsca, która ma lewej w plik bazy danych po bazy danych ma zostać ściągnąć.

  • NOTRUNCATE
    Compacts the data in data files by moving allocated pages from the end of a file to unallocated pages in the front of the file.target_percent is optional.

    Ilość wolnego miejsca na końcu pliku nie są zwracane do systemu operacyjnego, a fizyczny rozmiar pliku nie ulega zmianie.Dlatego po określeniu NOTRUNCATE bazy danych wydaje się nie, aby zmniejszyć.

    NOTRUNCATE ma zastosowanie tylko do plików danych.Pliki dziennika nie są zagrożone.

  • TRUNCATEONLY
    Zwalnia wszystkie wolne miejsce na końcu pliku do systemu operacyjnego, ale nie wykonuje wszelkie przemieszczanie strona pliku.The data file is shrunk only to the last allocated extent.target_percent is ignored if specified with TRUNCATEONLY.

    TRUNCATEONLY ma zastosowanie tylko do plików danych.Pliki dziennika nie są zagrożone.

  • Z NO_INFOMSGS
    Pomija wszystkie komunikaty informacyjne, których poziomy ważności, od 0 do 10.

Zestawy wyników

W poniższej tabela opisano kolumny zestaw wyników.

Nazwa kolumna

Description

DbId

Baza danych numer identyfikacyjny pliku Database Engine Próba zmniejszenia.

FileId

Numer identyfikacyjny pliku pliku Database Engine Próba zmniejszenia.

CurrentSize

Liczba stron 8 KB aktualnie zajmuje plik.

MinimumSize

Liczba stron 8 KB, plik może zajmować co najmniej.To odpowiada minimalny rozmiar lub utworzony rozmiar pliku.

UsedPages

Liczba aktualnie używanych przez plik stron 8 KB.

EstimatedPages

Strony, w których liczba 8 KB Database Engine Plik może być ściągnąć do oszacowania.

Uwaga

The Database Engine does not display rows for those files not shrunk.

Remarks

Aby zmniejszyć wszystkie dane i pliki dla konkretnej bazy danych dziennika, wykonać polecenia DBCC SHRINKDATABASE.Aby zmniejszyć jeden danych lub pliku dziennika w czasie dla konkretnej bazy danych, należy wykonać DBCC SHRINKFILE polecenia.

Aby wyświetlić bieżącą ilość wolnego miejsca (nieprzydzielone) w bazie danych, należy uruchomić sp_spaceused.

DBCC SHRINKDATABASE operacje mogą zostać zatrzymane w dowolnym punkcie w procesie, a wszelkie Praca wykonana zostanie zachowane.

Baza danych nie można dokonać mniejszy niż minimalny rozmiar bazy danych.Minimalny rozmiar wynosi rozmiar, określić po utworzeniu bazy danych lub rozmiar ostatniego jawnie zestaw przy użyciu rozmiaru pliku, zmienianie działania, takie jak SHIRNKFILE DBCC lub ALTER DATABASE.Na przykład jeśli utworzony o rozmiarze 10 MB, rozmiar bazy danych zwiększa rozmiar równy 100 MB, najmniejszą bazy danych, można zmniejszyć do jest 10 MB, nawet wtedy, gdy wszystkie dane w bazie danych zostały usunięte.

Uruchomiony bez określania opcji NOTRUNCATE lub TRUNCATEONLY opcji jest równoznaczne z uruchomieniem operacji SHRINKDATABASE DBCC z NOTRUNCATE SHRINKDATABASE DBCC wraz z operacją SHRINKDATABASE DBCC z TRUNCATEONLY.

Bazy danych, przy czym ściągnąć nie musi być w trybie pojedynczego użytkownika, inni użytkownicy mogą pracować w bazie danych, gdy jest on ściągnąć.Dotyczy to baz danych systemu.

W czasie, gdy baza danych jest jest wykonywana kopia zapasowa nie może zmniejszyć bazy danych.I odwrotnie bazy danych nie kopia zapasowa Operacja zmniejszania bazy danych jest w toku.

Jak działa SHRINKDATABASE DBCC

DBCC SHRINKDATABASE zmniejsza plików danych na podstawie na pliku, ale shrinks tak, jakby istniały wszystkich plików dziennika w jednej puli dziennika sąsiadujących ze sobą pliki dziennika.Pliki są zawsze ściągnąć od zakończenia.

Załóżmy, o nazwie bazy danych mydb z pliku danych i dwa pliki dziennika.Pliki danych i dziennika znajdują się 10 MB, a plik danych zawiera 6 MB danych.

Dla każdego pliku Database Engine oblicza miejsce docelowe rozmiar. Jest to rozmiar, do której plik jest należy ściągnąć.Jeśli zostanie użyty SHRINKDATABASE DBCC target_percent, Database Engine oblicza miejsce docelowe rozmiar musi być target_percent ilość wolnego miejsca w pliku po zmniejszanie. Na przykład, jeśli określono target_percent 25 do zmniejszania mydb, the Database Engine oblicza miejsce docelowe rozmiar pliku danych jest równy 8 MB (6 MB danych oraz 2 MB wolnego miejsca na dysku). Dlatego też Database Engine Przenosi wszystkie dane z ostatnich 2 MB w pliku danych w celu zwolnienia miejsca w pierwszych 8 MB plików danych, a następnie zmniejsza pliku.

Załóżmy pliku danych mydb zawiera 7 MB danych.Określanie target_percent 30 umożliwia zmniejszył się do 30 procent wolnego tego pliku danych. Jednakże, określając target_percent 40 nie zmniejszyć pliku danych ponieważ Database Engine plik nie zostanie zmniejszony do rozmiaru mniejszego niż aktualnie zajmuje danych. Można również traktować ten problem inny sposób: wolne miejsce chciał 40 procent + 70 procent plik danych (7 MB z 10 MB) jest więcej niż 100 procent. Ponieważ procent wolnego, który jest chciał plus bieżącej wartości procentowej, która zajmuje plik danych jest ponad 100 procent (o 10 procent), wszelkie target_size większa niż 30 nie zostanie zmniejszony, plik danych.

W przypadku plików dziennika Database Engine używa target_percent do obliczania miejsce docelowe rozmiar całego dziennika; dlatego target_percent jest ilość wolnego miejsca w dzienniku po wykonaniu operacji zmniejszania. miejsce docelowe rozmiaru dla całego dziennika jest następnie tłumaczony miejsce docelowe rozmiar każdego pliku dziennika.

DBCC SHRINKDATABASE próbuje zmniejszyć każdego fizycznego pliku dziennika do rozmiaru miejsce docelowe natychmiast.Jeśli żadna część dziennika logicznych znajduje się w dziennikach wirtualnego poza rozmiar docelowego pliku dziennika, plik jest pomyślnie obcięte i SHRINKDATABASE DBCC zakończy pracę bez żadnych wiadomości.Niemniej jednak, jeśli część dziennika logicznych znajduje się w dziennikach wirtualnego poza rozmiar docelowego Database Engine zwalnia tyle miejsca, jak to możliwe, a następnie wysyła komunikat informacyjny. Zawiera opis wiadomości, jakie akcje są wymagane, aby przenieść logiczne dziennika z wirtualnego dzienników na końcu pliku.Po akcje są wykonywane, SHRINKDATABASE DBCC można zwolnić pozostałe miejsce.Aby uzyskać więcej informacji zobaczShrinking the Transaction Log.

Ponieważ plik dziennika może być tylko ściągnąć do wirtualny plik dziennika granicę, zmniejszając rozmiar mniejszy niż rozmiar pliku dziennika wirtualny plik dziennika może być niemożliwe, nawet wtedy, gdy nie jest on używany.Rozmiar pliku dziennika wirtualnego wybrano dynamicznie przez Database Engine Jeśli pliki dzienników są tworzone lub rozszerzone. Aby uzyskać więcej informacji na temat wirtualnych plików dziennika Zobacz Architektura fizyczny dziennik transakcji.

Najważniejsze wskazówki

Planując zmniejszyć bazy danych, należy wziąć pod uwagę następujące informacje:

  • Operacja zmniejszania jest najbardziej efektywne, po operacji, która tworzy partii nieużywane miejsce, takie jak tabela obcięciu lub operacją tabeli upuszczania.

  • Większość baz danych wymaga pewnych wolnego miejsca, aby były dostępne dla zwykłego codziennej pracy.Należy zauważyć, że rozmiar bazy danych powiększa się ponownie podczas wielokrotnego zmniejszyć bazy danych, oznacza to, że miejsca, które było ściągnąć jest wymagane dla zwykłych działań.W takich przypadkach wielokrotnie zmniejszania bazy danych jest operacją nieużywanego.

  • Operacja zmniejszania stanu fragmentacji indeksów w bazie danych nie zostaną zachowane, a na ogół wzrasta fragmentacji stopniu.Jest to powód innym nie, aby zmniejszyć wielokrotnie w bazie danych.

  • Jeśli użytkownik nie ma określonych wymagań, nie należy ustawiać AUTO_SHRINK opcję bazy danych na ON.

Rozwiązywanie problemów

Może się zdarzyć, że być blokowany przez transakcję, która jest uruchomiona w ramach operacji zmniejszania poziom izolacji na przechowywanie wersji wiersza.Na przykład jeżeli operacja usuwania dużych, działający w wierszu na przechowywanie wersji poziom izolacji jest w toku podczas wykonywania operacji bazy danych DBCC zmniejszyć Operacja zmniejszania będzie czekać na zakończenie przed zmniejszanie pliki operacji usuwania.Gdy tak się stanie, komunikat informacyjny (5202 dla SHRINKDATABASE i 5203 dla SHRINKFILE) do wydrukowania SHRINKFILE DBCC i SHRINKDATABASE DBCC operacji SQL Server Dziennik błędów co pięć minut w pierwszej godziny, a następnie co godzinę później. Na przykład, jeśli dziennik błędów następujący komunikat o błędzie:

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.

Oznacza to, że operacja zmniejszania jest blokowany przez transakcje migawka, które mają sygnatury czasowe starsze niż 109, który jest ostatniej transakcji, które ukończyć operacji zmniejszania.Ponadto informuje, transaction_sequence_num, or first_snapshot_sequence_num kolumnsys.dm_tran_active_snapshot_database_transactions (Transact-SQL) dynamiczny widok zarządzania zawiera wartość równą 15. Jeśli albo transaction_sequence_num, or first_snapshot_sequence_num kolumn w widoku zawiera liczbę, która jest mniejsza od ostatniej transakcji przez Operacja zmniejszania (109), Operacja zmniejszania będzie czekał na zakończenie tych transakcji zakończyć.

Aby rozwiązać ten problem, wykonaj jedną z następujących czynności:

  • Należy zakończyć transakcję, która blokuje Operacja zmniejszania.

  • Zakończenie operacji zmniejszania.Wszelkie Praca wykonana jest zachowywana.

  • Nic nie rób i pozwala na wykonanie operacji zmniejszania dopiero po zakończeniu transakcji blokowania.

Aby uzyskać więcej informacji na temat SQL Server Dziennik błędów, zobacz Viewing the SQL Server Error Log.

Uprawnienia

Członkostwo w grupie wymaga sysadmin Rola serwera lub db_owner stała rola bazy danych.

Przykłady

A.Zmniejszanie bazy danych i określając procent wolnego miejsca

W poniższym przykładzie zmniejsza rozmiar plików danych i dziennika w UserDB baza danych użytkownika, aby zezwolić na 10 procent wolnego miejsca w bazie danych.

B.Obcinanie bazy danych

W poniższym przykładzie zmniejsza pliki danych z AdventureWorks Przykładowa baza danych w zakresie przydzielonego ostatni.