Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Grundlagen der Verwaltung von Datendateien in SQL Server

Einführung

Datendateien sind physische Objekte, die den wichtigsten Teil des Datenbanksystems darstellen, da sie tatsächliche Daten enthalten. Sie können sich eine Datenbank als eine Sammlung von Datendateien vorstellen. Eine Instanz gibt Ihnen die Möglichkeit, solche Dateien zu mounten und darauf zuzugreifen.

Hier versteht man unter Verwalten von Datendateien, wie vorhandene Datendateien überwacht und in der Größe geändert werden und wie Datendateien zu einer Datenbank hinzugefügt oder daraus entfernt werden.

T-SQL-Codes für diese Vorgänge sind in der Microsoft-Dokumentation enthalten. In diesem Artikel möchten wir jedoch die Taktiken zur Verwaltung dieser Dateien für diejenigen von uns erörtern, die noch lokale Installationen von SQL Server ausführen.

Datendateitypen und mögliche Probleme

Für jede neue Datenbank, die in SQL Server erstellt wird, müssen mindestens zwei Dateien erstellt werden – eine primäre Datendatei und eine Protokolldatei.

  • Die primäre Datendatei hat die Erweiterung .MDF.
  • Die Protokolldatei hat die Erweiterung .LDF.
  • Wenn wir Datendateien zu einer SQL Server-Datenbank hinzufügen, verwenden wir normalerweise die Erweiterung .NDF.

Hinweis Hinweis:Es ist möglich, die Datendateien in SQL Server ohne Erweiterung zu erstellen, aber das ist nicht die beste Vorgehensweise. Die Verwendung von .mdf, .ndf und .ldf dient dazu, diese Dateien zu unterscheiden, wenn wir sie auf Betriebssystemebene betrachten.

Offensichtlich werden Datendateien erstellt, wenn Sie eine Datenbank erstellen. Sie können dies mit CREATE DATABASE tun Befehl. Obwohl es so einfach erscheint, sollten Sie sich möglicher Probleme bewusst sein.

Je nachdem, wie groß die Datenbank und die zugehörigen Datendateien schließlich werden, können Fragmentierungsprobleme und andere Probleme mit der Sicherungszeit und dem Verschieben Ihrer Daten auftreten. Es kommt vor, dass die Datendateien nicht die richtige Größe haben.

Schauen Sie sich die Abbildung unten an. Es zeigt das Ergebnis der Ausführung von CREATE DATABASE und gibt den Namen der Datenbank (MyDB) an.

Listing 1 zeigt die erstellten Datenbankdetails:

-- 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

Sie fragen sich vielleicht, woher SQL Server all diese Optionen hat, da wir lediglich CREATE DATABASE MyDB ausgegeben haben.

SQL Server verwendet Modelldatenbankeinstellungen als Standardwerte für jede neue Datenbank, die auf dieser Instanz erstellt wird. In diesem Fall sehen wir die anfängliche Dateigröße von 100 MB. Die automatische Vergrößerung beträgt 12 MB bzw. 64 MB für die Daten- und Protokolldateien.

Die sich daraus ergebenden Probleme

Die Auswirkungen der in Abbildung 1 hervorgehobenen Einstellungen sind:

  1. Die primäre Datendatei beginnt bei einer Größe von 100 MB. Es ist eine kleine Größe. Je nach Aktivitätsniveau in der Datenbank muss diese daher sehr bald wachsen.
  2. Wann immer es notwendig ist, automatisch zu wachsen Für die Datendatei muss der SQL-Server 128 MB aus dem verfügbaren Speicherplatz des Betriebssystems abrufen. Auch hier ist es klein, was bedeutet, dass die Datenbank häufig automatisch wächst . Das Datenbankwachstum ist ein teurer Vorgang, der die Leistung beeinträchtigen kann, wenn er zu oft auftritt. Außerdem kann häufiges Datenbankwachstum ein Phänomen namens Fragmentierung verursachen, das seinerseits ein Händchen für schwerwiegende Leistungseinbußen bei Datenbanken hat. Das andere Extrem, das Inkrement auf einen hohen Wert einzustellen, kann dazu führen, dass Wachstumsvorgänge lange dauern, bis sie abgeschlossen sind, abhängig von der zugrunde liegenden Speichersystemleistung.
  3. Die Datenbankdateien können unbegrenzt wachsen. Dies bedeutet, dass diese Dateien bei ausreichender Zeit den gesamten Speicherplatz auf dem Volume belegen können, auf dem sie sich befinden. Um sie zu verschieben, benötigen Sie ein Volumen ihrer Größe oder mehr. Eine weitere Option ist das Hinzufügen von Speicher zum Volume, wenn diese Dateien gespeichert sind.

Dies sind Schlüsselprobleme im Zusammenhang mit der Abhängigkeit von Standardwerten zum Erstellen von Datenbanken.

Vorabzuweisung

Angesichts der Auswirkungen des Wachstums auf die Leistung wäre es sinnvoller, die Datenbank zu Beginn des Projekts richtig zu dimensionieren. Damit tragen wir den Lösungsanforderungen für die absehbare Zukunft Rechnung.

Angenommen, wir wissen, dass unsere Datenbank irgendwann eine Größe von 1 GB erreichen wird. Wir können 1 GB Speicherplatz zuweisen, wenn das Projekt beginnt. Dann muss die Datenbank nie wachsen. Es beseitigt die Fragmentierungsprobleme, die durch das Datenbankwachstum verursacht werden.

Listing 2 zeigt das für diese Vorbelegung: anwendbare Skript

-- 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

Wir erwähnen 1 GB Speicherplatz zu Demonstrationszwecken. Normalerweise benötigt eine Produktionsdatenbank 1 TB. Der Punkt ist:Weisen Sie am Anfang den nötigen Platz zu. Dann eliminieren oder reduzieren Sie den Wachstumsbedarf erheblich.

Jetzt müssen wir uns fragen, ob wir wirklich wollen, dass eine einzelne 1-TB-Datei auf unserem Volume sitzt. Es wäre ratsam, es in kleinere Stücke zu zerlegen. Wenn parallele Operationen wie Sicherungen stattfinden, wird jede Datei von einem einzelnen CPU-Thread für ein Mehrprozessorsystem adressiert. Mit einer einzigen Datei würde es nicht reibungslos gehen.

Auch hier modifizieren wir unser Skript, um dieser Anforderung in Listing 3 gerecht zu werden:

-- 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

Zusätzliche Informationen

Wir sollten auch erwähnen, dass es keinen Wert hat, diesen Ansatz für Protokolldateien zu verwenden. Die Sache ist die, dass SQL Server immer nacheinander in Protokolldateien schreibt. Außerdem haben wir die Erweiterung .ndf für die neuen Dateien verwendet, die wir hinzufügen.

Die MAXSIZE-Klausel stellt sicher, dass unsere Datendateien nicht unbegrenzt wachsen. Wir haben jeder Datei einen anderen logischen und physikalischen Namen gegeben – die NAME-Klausel gibt den logischen Namen der Datei an, und die FILENAME-Klausel gibt den physikalischen Namen an.

Das Erstellen einer Datenbank mit größeren Datendateien dauert länger als sonst. Es kann vernünftiger sein, zuerst eine kleine Datenbank zu erstellen und sie dann mit geeigneten Befehlen zu manipulieren, um die Größe zu ändern und Dateien hinzuzufügen, bis wir eine ideale Datenbankstruktur aufgebaut haben.

Indem wir die Datenbank mit expliziten Optionen erstellt haben, haben wir die drei zuvor in diesem Artikel angesprochenen Bedenken angegangen. Abbildung 2 zeigt das Ergebnis dieses Ansatzes:

Jetzt haben wir eine Datenbank, die richtig konfiguriert ist, um das Datenwachstum über einen längeren Zeitraum zu bewältigen, ohne dass ein Datendateiwachstum erforderlich ist. Es beseitigt die Fragmentierungsrisiken und trägt zu einer besseren Datenverwaltung bei.

Datendateien verwalten

Anstatt vier oder fünf Datendateien in der CREATE DATABASE-Anweisung zu erstellen, können wir die MODIFY- und ADD-Klauseln der ALTER DATABASE T-SQL-Anweisung verwenden.

Wir beginnen wieder mit der Anweisung in Listing 4 unten. Es erstellt eine einzelne Datenbank mit der 100-MB-Datendatei und einer begleitenden Protokolldatei. Unser Ziel ist es, die Vorabzuweisung sicherzustellen, indem wir diese Datei erweitern und dann weitere Dateien hinzufügen.

-- 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

Datendateien erweitern

Die T-SQL-Anweisung, die eine Datendatei erweitert, ist in Listing 5 dargestellt. Sie gibt den Datenbanknamen, den Dateinamen und die gewünschte Anfangsgröße und Schrittweite an. In diesem Fall stellen wir den SQL Server so ein, dass er beim Start 1 GB und dann 512 MB für alle nachfolgenden automatischen Erweiterungen zuweist.

-- Listing 5: Extend the Primary Datafile
USE [master]
GO
ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 1048576KB , FILEGROWTH = 524288KB )
GO

Listing 6 zeigt, wie der Code aussehen würde, wenn wir die MAXSIZE von 2 GB angeben:

-- 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

Wenn wir die FILEGROWTH-Klausel auf 0 setzen, stellen wir unseren SQL-Server so ein, dass die Datendatei NICHT automatisch vergrößert wird . In diesem Fall müssen wir ausdrücklich Befehle erteilen, um die Datendatei zu vergrößern oder andere Dateien hinzuzufügen.

Hinzufügen von Datendateien

Listing 7 zeigt den Code, den wir verwenden, um der Datenbank eine neue Datendatei hinzuzufügen. Beachten Sie, dass wir wieder den logischen Dateinamen und den physischen Dateinamen angeben müssen, der einen vollständigen Pfad enthält.

Außerdem können wir die physische Datei auf einem anderen Volume ablegen. Dazu müssen wir nur den Pfad ändern.

-- 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

Das Erweitern und Hinzufügen von Datendateien gilt auch für das Szenario, in dem wir die automatische Vergrößerung für unsere Datenbanken deaktivieren (siehe Abbildung 4).

Dann müssen wir die Datenbank mit den obigen Codes aus Listing 5 oder 6 manuell erweitern oder Dateien wie in Listing 7 hinzufügen.

Dateigruppen verwenden

Mit Dateigruppen können wir die Sammlungen von Datendateien gemeinsam verwalten. Wir können einige Datendateien, die auf verschiedenen Festplatten oder verschiedenen Volumes gespeichert sind, logisch in einer Dateigruppe gruppieren. Diese Dateigruppe erstellt eine Abstraktionsschicht zwischen den Tabellen und Indizes und den eigentlichen physischen Dateien, in denen die Daten gespeichert sind.

Wenn wir also eine Tabelle in einer Dateigruppe erstellen, werden die Daten in dieser Tabelle auf alle Datendateien verteilt, die der Dateigruppe zugewiesen sind.

Bis zu diesem Punkt haben wir uns nur mit der PRIMARY-Dateigruppe befasst. Listing 8 zeigt, wie wir eine neue Datei MyDB02 hinzufügen können in eine andere Dateigruppe als die primäre Dateigruppe.

Die erste Anweisung nach dem Festlegen des Datenbankkontexts auf master erstellt die neue Dateigruppe FG01. Die nächste Anweisung fügt die Datei dann dieser neuen Dateigruppe mit ähnlichen Optionen wie denen in Listing 7.

hinzu
-- 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

Löschen von Datendateien

Abbildung 5 zeigt das Ergebnis der bisher durchgeführten Operationen. Wir haben drei Datendateien. Zwei davon befinden sich in der PRIMARY-Dateigruppe und die dritte in der FG01-Dateigruppe.

Nehmen wir an, wir haben etwas falsch gemacht, zum Beispiel die falsche Dateigröße eingestellt. Dann können wir die Dateigruppe mit dem folgenden Code in Listing 9 löschen:

-- Listing 9: Drop Data Files
USE [MyDB]
GO
ALTER DATABASE [MyDB]  REMOVE FILE [MyDB02]
GO

Schlussfolgerung

In diesem Artikel wurden die Datenbankdateitypen, die möglichen Komplikationen, die durch das Wachstum der Datendateien verursacht werden, und die Möglichkeiten zur Lösung des Problems untersucht. Außerdem haben wir die T-SQL-Codes zum Erweitern von Datendateien und Hinzufügen neuer Datendateien zu einer Datenbank untersucht. Wir haben auch die Verwendung von Dateigruppen angesprochen.

Unser Ziel ist es sicherzustellen, dass wir bei der Bereitstellung von Datenbanken die Datenbank darauf vorbereiten, alle Daten zu speichern, die sie jemals für eine bestimmte Anwendung benötigen wird.

Referenzen

  1. Datenbankdateien und Dateigruppen