Wprowadzenie
Pliki danych to obiekty fizyczne, które stanowią najważniejszą część systemu bazodanowego, ponieważ zawierają rzeczywiste dane. Możesz myśleć o bazie danych jako o zbiorze plików danych. Instancja umożliwia montowanie i dostęp do takich plików.
W tym przypadku zarządzanie plikami danych polega na zrozumieniu, jak monitorować i zmieniać rozmiar istniejących plików danych oraz jak dodawać lub usuwać pliki danych z bazy danych.
Kody T-SQL dla tych operacji znajdują się w dokumentacji firmy Microsoft. Jednak w tym artykule chcielibyśmy omówić taktykę zarządzania tymi plikami dla tych z nas, którzy nadal uruchamiają lokalne instalacje SQL Server.
Typy plików danych i możliwe problemy
Dla każdej nowej bazy danych utworzonej w SQL Server musimy mieć utworzone co najmniej dwa pliki – podstawowy plik danych i plik dziennika.
- Podstawowy plik danych ma rozszerzenie .MDF.
- Plik dziennika ma rozszerzenie .LDF.
- Gdy dodajemy pliki danych do bazy danych SQL Server, zwykle używamy rozszerzenia .NDF.
Uwaga :Możliwe jest tworzenie plików danych w SQL Server bez żadnego rozszerzenia, ale nie jest to najlepsza praktyka. Używanie .mdf, .ndf i .ldf służy do rozróżniania tych plików, gdy oglądamy je na poziomie systemu operacyjnego.
Oczywiście pliki danych są tworzone podczas tworzenia bazy danych. Możesz to zrobić za pomocą UTWÓRZ BAZĘ DANYCH Komenda. Chociaż wydaje się to takie proste, powinieneś być świadomy możliwych problemów.
W zależności od tego, jak duża będzie baza danych i powiązane z nią pliki danych, możesz napotkać problemy z fragmentacją i innymi problemami z czasem tworzenia kopii zapasowych i poruszaniem się po danych. Zdarza się, że pliki danych nie mają prawidłowego rozmiaru.
Spójrz na poniższą ilustrację. Pokazuje wynik wykonania CREATE DATABASE i podanie nazwy bazy danych (MyDB).
Listing 1 pokazuje szczegóły utworzonej bazy danych:
-- Listing 1: Create Database Script
USE [master]
GO
/****** Object: Database [MyDB] Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 102400KB , MAXSIZE = UNLIMITED, FILEGROWTH = 131072KB )
LOG ON
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 102400KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
Możesz się zastanawiać, skąd SQL Server wziął te wszystkie opcje, ponieważ jedyne, co zrobiliśmy, to wydanie CREATE DATABASE MyDB.
SQL Server używa ustawień bazy danych modelu jako wartości domyślnych dla każdej nowej bazy danych utworzonej w tym wystąpieniu. W tym przypadku widzimy początkowy rozmiar pliku 100 MB. Autowzrost wynosi odpowiednio 12 MB i 64 MB dla plików danych i dziennika.
Następujące problemy
Konsekwencje ustawień zaznaczonych na rysunku 1 to:
- Plik danych podstawowych zaczyna się od rozmiaru 100 MB. Jest to mały rozmiar. W związku z tym, w zależności od poziomu aktywności w bazie danych, wkrótce będzie musiała wzrosnąć.
- Kiedy zachodzi potrzeba automatycznego rozwoju pliku danych, serwer SQL musi uzyskać 128 MB z dostępnego miejsca w systemie operacyjnym. Znowu jest mały, co oznacza, że baza danych będzie się automatycznie rozwijać często . Wzrost bazy danych jest kosztowną operacją, która może wpłynąć na wydajność, jeśli dzieje się to zbyt często. Poza tym częste przyrosty bazy danych mogą powodować zjawisko zwane fragmentacją, które z kolei może powodować poważne pogorszenie wydajności baz danych. Druga skrajność ustawienia przyrostu na wysoką wartość może spowodować, że operacje wzrostu będą trwać długo, w zależności od wydajności bazowego systemu pamięci masowej.
- Pliki bazy danych mogą rosnąć w nieskończoność. Oznacza to, że przy odpowiednim czasie pliki te mogą zająć całą przestrzeń na woluminie, na którym się znajdują. Aby je przenieść, potrzebujesz objętości o ich rozmiarze lub większej. Inną opcją jest dodanie pamięci do woluminu, gdy te pliki są zapisane.
Są to kluczowe problemy związane z zależnością od wartości domyślnych przy tworzeniu baz danych.
Wstępna alokacja
Biorąc pod uwagę wpływ wzrostu na wydajność, bardziej sensowne byłoby prawidłowe dobranie rozmiaru bazy danych na początku projektu. W ten sposób dostosowujemy się do wymagań rozwiązania w najbliższej przyszłości.
Załóżmy, że wiemy, że nasza baza danych w końcu osiągnie rozmiar 1 GB. Po rozpoczęciu projektu możemy przydzielić 1 GB miejsca. Wtedy baza danych nigdy nie musi się powiększać. Eliminuje problemy z fragmentacją spowodowane wzrostem bazy danych.
Listing 2 przedstawia skrypt mający zastosowanie do tej przydziału wstępnego:
-- Listing 2: Create Database Script with Pre-allocation
USE [master]
GO
/****** Object: Database [MyDB] Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 1024MB , MAXSIZE = 2048MB, FILEGROWTH = 512MB )
LOG ON
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 512MB , MAXSIZE = 2048GB , FILEGROWTH = 512MB )
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
Wspominamy o 1 GB miejsca do celów demonstracyjnych. Zazwyczaj produkcyjna baza danych może wymagać 1 TB. Chodzi o to:na początku przydziel niezbędną przestrzeń. Następnie eliminujesz lub znacznie zmniejszasz potrzebę rozwoju.
Teraz musimy zadać sobie pytanie, czy naprawdę chcemy, aby na naszym woluminie znajdował się pojedynczy plik o pojemności 1 TB. Rozsądnie byłoby podzielić go na mniejsze kawałki. Gdy występują operacje równoległe, takie jak tworzenie kopii zapasowych, każdy plik będzie adresowany przez pojedynczy wątek procesora w systemie wieloprocesorowym. Z jednym plikiem nie poszłoby to gładko.
Ponownie modyfikujemy nasz skrypt, aby uwzględnić to wymaganie z Listingu 3:
-- Listing 3: Create Database Script with Pre-allocation and
USE [master]
GO
/****** Object: Database [MyDB] Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'MyDB01', FILENAME = N'C:\MSSQL\Data\MyDB01.mdf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
( NAME = N'MyDB02', FILENAME = N'C:\MSSQL\Data\MyDB02.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB )
( NAME = N'MyDB03', FILENAME = N'C:\MSSQL\Data\MyDB03.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
( NAME = N'MyDB04', FILENAME = N'C:\MSSQL\Data\MyDB04.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
( NAME = N'MyDB05', FILENAME = N'C:\MSSQL\Data\MyDB05.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB )
LOG ON
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 512MB , MAXSIZE = 2048GB , FILEGROWTH = 512MB )
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
Dodatkowe informacje
Powinniśmy również wspomnieć, że stosowanie tego podejścia do plików dziennika nie ma sensu. Chodzi o to, że SQL Server zawsze zapisuje w plikach dziennika sekwencyjnie. Ponadto użyliśmy rozszerzenia .ndf dla nowych plików, które dodajemy.
Klauzula MAXSIZE zapewnia, że nasze pliki danych nie będą rosły w nieskończoność. Każdemu plikowi nadaliśmy inną nazwę logiczną i fizyczną – klauzula NAME określa nazwę logiczną pliku, a klauzula FILENAME określa nazwę fizyczną.
Tworzenie bazy danych z większymi plikami danych zajmie więcej czasu niż w innym przypadku. Bardziej rozsądne może być najpierw utworzenie małej bazy danych, a następnie manipulowanie nią za pomocą odpowiednich poleceń, aby zmienić rozmiar i dodać pliki, dopóki nie ustanowimy idealnej struktury bazy danych.
Tworząc bazę danych z opcjami jawnymi, rozwiązaliśmy trzy problemy zgłoszone wcześniej w tym artykule. Rysunek 2 pokazuje wynik tego podejścia:
Teraz mamy odpowiednio skonfigurowaną bazę danych, aby pomieścić wzrost danych przez dłuższy czas bez konieczności powiększania pliku danych. Usuwa ryzyko fragmentacji i pomaga zapewnić lepsze zarządzanie plikami danych.
Zarządzanie plikami danych
Zamiast tworzyć cztery lub pięć plików danych w instrukcji CREATE DATABASE, możemy użyć klauzul MODIFY i ADD instrukcji ALTER DATABASE T-SQL.
Ponownie zaczynamy od stwierdzenia pokazanego na liście 4 poniżej. Tworzy pojedynczą bazę danych z plikiem danych o wielkości 100 MB i towarzyszącym plikiem dziennika. Naszym celem jest zapewnienie wstępnej alokacji poprzez rozszerzenie tego pliku, a następnie dodanie większej liczby plików.
-- Listing 4: Create Database Script
USE [master]
GO
IF EXISTS (SELECT * FROM sys.databases WHERE name='MyDB')
DROP DATABASE MyDB;
/****** Object: Database [MyDB] Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 102400KB , MAXSIZE = UNLIMITED, FILEGROWTH = 131072KB )
LOG ON
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 102400KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
Rozszerz pliki danych
Instrukcja T-SQL rozszerzająca plik danych jest pokazana na Listingu 5. Określa nazwę bazy danych, nazwę pliku oraz żądany początkowy rozmiar i przyrost. W tym przypadku ustawiamy SQL Server tak, aby przy starcie przydzielił 1 GB, a następnie przydzielił 512 MB dla wszystkich kolejnych automatycznych przyrostów.
-- Listing 5: Extend the Primary Datafile
USE [master]
GO
ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 1048576KB , FILEGROWTH = 524288KB )
GO
Listing 6 pokazuje, jak wyglądałby kod, gdy określimy MAXSIZE 2 GB:
-- Listing 6: Extend the Primary Datafile with Maximum Size
USE [master]
GO
ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 1048576KB , MAXSIZE = 2097152KB , FILEGROWTH = 524288KB )
GO
Jeśli ustawimy klauzulę FILEGROWTH na 0, ustawimy nasz serwer SQL, aby NIE zwiększał automatycznie pliku danych . W takim przypadku musimy jawnie wydać polecenia, aby powiększyć plik danych lub dodać inne pliki.
Dodawanie plików danych
Listing 7 pokazuje kod, którego używamy do dodawania nowego pliku danych do bazy danych. Zauważ, że musimy ponownie określić logiczną nazwę pliku i fizyczną nazwę pliku, która zawiera pełną ścieżkę.
Możemy również umieścić fizyczny plik na innym woluminie. W tym celu wystarczy zmienić ścieżkę.
-- Listing 7: Add Data Files to the Primary Filegroup
USE [master]
GO
ALTER DATABASE [MyDB] ADD FILE ( NAME = N'MyDB01', FILENAME = N'C:\MSSQL\Data\MyDB01.ndf' , SIZE = 1048576KB , FILEGROWTH = 524288KB ) TO FILEGROUP [PRIMARY]
GO
Rozszerzanie i dodawanie plików danych dotyczy również scenariusza, w którym zdecydujemy się wyłączyć autowzrost dla naszych baz danych (patrz rysunek 4).
Następnie musimy ręcznie rozszerzyć bazę danych za pomocą powyższych kodów z Listingu 5 lub 6 lub dodać pliki, jak w Listingu 7.
Korzystanie z grup plików
Grupy plików pozwalają nam wspólnie zarządzać zbiorami plików danych. Możemy logicznie pogrupować niektóre pliki danych przechowywane na różnych dyskach lub różnych woluminach w jedną grupę plików. Ta grupa plików tworzy warstwę abstrakcji między tabelami i indeksami oraz rzeczywistymi plikami fizycznymi przechowującymi dane.
Dlatego jeśli utworzymy tabelę w grupie plików, dane w tej tabeli zostaną rozłożone na wszystkie pliki danych przypisane do grupy plików.
Do tego momentu mieliśmy do czynienia tylko z grupą plików PRIMARY. Listing 8 pokazuje, jak możemy dodać nowy plik MyDB02 do grupy plików innej niż podstawowa grupa plików.
Pierwsza instrukcja po ustawieniu kontekstu bazy danych do wzorca tworzy nową grupę plików FG01. Następna instrukcja dodaje plik do nowej grupy plików z opcjami podobnymi do tych z Listingu 7.
-- Listing 8: Add Data Files to the Primary Filegroup
USE [master]
GO
ALTER DATABASE [MyDB] ADD FILEGROUP [FG01]
GO
ALTER DATABASE [MyDB] ADD FILE ( NAME = N'MyDB02', FILENAME = N'C:\MSSQL\Data\MyDB02.ndf' , SIZE = 102400KB , MAXSIZE = 2097152KB , FILEGROWTH = 524288KB ) TO FILEGROUP [FG01]
GO
Upuszczanie plików danych
Rysunek 5 przedstawia wyniki dotychczasowych operacji. Mamy trzy pliki danych. Dwa z nich znajdują się w grupie plików PRIMARY, a trzeci w grupie plików FG01.
Załóżmy, że zrobiliśmy coś złego, na przykład ustawiliśmy zły rozmiar pliku. Następnie możemy usunąć grupę plików za pomocą następującego kodu z Listingu 9:
-- Listing 9: Drop Data Files
USE [MyDB]
GO
ALTER DATABASE [MyDB] REMOVE FILE [MyDB02]
GO
Wniosek
W tym artykule omówiono typy plików baz danych, możliwe komplikacje spowodowane rozrostem plików danych oraz sposoby rozwiązania problemu. Zbadaliśmy również kody T-SQL służące do rozszerzania plików danych i dodawania nowych plików danych do bazy danych. Poruszyliśmy również kwestię korzystania z grup plików.
Naszym celem jest upewnienie się, że podczas wdrażania baz danych przygotowujemy bazę danych do przechowywania wszystkich danych, jakich kiedykolwiek będzie potrzebować dla konkretnej aplikacji.
Referencje
- Pliki bazy danych i grupy plików