Czy włączenie automatycznego zmniejszania programu SQL Server jest bezpieczne?

44

Istnieje wiele opcji SQL Server, które można włączyć dla baz danych, a jedną z najbardziej niezrozumianych jest automatyczne zmniejszanie. Czy to jest bezpieczne? Jeśli nie, dlaczego nie?

Paul Randal
źródło

Odpowiedzi:

70

(Początkowo zadałem zwykłe pytanie, ale potem znalazłem poprawną metodę - dzięki BrentO)

Nie, nigdy.

Spotkałem się z tym kilka razy na ServerFault i chcę dotrzeć do miłej szerokiej publiczności z kilkoma dobrymi radami. Jeśli ludzie patrzą na to z niechęcią, głosujcie, a chętnie to usunę.

Automatyczne zmniejszanie jest bardzo częstym ustawieniem bazy danych, które można włączyć. To wydaje się dobrym pomysłem - usuń dodatkowe miejsce z bazy danych. Istnieje wiele „mimowolnych DBA” (na przykład TFS, SharePoint, BizTalk lub zwykły stary SQL Server), którzy mogą nie wiedzieć, że automatyczne zmniejszanie jest zdecydowanie złe.

Podczas pracy w firmie Microsoft byłem właścicielem aparatu SQL Server Storage Engine i próbowałem usunąć funkcję automatycznego zmniejszania, ale musiałem pozostać w celu zachowania zgodności z poprzednimi wersjami.

Dlaczego automatyczne zmniejszanie jest tak złe?

Baza danych prawdopodobnie znów wzrośnie, więc po co ją zmniejszać?

  1. Shrink-grow-shrink-grow powoduje fragmentację na poziomie systemu plików i zajmuje dużo zasobów.
  2. Nie możesz kontrolować, kiedy to się uruchamia (nawet jeśli jest normalne)
  3. Zużywa wiele zasobów. Przenoszenie stron w bazie danych wymaga procesora, wielu operacji we / wy i generuje wiele dzienników transakcji.
  4. Oto prawdziwy kicker: zmniejszenie pliku danych (czy to automatycznie, czy nie) powoduje ogromne rozdrobnienie indeksu, co prowadzi do niskiej wydajności.

Niedawno napisałem post na blogu, który zawiera przykładowy skrypt SQL, który pokazuje problemy, które powoduje, i wyjaśnia bardziej szczegółowo. Zobacz Automatyczne zmniejszanie - wyłącz je! (brak reklam lub takich śmieci na moim blogu). Nie należy mylić tego ze zmniejszaniem pliku dziennika, który jest przydatny i potrzebny czasami.

Zrób więc sobie przysługę - sprawdź ustawienia bazy danych i wyłącz automatyczne zmniejszanie. Z tego samego powodu nie powinieneś również kurczyć się w planach konserwacji. Przekaż słowo swoim współpracownikom.

Edycja: Powinienem to dodać, przypominając drugą odpowiedź - powszechne jest błędne przekonanie, że przerwanie operacji zmniejszania może spowodować uszkodzenie. Nie, nie będzie. Kiedyś byłem właścicielem kodu skurczowego w SQL Server - wycofuje on bieżący ruch strony, który wykonuje, jeśli zostanie przerwany.

Mam nadzieję że to pomoże!

Paul Randal
źródło
Czy istnieje sposób na ponowne indeksowanie zaraz po zmniejszeniu?
Lance Roberts
4
Nie reindeksuj, ponieważ spowoduje to ponowne powiększenie pliku (buduje nowy indeks przed upuszczeniem starego), ale przeprowadzenie reorganizacji (przez mój stary DBCC INDEXDEFRAG lub nowy ALTER INDEX ... REORGANIZE) usunie fragmentację, kosztem więcej IO, procesor, logowanie ...
Paul Randal
Zauważyłem, że po usunięciu autoshrink zużycie pamięci srrver jest wyższe.
user193655
4

Oczywiście Paul ma rację.

Zobacz wszystkie bazy danych i ich ustawienia automatycznego nawiązywania połączenia. Jeśli masz dużo baz danych, jedna z nich się wkradnie.

sp_msforeachdb  @command1 = 'Select ''[?]'',DATABASEPROPERTYEX(''?'',''IsAutoShrink'')'

Czy to gdzieś w dmv ... Zastanawiam się.

Sam
źródło
2
sys.databases ma pole is_auto_shrink (i is_auto-close, is_auto_update_stats itp.)
Paul Randal
wonderful im googling: w jaki sposób mam raport, który pomaga nam wiedzieć, które dbs skonfigurowane jako autoshrink i twój kod działa poprawnie i generuje dobry raport z całej
bazy danych
2

To nie jest „niebezpieczne” - niczego nie uszkodzi.

Nie jest to jednak zalecane w środowiskach produkcyjnych, w których baza danych może zdecydować się na uruchomienie i przeprowadzenie kosztownej zmiany układu bezpośrednio przed nadejściem stosu żądań, co powoduje, że żądania te wymagają więcej czasu. O wiele lepiej jest korzystać z planowania operacji zmniejszania wraz z innymi operacjami konserwacji, takimi jak tworzenie kopii zapasowych (w rzeczywistości po wykonaniu kopii zapasowych - w ten sposób będzie więcej z dziennika transakcji). Lub po prostu wcale się nie kurczy, chyba że wystąpi problem ze wzrostem - zawsze możesz skonfigurować monitor, aby poinformować Cię, kiedy niewykorzystana przydzielona przestrzeń wzrośnie powyżej określonego współczynnika lub ustalonego rozmiaru.

IIRC opcja jest domyślnie wyłączona dla wszystkich baz danych we wszystkich edycjach MSSQL oprócz Express.

David Spillett
źródło
2
Kurczenia nie powinny być planowane - powinny być naprawdę rzadkimi operacjami z powodu problemów, które powodują. Nie rozumiem twojego komentarza na temat zmniejszania po utworzeniu kopii zapasowej - rekordy dziennika wygenerowane przez operację zmniejszania zostaną pobrane przez następną kopię zapasową dziennika transakcji bez względu na to, kiedy to zrobisz lub jakie inne kopie zapasowe wykonasz. Dzięki
Paul Randal
1

W witrynie TechNet dostępny jest oficjalny dokument wyjaśniający bardziej szczegółowo obsługę SQL.

http://technet.microsoft.com/en-us/library/cc262731.aspx

Jeremy Thake
źródło
Niestety ten oficjalny dokument jest przeznaczony tylko dla instalacji programu SharePoint i rzeczywiście zawiera pewne błędy. Właśnie spędziłem czas, ucząc bieżącej klasy SharePoint MCM z autorem oficjalnego dokumentu, Billem Baerem.
Paul Randal
3
Dobre ogólne wprowadzenie do konserwacji baz danych znajduje się w moim artykule TechNet Magazine na temat Skuteczna konserwacja baz danych - technet.microsoft.com/en-us/magazine/cc671165.aspx .
Paul Randal
1

Widziałem serwer SQL z włączoną funkcją Autogrow i Autoshrink. Ten (stosunkowo mocny) serwer był strasznie wolny, ponieważ wszystko, co robił przez cały dzień, zmniejszało się i powiększało pliki bazy danych. Autoshrink może być użyteczny, ale polecam dwie rzeczy:

  1. Domyślnie wyłącz Autoshrink.
  2. Dokumentuj konfiguracje serwera, abyś wiedział, gdzie są włączone Autogrow i Autoshrink, a gdzie nie.
Carl C.
źródło
1

Jedyną sytuacją, w której zmuszono mnie do zmniejszenia bazy danych, było odświeżenie kopii na serwerze testowym z mniejszą ilością miejsca na dysku (niewystarczające do przechowywania produkcyjnej bazy danych).

Plik (-y) produkcyjnej bazy danych miał dużo wolnego miejsca, niestety musisz przywrócić bazę danych o tych samych rozmiarach plików, co kopia zapasowa. Więc nie miałem wyboru, musiałem zmniejszyć produkcję przed jej utworzeniem. (Zmniejszenie trwało wieki, zużyto dużo zasobów, a późniejszy wzrost dziennika transakcji był problematyczny).

SuperCoolMoss
źródło