sql >> Database >  >> RDS >> Sqlserver

Grondbeginselen van het beheren van gegevensbestanden in SQL Server

Inleiding

Gegevensbestanden zijn fysieke objecten die het belangrijkste onderdeel van het databasesysteem vormen, aangezien ze actuele gegevens bevatten. U kunt een database zien als een verzameling gegevensbestanden. Een instantie geeft u de mogelijkheid om dergelijke bestanden te koppelen en te openen.

In dit geval is het beheren van gegevensbestanden begrijpen hoe u bestaande gegevensbestanden kunt controleren en vergroten of verkleinen en hoe u de gegevensbestanden kunt toevoegen aan of verwijderen uit een database.

T-SQL-codes voor deze bewerkingen zijn aanwezig in de Microsoft-documentatie. In dit artikel willen we echter de tactieken bespreken om deze bestanden te beheren voor degenen onder ons die nog steeds lokale installaties van SQL Server uitvoeren.

Typen gegevensbestanden en mogelijke problemen

Voor elke nieuwe database die in SQL Server wordt gemaakt, moeten we ten minste twee bestanden hebben gemaakt:een primair gegevensbestand en een logbestand.

  • Het primaire gegevensbestand heeft de extensie .MDF.
  • Het logbestand heeft de extensie .LDF.
  • Als we gegevensbestanden toevoegen aan een SQL Server-database, gebruiken we meestal de .NDF-extensie.

Opmerking :Het is mogelijk om de datafiles in SQL Server aan te maken zonder enige extensie, maar dat is niet de best practice. Het gebruik van .mdf, .ndf en .ldf dient om deze bestanden te onderscheiden wanneer we ze op besturingssysteemniveau bekijken.

Uiteraard worden databestanden aangemaakt wanneer u een database aanmaakt. U kunt het doen met de CREATE DATABASE opdracht. Hoewel het zo eenvoudig lijkt, moet u op de hoogte zijn van mogelijke problemen.

Afhankelijk van hoe groot de database en de bijbehorende gegevensbestanden uiteindelijk worden, kunt u te maken krijgen met fragmentatieproblemen en andere problemen met de back-uptijd en het verplaatsen van uw gegevens. Het komt voor dat de databestanden niet de juiste grootte hebben.

Kijk eens naar de onderstaande illustratie. Het toont het resultaat van het uitvoeren van CREATE DATABASE en het opgeven van de naam van de database (MyDB).

Lijst 1 toont de aangemaakte databasedetails:

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

Je vraagt ​​je misschien af ​​waar SQL Server al die opties vandaan heeft gehaald, aangezien we alleen maar CREATE DATABASE MyDB hebben uitgegeven.

SQL Server gebruikt modeldatabase-instellingen als standaardwaarden voor elke nieuwe database die op dat exemplaar is gemaakt. In dit geval zien we de initiële bestandsgrootte van 100 MB. De autogrowth is respectievelijk 12 MB en 64 MB voor de gegevens- en logbestanden.

De daaropvolgende problemen

De implicaties van de instellingen die in Afbeelding 1 zijn gemarkeerd, zijn:

  1. Het primaire gegevensbestand begint vanaf de grootte van 100 MB. Het is een kleine maat. Dus, afhankelijk van het activiteitsniveau in de database, zal het zeer snel moeten groeien.
  2. Als er behoefte is aan autogrow het gegevensbestand, moet de SQL-server 128 MB verwerven uit de beschikbare ruimte op het besturingssysteem. Nogmaals, het is klein, wat inhoudt dat de database vaak automatisch zal groeien . De databasegroei is een dure operatie die de prestaties kan beïnvloeden als deze te vaak gebeurt. Bovendien kan frequente databasegroei een fenomeen veroorzaken dat fragmentatie wordt genoemd, dat op zijn beurt de gave heeft om ernstige prestatievermindering op databases te veroorzaken. Het andere uiterste van het instellen van de verhoging op een hoge waarde kan ertoe leiden dat groeibewerkingen lang duren om te voltooien, afhankelijk van de onderliggende prestaties van het opslagsysteem.
  3. De databasebestanden kunnen onbeperkt groeien. Het betekent dat, met voldoende toegestane tijd, deze bestanden alle ruimte kunnen innemen op het volume waar ze zich bevinden. Om ze te verplaatsen, hebt u een volume van hun grootte of meer nodig. Een andere optie is het toevoegen van opslagruimte aan het volume wanneer deze bestanden aanwezig zijn.

Dit zijn belangrijke problemen die samenhangen met het afhankelijk zijn van standaardwaarden voor het maken van databases.

Pre-toewijzing

Gezien de prestatie-impact van groei, zou het logischer zijn om de database aan het begin van het project de juiste grootte te geven. Op deze manier komen we tegemoet aan de oplossingsvereisten voor de nabije toekomst.

Stel dat we weten dat onze database uiteindelijk 1 GB groot zal worden. We kunnen 1 GB opslagruimte toewijzen wanneer het project start. Dan hoeft de database nooit te groeien. Het elimineert de fragmentatieproblemen die worden veroorzaakt door de databasegroei.

Lijst 2 toont het script dat van toepassing is op deze pre-toewijzing:

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

We noemen 1 GB aan ruimte voor demonstratiedoeleinden. Voor een productiedatabase is doorgaans 1 TB nodig. Het punt is:wijs aan het begin de nodige ruimte toe. Dan elimineer je of verminder je de behoefte aan groei aanzienlijk.

Nu moeten we ons afvragen of we echt een enkel 1TB-bestand op ons volume willen hebben. Het is verstandig om het op te splitsen in kleinere stukjes. Wanneer parallelle bewerkingen, zoals back-ups, plaatsvinden, wordt elk bestand geadresseerd door een enkele CPU-thread voor een systeem met meerdere processors. Met een enkel bestand zou het niet soepel verlopen.

Nogmaals, we passen ons script aan om aan deze eis te voldoen in Listing 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

Aanvullende informatie

We moeten ook vermelden dat het geen waarde heeft om deze benadering voor logbestanden te gebruiken. Het punt is dat SQL Server altijd sequentieel naar logbestanden schrijft. We hebben ook de .ndf-extensie gebruikt voor de nieuwe bestanden die we toevoegen.

De MAXSIZE-clausule zorgt ervoor dat onze gegevensbestanden niet oneindig groeien. We hebben elk bestand een andere logische en fysieke naam gegeven – de clausule NAME specificeert de logische naam van het bestand en de FILENAME-clausule specificeert de fysieke naam.

Het maken van een database met grotere databestanden kost meer tijd dan anders. Het is misschien redelijker om eerst een kleine database te maken en deze vervolgens te manipuleren met de juiste commando's om het formaat te wijzigen en bestanden toe te voegen, totdat we een ideale databasestructuur hebben vastgesteld.

Door de database met expliciete opties te maken, hebben we de drie zorgen aangepakt die eerder in dit artikel zijn geuit. Figuur 2 toont het resultaat van deze aanpak:

Nu hebben we een database die correct is geconfigureerd om de gegevensgroei voor een langdurige periode op te vangen zonder dat er groei van gegevensbestanden nodig is. Het verwijdert de fragmentatierisico's en zorgt voor een beter beheer van gegevensbestanden.

Gegevensbestanden beheren

In plaats van vier of vijf gegevensbestanden te maken in de CREATE DATABASE-instructie, kunnen we de MODIFY- en ADD-clausules van de ALTER DATABASE T-SQL-instructie gebruiken.

Nogmaals, we beginnen met de verklaring die wordt weergegeven in Lijst 4 hieronder. Het creëert een enkele database met het 100 MB-gegevensbestand en een bijbehorend logbestand. Ons doel is om een ​​pre-toewijzing te garanderen door dit bestand uit te breiden en vervolgens meer bestanden toe te voegen.

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

Gegevensbestanden uitbreiden

De T-SQL-instructie die een gegevensbestand uitbreidt, wordt weergegeven in Listing 5. Het specificeert de databasenaam, de bestandsnaam en de gewenste initiële grootte en toename. In dit geval hebben we de SQL Server ingesteld om 1 GB toe te wijzen bij het starten en vervolgens 512 MB toe te wijzen voor alle volgende automatische groei.

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

Lijst 6 laat zien hoe de code eruit zou zien als we de MAXSIZE van 2GB specificeren:

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

Als we de FILEGROWTH-clausule op 0 zetten, stellen we onze SQL Server in om het gegevensbestand NIET automatisch te laten groeien . In dit geval moeten we expliciet opdrachten geven om het gegevensbestand te laten groeien of andere bestanden toe te voegen.

Gegevensbestanden toevoegen

Listing 7 toont de code die we gebruiken om een ​​nieuw gegevensbestand aan de database toe te voegen. Merk op dat we opnieuw de logische bestandsnaam en de fysieke bestandsnaam moeten specificeren die een volledig pad bevat.

Ook kunnen we het fysieke bestand op een ander volume plaatsen. Daarvoor hoeven we alleen het pad te wijzigen.

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

Het uitbreiden en toevoegen van databestanden is ook van toepassing op het scenario waarin we ervoor kiezen om autogrowth voor onze databases uit te schakelen (zie figuur 4).

Dan moeten we de database handmatig uitbreiden met behulp van de bovenstaande codes uit Listing 5 of 6, of bestanden toevoegen zoals in Listing 7.

Bestandsgroepen gebruiken

Met bestandsgroepen kunnen we de verzamelingen van gegevensbestanden samen beheren. We kunnen enkele gegevensbestanden die op verschillende schijven of verschillende volumes zijn opgeslagen logisch in één bestandsgroep groeperen. Die bestandsgroep creëert een abstractielaag tussen de tabellen en indexen, en de daadwerkelijke fysieke bestanden die de gegevens opslaan.

Als we daarom een ​​tabel voor een bestandsgroep maken, worden de gegevens in deze tabel verspreid over alle gegevensbestanden die aan de bestandsgroep zijn toegewezen.

Tot nu toe hebben we alleen met de PRIMARY bestandsgroep te maken gehad. Lijst 8 laat zien hoe we een nieuw bestand kunnen toevoegen MyDB02 naar een andere bestandsgroep dan de primaire bestandsgroep.

De eerste instructie na het instellen van de databasecontext op master maakt de nieuwe bestandsgroep FG01. Het volgende statement voegt dan het bestand toe aan deze nieuwe bestandsgroep met gelijkaardige opties als die gebruikt worden in 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

Gegevensbestanden verwijderen

Figuur 5 toont de resultaten van de operaties die we tot nu toe hebben uitgevoerd. We hebben drie databestanden. Twee ervan bevinden zich in de PRIMARY-bestandsgroep en de derde bevindt zich in de FG01-bestandsgroep.

Laten we aannemen dat we iets verkeerd hebben gedaan, bijvoorbeeld de verkeerde bestandsgrootte instellen. Vervolgens kunnen we de bestandsgroep verwijderen met de volgende code in Listing 9:

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

Conclusie

Dit artikel onderzocht de typen databasebestanden, de mogelijke complicaties veroorzaakt door de groei van de gegevensbestanden en de manieren om het probleem op te lossen. Ook hebben we de T-SQL-codes onderzocht voor het uitbreiden van gegevensbestanden en het toevoegen van nieuwe gegevensbestanden aan een database. We hebben ook gesproken over het gebruik van bestandsgroepen.

Ons doel is ervoor te zorgen dat wanneer we databases implementeren, we de database voorbereiden om alle gegevens op te slaan die het ooit nodig zal hebben voor een bepaalde toepassing.

Referenties

  1. Databasebestanden en bestandsgroepen

  1. SQL Transponeer rijen als kolommen

  2. DateDiff om uren en minuten uit te voeren

  3. Afbeelding weergeven in Ireports met PostgreSql

  4. Objectafhankelijkheden weergeven in Access 2016