Udostępnij za pośrednictwem


DBCC SHRINKFILE (Transact-SQL)

Zmniejsza rozmiar określonego pliku danych lub dziennika z bieżącej bazy danych lub opróżnia pliku przez przeniesienie danych z określonego pliku do innych plików w tej samej grupa plików, dzięki czemu plik ma zostać usunięty z bazy danych.Plik można zmniejszyć rozmiar jest mniejszy niż rozmiar określony, gdy został utworzony.Ta opcja resetuje minimalnego rozmiaru pliku do nowej wartości.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

DBCC SHRINKFILE 
(
    { file_name | file_id } 
    { [ , EMPTYFILE ] 
    | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ]
    }
)
[ WITH NO_INFOMSGS ]

Argumenty

  • file_name
    Jest nazwa logiczna pliku, aby ściągnąć.

  • file_id
    To numer identyfikacyjny (ID) plik, aby ściągnąć.Aby uzyskać identyfikator pliku, należy użyć FILE_IDEX systemu, funkcja lub kwerendę sys.database_files katalogu widoku w bieżącej bazie danych.

  • target_size
    To rozmiar pliku w megabajtach, wyrażona jako liczba całkowita.Jeśli nie określono DBCC SHRINKFILE zmniejsza rozmiar domyślny rozmiar pliku.Rozmiar domyślny wynosi rozmiar określony, gdy plik został utworzony.

    Ostrzeżenie

    Można zmniejszyć rozmiar domyślny pusty plik przy użyciu DBCC SHRINKFILE target_size.Na przykład po utworzeniu pliku 5 MB i następnie zwiń 3 MB pliku, gdy plik jest nadal pusty domyślny rozmiar pliku jest zestaw na 3 MB.Dotyczy to tylko puste pliki, które nigdy nie zawierały dane.

    Jeśli target_size określono DBCC SHRINKFILE próbuje zmniejszyć plik określonego rozmiaru.Używanych stron część pliku, który ma być zwolnione są przeniesiona do wolnego miejsca w części pliku zachowywane.Na przykład, jeśli plik 10 MB danych operacji DBCC SHRINKFILE z target_size 8 powoduje, że wszystkie strony używane w ostatnich 2 MB pliku do ponownego przydzielenia do wszystkich stron nieprzydzielone w pierwszym 8 MB pliku.DBCC SHRINKFILE nie zmniejsza się plik w przeszłości rozmiar niezbędne do przechowywania danych w pliku.Na przykład, jeśli używana jest 7 MB pliku danych 10 MB, DBCC SHRINKFILE instrukcja z target_size 6 zmniejsza pliku tylko 7 MB, nie 6 MB.

  • EMPTYFILE
    Migruje wszystkie dane z określonego pliku do innych plików w tej samej grupa plików.Ponieważ Aparat baz danych nie zezwala już dane umieszczone w pliku pusty plik można usunąć za pomocą ALTER DATABASE instrukcja.

  • NOTRUNCATE
    Przenosi przydzielonych stron od końca pliku danych nieprzydzielone stron na początku pliku, z lub bez określania target_percent.Wolne miejsce na końcu pliku nie jest zwracana do systemu operacyjnego i nie zmienia fizyczny rozmiar pliku.W związku z tym gdy określono NOTRUNCATE plik jest prawdopodobnie nie 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 wewnątrz pliku.Plik danych jest ściągnąć tylko do ostatniego przydzielonego fragment.

    target_sizejest ignorowana, jeśli określony z TRUNCATEONLY.

    TRUNCATEONLY ma zastosowanie tylko do plików danych.

  • Z NO_INFOMSGS
    Pomija wszystkie komunikaty informacyjne.

Zestawy wyników

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

Nazwa kolumny

Opis

Identyfikator DbId

Baza danych numer identyfikacyjny pliku Aparat baz danych próbował zmniejszania.

Identyfikator FileId

Numer identyfikacyjny pliku plik Aparat baz danych próbował zmniejszania.

CurrentSize

Liczba stron 8 KB, który obecnie zajmuje plik.

Wartość MinimumSize

Liczba stron 8 KB, który plik może zajmować co najmniej.Minimalny rozmiar odpowiada, lub utworzony rozmiar pliku.

UsedPages

Liczba aktualnie używanych przez plik stron 8 KB.

EstimatedPages

Numer 8 KB strony, w których Aparat baz danych szacunków, plik może być zmniejszył się niedziałający do.

Uwagi

DBCC SHRINKFILE stosuje się do plików w bieżącej bazie danych.Aby uzyskać więcej informacji na temat zmiany bieżącej bazy danych, zobacz UŻYJ języka Transact-SQL).

DBCC SHRINKFILE operacji może być zatrzymana na każdym etapie procesu i wszelkich Praca wykonana jest zachowywana.

W przypadku niepowodzenia operacji DBCC SHRINKFILE spowodował błąd.

Bazy danych, przy czym ściągnąć nie musi być w tryb jednego użytkownika; inni użytkownicy mogą pracować w bazie danych, aby ściągnąć plik.Nie trzeba uruchomić wystąpienie SQL Server w tryb jednego użytkownika do zmniejszania bazy danych systemu.

Zmniejszanie pliku dziennika

Dla plików dziennika Aparat baz danych korzysta z target_size do obliczania rozmiaru miejsce docelowe dla całego dziennika; w związku z tym target_size jest ilość wolnego miejsca w dzienniku po operacji zmniejszania.Docelowy rozmiar dziennika całego następnie jest tłumaczony na miejsce docelowe rozmiar każdego pliku dziennika.DBCC SHRINKFILE próbuje bezpośrednio zmniejszyć każdego fizycznego pliku dziennika do rozmiaru miejsce docelowe .Jednakże, jeśli część dziennika logicznych znajduje się w dziennikach wirtualnego poza rozmiar miejsce docelowe Aparat baz danych zwalnia tyle miejsca, jak to możliwe, a następnie wysyła komunikat informacyjny.Wiadomości opisano, jakie akcje są wymagane do przenoszenia logiczne dziennika z dzienników wirtualnych na końcu pliku.Po akcje są wykonywane, można DBCC SHRINKFILE pozostałe miejsca.Aby uzyskać więcej informacji, zobacz Zmniejszanie dziennika transakcji.

Ponieważ pliku dziennika można ściągnąć tylko do granicy wirtualny plik dziennika , zmniejszając rozmiar mniejszy niż rozmiar wirtualny plik dziennika pliku dziennika może nie być możliwe, nawet jeśli nie jest on używany.Rozmiar wirtualny plik dziennika wybrano dynamicznie przez Aparat baz danych podczas tworzenia lub rozszerzania plików dziennika.Aby uzyskać więcej informacji o plikach dziennika wirtualnych, zobacz Fizycznej architektury dziennika transakcji.

Najważniejsze wskazówki

Planując zmniejszyć plik, 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 obcięciu tabela lub tabela .

  • Większość baz danych wymaga trochę wolnego miejsca, które mają być dostępne dla regularnych codziennej pracy.Jeśli wielokrotnie zmniejszania bazy danych i Zauważ, że rozmiar bazy danych powiększa się ponownie, oznacza to, że został ściągnąć miejsca jest wymagana dla regularnych operacji.W takich przypadkach wielokrotnie zmniejszania bazy danych jest nieużywanego operacji.

  • Operacja zmniejszania nie zachowuje stan fragmentacji indeksów w bazie danych i zazwyczaj zwiększa fragmentacji stopniu.Jest to innym powodem nie wielokrotnie zmniejszania bazy danych.

Rozwiązywanie problemów

W tej sekcji opisano sposób zdiagnozować i rozwiązać problemy występujące podczas uruchamiania polecenia DBCC SHRINKFILE.

Plik nie zmniejsza się

Jeśli operacja zmniejszania działającą bez błędów, ale plik nie uległy zmianie rozmiaru, sprawdź, czy plik ma odpowiednia ilość wolnego miejsca, aby usunąć, wykonując jedną z następujących czynności:

  • Uruchom następującą kwerendę.

    SELECT name ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB
    FROM sys.database_files;
    
  • Uruchom dbcc sqlperf polecenie, aby powrócić do miejsca w dzienniku transakcji.

Jeśli dostępny jest za mało wolnego miejsca, Operacja zmniejszania nie można zmniejszyć rozmiar pliku wszelkie dalsze.

Zazwyczaj jest plik dziennika, który wydaje się nie zmniejszać.Zazwyczaj jest to wynikiem pliku dziennika, który nie został obcięty.Dziennik można skrócić, ustawiając prostego modelu odzyskiwanie bazy danych lub wykonywania kopii zapasowych dziennika, a następnie uruchamiając ponownie operacji DBCC SHRINKFILE.Aby uzyskać więcej informacji, zobacz Obcinania dziennika transakcji i Zmniejszanie dziennika transakcji.

Operacja zmniejszania jest zablokowany.

Jest możliwe dla operacji zmniejszania zablokowane przez transakcję, która jest uruchomiona w ramach wersji na podstawie wierszy poziom izolacji.Na przykład jeśli operacja usuwania duże, działający w wersji na podstawie wiersza poziom izolacji jest w toku, podczas wykonywania operacji DBCC zmniejszyć w bazie danych, Operacja zmniejszania będzie czekać na operacji usuwania móc zmniejszania plików.W takiej sytuacji operacji DBCC SHRINKFILE i DBCC SHRINKDATABASE wydrukować komunikat informacyjny (5202 dla SHRINKDATABASE) i 5203 SHRINKFILE do serwera SQL dziennik błędów co pięć minut w pierwszej godziny i następnie co godzinę po.Na przykład, jeśli dziennik błędów zawiera następujący komunikat o błędzie:

DBCC SHRINKFILE for file ID 1 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 transakcji migawka , które mają sygnatury czasowe starsze niż 109, która jest ostatnia transakcja zakończonej operacji zmniejszenia.On również wskazuje, że transaction_sequence_num, lub first_snapshot_sequence_num kolumn w sys.dm_tran_active_snapshot_database_transactions dynamiczny widok zarządzania zawiera wartości 15.Jeśli transaction_sequence_num, lub first_snapshot_sequence_num kolumn w widoku zawiera liczbę, która jest mniejsza od ostatniej transakcji przez operacji zmniejszenia (109), Operacja zmniejszania będzie czekać do zakończenia tych transakcji.

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

  • Zakończyć transakcję, która blokuje operacji zmniejszenia.

  • Zakończenie operacji zmniejszenia.Jeśli operacja zmniejszania jest zakończone, wszelkie Praca wykonana jest zachowywana.

  • Nic nie rób i umożliwić operacji zmniejszenia dopiero po zakończeniu transakcja blokująca .

Aby uzyskać więcej informacji o SQL Server dziennik błędów, zobacz Wyświetlanie SQL Server dziennik błędów.

Uprawnienia

Wymaga członkostwa w sysadmin stała rola serwera lub db_owner rola bazy danychstałej.

Przykłady

A.Zmniejszanie rozmiaru określonego miejsce docelowe pliku danych

Poniższy przykład zmniejsza rozmiar pliku danych o nazwie DataFile1 w UserDB baza danych użytkownika 7 MB.

USE UserDB;
GO
DBCC SHRINKFILE (DataFile1, 7);
GO

B.Zmniejszanie pliku dziennika do rozmiaru określonego miejsce docelowe

Poniższy przykład zmniejsza w pliku dziennika AdventureWorks2008R2 bazy danych do 1 MB.Aby zezwolić na polecenie DBCC SHRINKFILE, aby zmniejszyć plik, plik jest obcinana najpierw przez ustawienie PROSTEGO modelu odzyskiwanie bazy danych.

USE AdventureWorks2008R2;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2008R2_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY FULL;
GO

C.Obcinanie pliku danych

Poniższy przykład obcina plik danych podstawowych w AdventureWorks2008R2 bazy danych.sys.database_files Widok wykazu zostanie poproszony o uzyskanie file_id z pliku danych.

USE AdventureWorks2008R2;
GO
SELECT file_id, name
FROM sys.database_files;
GO
DBCC SHRINKFILE (1, TRUNCATEONLY);

D.Opróżnianie pliku

Poniższy przykład ilustruje procedury opróżniania pliku, dzięki czemu mogą być usunięte z bazy danych.Do celów w tym przykładzie najpierw jest tworzony plik danych i zakłada się, że plik zawiera dane.

USE AdventureWorks2008R2;
GO
-- Create a data file and assume it contains data.
ALTER DATABASE AdventureWorks2008R2 
ADD FILE (
    NAME = Test1data,
    FILENAME = 'C:\t1data.ndf',
    SIZE = 5MB
    );
GO
-- Empty the data file.
DBCC SHRINKFILE (Test1data, EMPTYFILE);
GO
-- Remove the data file from the database.
ALTER DATABASE AdventureWorks2008R2
REMOVE FILE Test1data;
GO