Présentation
Les fichiers de données sont des objets physiques qui constituent la partie la plus importante du système de base de données car ils contiennent des données réelles. Vous pouvez considérer une base de données comme une collection de fichiers de données. Une instance vous donne les moyens de monter et d'accéder à ces fichiers.
Ici, la gestion des fichiers de données consiste à comprendre comment surveiller et redimensionner les fichiers de données existants et comment ajouter ou supprimer les fichiers de données d'une base de données.
Les codes T-SQL pour ces opérations sont présents dans la documentation Microsoft. Cependant, dans cet article, nous aimerions discuter des tactiques de gestion de ces fichiers pour ceux d'entre nous qui exécutent encore des installations sur site de SQL Server.
Types de fichiers de données et problèmes possibles
Pour chaque nouvelle base de données créée dans SQL Server, nous devons créer au moins deux fichiers :un fichier de données principal et un fichier journal.
- Le fichier de données principal porte l'extension .MDF.
- Le fichier journal a l'extension .LDF.
- Lorsque nous ajoutons des fichiers de données à une base de données SQL Server, nous utilisons généralement l'extension .NDF.
Remarque :Il est possible de créer les fichiers de données dans SQL Server sans aucune extension, mais ce n'est pas la meilleure pratique. L'utilisation de .mdf, .ndf et .ldf sert à distinguer ces fichiers lorsque nous les visualisons au niveau du système d'exploitation.
Évidemment, les fichiers de données sont créés lorsque vous créez une base de données. Vous pouvez le faire avec le CRÉER UNE BASE DE DONNÉES commande. Bien que cela semble si simple, vous devez être conscient des problèmes possibles.
En fonction de la taille de la base de données et de ses fichiers de données associés, vous pouvez être confronté à des problèmes de fragmentation et à d'autres problèmes liés au temps de sauvegarde et au déplacement de vos données. Il arrive que les fichiers de données ne soient pas correctement dimensionnés.
Regardez l'illustration ci-dessous. Il montre le résultat de l'exécution de CREATE DATABASE et de la fourniture du nom de la base de données (MyDB).
Le listing 1 montre les détails de la base de données créée :
-- 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
Vous vous demandez peut-être d'où SQL Server a obtenu toutes ces options, puisque nous n'avons fait que créer CREATE DATABASE MyDB.
SQL Server utilise les paramètres de la base de données modèle comme valeurs par défaut pour toute nouvelle base de données créée sur cette instance. Dans ce cas, nous voyons la taille de fichier initiale de 100 Mo. La croissance automatique est de 12 Mo et 64 Mo respectivement pour les fichiers de données et les fichiers journaux.
Les problèmes qui en découlent
L'implication des paramètres mis en évidence dans la figure 1 est :
- Le fichier de données principal commence à partir d'une taille de 100 Mo. C'est une petite taille. Ainsi, en fonction du niveau d'activité dans la base de données, celle-ci devra très prochainement s'agrandir.
- Chaque fois qu'il y a un besoin de croissance automatique le fichier de données, le serveur SQL doit acquérir 128 Mo à partir de l'espace disponible sur le système d'exploitation. Encore une fois, il est petit, ce qui implique que la base de données se développera automatiquement fréquemment . La croissance de la base de données est une opération coûteuse qui peut affecter les performances si elle se produit trop souvent. En outre, les croissances fréquentes des bases de données peuvent provoquer un phénomène appelé fragmentation qui, à son tour, a le don de provoquer une grave dégradation des performances des bases de données. L'autre extrême consistant à définir l'incrément sur une valeur élevée peut entraîner des opérations de croissance qui prennent du temps, en fonction des performances du système de stockage sous-jacent.
- Les fichiers de la base de données peuvent croître indéfiniment. Cela signifie qu'avec un temps suffisant, ces fichiers peuvent consommer tout l'espace sur le volume où ils se trouvent. Pour les déplacer, vous avez besoin d'un volume de leur taille ou plus. Une autre option consiste à ajouter de l'espace de stockage au volume lorsque ces fichiers sont stockés.
Ce sont des problèmes clés associés au fait de dépendre des valeurs par défaut pour créer des bases de données.
Pré-allocation
Compte tenu de l'impact de la croissance sur les performances, il serait plus logique de dimensionner correctement la base de données au début du projet. De cette façon, nous répondons aux exigences de la solution dans un avenir prévisible.
Supposons que nous sachions que notre base de données atteindra éventuellement 1 Go. Nous pourrions allouer 1 Go de stockage au démarrage du projet. Ensuite, la base de données n'a jamais besoin de croître. Il élimine les problèmes de fragmentation causés par la croissance de la base de données.
Le Listing 2 montre le script applicable pour cette pré-allocation :
-- 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
Nous mentionnons 1 Go d'espace à des fins de démonstration. En règle générale, une base de données de production peut nécessiter 1 To. Le point est :allouer l'espace nécessaire au début. Ensuite, vous éliminez ou réduisez considérablement le besoin de croissance.
Maintenant, nous devons nous demander si nous voulons vraiment un seul fichier de 1 To sur notre volume. Il serait sage de le décomposer en plus petits morceaux. Lorsque des opérations parallèles, telles que des sauvegardes, se produisent, chaque fichier sera adressé par un seul thread CPU pour un système multiprocesseur. Avec un seul fichier, ça ne se passerait pas bien.
Encore une fois, nous modifions notre script pour répondre à cette exigence dans la liste 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
Informations supplémentaires
Nous devons également mentionner qu'il n'y a aucune valeur à utiliser cette approche pour les fichiers journaux. Le fait est que SQL Server écrit toujours dans les fichiers journaux de manière séquentielle. De plus, nous avons utilisé l'extension .ndf pour les nouveaux fichiers que nous ajoutons.
La clause MAXSIZE garantit que nos fichiers de données ne se développeront pas indéfiniment. Nous avons donné à chaque fichier un nom logique et physique différent - la clause NAME spécifie le nom logique du fichier et la clause FILENAME spécifie le nom physique.
La création d'une base de données avec des fichiers de données plus volumineux prendra plus de temps qu'autrement. Il peut être plus raisonnable de créer d'abord une petite base de données, puis de la manipuler avec les commandes appropriées pour redimensionner et ajouter des fichiers, jusqu'à ce que nous établissions une structure de base de données idéale.
En créant la base de données avec des options explicites, nous avons résolu les trois problèmes soulevés précédemment dans cet article. La figure 2 montre le résultat de cette approche :
Nous avons maintenant une base de données correctement configurée pour s'adapter à la croissance des données pendant une période prolongée sans avoir besoin de la croissance des fichiers de données. Il supprime les risques de fragmentation et contribue à assurer une meilleure gestion des fichiers de données.
Gestion des fichiers de données
Au lieu de créer quatre ou cinq fichiers de données dans l'instruction CREATE DATABASE, nous pouvons utiliser les clauses MODIFY et ADD de l'instruction ALTER DATABASE T-SQL.
Encore une fois, nous commençons par la déclaration présentée dans la liste 4 ci-dessous. Il crée une base de données unique avec le fichier de données de 100 Mo et un fichier journal qui l'accompagne. Notre objectif est d'assurer la pré-allocation en étendant ce fichier, puis en ajoutant d'autres fichiers.
-- 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
Étendre les fichiers de données
L'instruction T-SQL qui étend un fichier de données est présentée dans le Listing 5. Elle spécifie le nom de la base de données, le nom du fichier, ainsi que la taille initiale et l'incrément souhaités. Dans ce cas, nous configurons SQL Server pour qu'il alloue 1 Go au démarrage, puis alloue 512 Mo pour toutes les croissances automatiques ultérieures.
-- Listing 5: Extend the Primary Datafile
USE [master]
GO
ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 1048576KB , FILEGROWTH = 524288KB )
GO
Le Listing 6 montre à quoi ressemblerait le code si nous spécifions le MAXSIZE de 2 Go :
-- 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
Si nous définissons la clause FILEGROWTH sur 0, nous configurons notre SQL Server pour qu'il ne développe pas automatiquement le fichier de données . Dans ce cas, nous devons émettre explicitement des commandes pour développer le fichier de données ou ajouter d'autres fichiers.
Ajout de fichiers de données
Le Listing 7 montre le code que nous utilisons pour ajouter un nouveau fichier de données à la base de données. Notez que nous devons à nouveau spécifier le nom de fichier logique et le nom de fichier physique qui comprend un chemin complet.
De plus, nous pouvons placer le fichier physique sur un volume différent. Pour cela, il suffit de changer le chemin.
-- 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
L'extension et l'ajout de fichiers de données s'appliquent également au scénario dans lequel nous choisissons de désactiver la croissance automatique pour nos bases de données (voir la figure 4).
Ensuite, nous devons étendre la base de données manuellement en utilisant les codes ci-dessus des listes 5 ou 6, ou ajouter des fichiers comme dans la liste 7.
Utiliser des groupes de fichiers
Les groupes de fichiers nous permettent de gérer ensemble les collections de fichiers de données. Nous pouvons logiquement regrouper certains fichiers de données stockés sur différents disques ou différents volumes en un seul groupe de fichiers. Ce groupe de fichiers crée une couche d'abstraction entre les tables et les index, et les fichiers physiques réels stockant les données.
Par conséquent, si nous créons une table sur un groupe de fichiers, les données de cette table sont réparties sur tous les fichiers de données affectés au groupe de fichiers.
Jusqu'à présent, nous n'avons traité que le groupe de fichiers PRIMARY. Le Listing 8 montre comment ajouter un nouveau fichier MyDB02 à un groupe de fichiers, autre que le groupe de fichiers principal.
La première instruction après avoir défini le contexte de la base de données sur master crée le nouveau groupe de fichiers FG01. La déclaration suivante ajoute alors le fichier à ce nouveau groupe de fichiers avec des options similaires à celles utilisées dans le Listing 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
Suppression de fichiers de données
La figure 5 montre le résultat des opérations que nous avons effectuées jusqu'à présent. Nous avons trois fichiers de données. Deux d'entre eux se trouvent dans le groupe de fichiers PRIMARY et le troisième dans le groupe de fichiers FG01.
Supposons que nous ayons fait quelque chose de mal, par exemple, défini la mauvaise taille de fichier. Ensuite, nous pouvons supprimer le groupe de fichiers en utilisant le code suivant dans le Listing 9 :
-- Listing 9: Drop Data Files
USE [MyDB]
GO
ALTER DATABASE [MyDB] REMOVE FILE [MyDB02]
GO
Conclusion
Cet article a exploré les types de fichiers de base de données, les complications possibles causées par la croissance des fichiers de données et les moyens de résoudre le problème. Nous avons également examiné les codes T-SQL pour étendre les fichiers de données et ajouter de nouveaux fichiers de données à une base de données. Nous avons également abordé l'utilisation des groupes de fichiers.
Notre objectif est de nous assurer que lorsque nous déployons des bases de données, nous préparons la base de données pour stocker toutes les données dont elle aura besoin pour une application particulière.
Références
- Fichiers et groupes de fichiers de base de données