Introduktion
Datafiler är fysiska objekt som utgör den viktigaste delen av databassystemet eftersom de innehåller faktiska data. Du kan tänka på en databas som en samling datafiler. En instans ger dig möjligheten att montera och komma åt sådana filer.
Här är att hantera datafiler att förstå hur man övervakar och ändrar storlek på befintliga datafiler och hur man lägger till eller tar bort datafiler från en databas.
T-SQL-koder för dessa operationer finns i Microsofts dokumentation. I den här artikeln vill vi dock diskutera taktiken kring att hantera dessa filer för de av oss som fortfarande kör lokala installationer av SQL Server.
Datafiltyper och möjliga problem
För varje ny databas som skapas i SQL Server måste vi ha minst två filer skapade – en primär datafil och en loggfil.
- Den primära datafilen har filtillägget .MDF.
- Loggfilen har filtillägget .LDF.
- När vi lägger till datafiler till en SQL Server-databas använder vi vanligtvis tillägget .NDF.
Obs :Det är möjligt att skapa datafilerna i SQL Server utan tillägg, men det är inte den bästa praxisen. Att använda .mdf, .ndf och .ldf tjänar till att särskilja dessa filer när vi visar dem på operativsystemnivå.
Uppenbarligen skapas datafiler när du skapar en databas. Du kan göra det med SKAPA DATABAS kommando. Även om det verkar så enkelt, bör du vara medveten om möjliga problem.
Beroende på hur stor databasen och dess associerade datafiler så småningom blir, kan du möta fragmenteringsproblem och andra problem med säkerhetskopiering och förflyttning av dina data. Det händer att datafilerna inte har rätt storlek.
Ta en titt på illustrationen nedan. Den visar resultatet av att köra CREATE DATABASE och ange namnet på databasen (MyDB).
Lista 1 visar de skapade databasdetaljerna:
-- 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
Du kanske undrar var SQL Server fick alla dessa alternativ ifrån, eftersom allt vi gjorde var att utfärda CREATE DATABASE MyDB.
SQL Server använder modelldatabasinställningar som standardvärden för alla nya databaser som skapas på den instansen. I det här fallet ser vi den ursprungliga filstorleken på 100 MB. Autotillväxten är 12 MB respektive 64 MB för data och loggfiler.
De efterföljande problemen
Innebörden av inställningarna som markeras i figur 1 är:
- Den primära datafilen börjar från storleken 100 MB. Det är en liten storlek. Beroende på aktivitetsnivån i databasen kommer den alltså att behöva växa mycket snart.
- När det finns ett behov av att växa automatiskt datafilen måste SQL-servern skaffa 128MB från tillgängligt utrymme i operativsystemet. Återigen är den liten, vilket innebär att databasen kommer att växa automatiskt ofta . Databastillväxten är en dyr operation som kan påverka prestandan om det händer för ofta. Dessutom kan frekventa databastillväxt orsaka ett fenomen som kallas fragmentering som i sin tur har en förmåga att orsaka allvarlig prestandaförsämring på databaser. Den andra ytterligheten att ställa in inkrementet till högt värde kan leda till att tillväxtoperationer tar lång tid att slutföra, beroende på det underliggande lagringssystemets prestanda.
- Databasfilerna kan växa i det oändliga. Det betyder, med tillräcklig tid, kan dessa filer konsumera allt utrymme på volymen där de sitter. För att flytta dem behöver du en volym av deras storlek eller mer. Ett annat alternativ är att lägga till lagringsutrymme till volymen när dessa filer finns.
Dessa är nyckelproblem som är förknippade med beroende på standardvärden för att skapa databaser.
Förtilldelning
Med tanke på tillväxtens resultatpåverkan skulle det vara mer meningsfullt att dimensionera databasen på rätt sätt i början av projektet. På så sätt tillgodoser vi lösningskraven under överskådlig framtid.
Antag att vi vet att vår databas så småningom kommer att bli 1 GB stor. Vi kan tilldela 1 GB lagringsutrymme när projektet startar. Då behöver databasen aldrig växa. Det eliminerar fragmenteringsproblem som orsakas av databasens tillväxt.
Lista 2 visar skriptet som är tillämpligt för denna förtilldelning:
-- 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
Vi nämner 1 GB utrymme för demonstrationsändamål. Vanligtvis kan en produktionsdatabas kräva 1 TB. Poängen är:tilldela det nödvändiga utrymmet i början. Då eliminerar eller minskar du behovet av tillväxt avsevärt.
Nu måste vi fråga oss själva om vi verkligen vill ha en enda 1TB-fil som sitter på vår volym. Det skulle vara klokt att dela upp det i mindre bitar. När parallella operationer, såsom säkerhetskopior, inträffar, kommer varje fil att adresseras av en enda CPU-tråd för ett multiprocessorsystem. Med en enda fil skulle det inte gå smidigt.
Återigen, vi modifierar vårt skript för att tillgodose detta krav i Lista 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
Ytterligare information
Vi bör också nämna att det inte finns något värde i att använda denna metod för loggfiler. Saken är den att SQL Server alltid skriver till loggfiler sekventiellt. Vi har också använt tillägget .ndf för de nya filerna vi lägger till.
MAXSIZE-klausulen säkerställer att våra datafiler inte växer på obestämd tid. Vi har gett varje fil ett annat logiskt och fysiskt namn – NAME-satsen anger det logiska namnet på filen och FILENAME-satsen anger det fysiska namnet.
Att skapa en databas med större datafiler kommer att ta längre tid än annars. Det är kanske mer rimligt att skapa en liten databas först och sedan manipulera den med lämpliga kommandon för att ändra storlek och lägga till filer, tills vi etablerar en idealisk databasstruktur.
Genom att skapa databasen med tydliga alternativ har vi tagit itu med de tre problem som tagits upp tidigare i den här artikeln. Figur 2 visar resultatet av detta tillvägagångssätt:
Nu har vi en databas korrekt konfigurerad för att ta emot datatillväxten under en utdragen period utan behov av datafiltillväxt. Det tar bort fragmenteringsriskerna och hjälper till att säkerställa en bättre hantering av datafiler.
Hantera datafiler
Istället för att skapa fyra eller fem datafiler i CREATE DATABASE-satsen kan vi använda satserna MODIFY och ADD i ALTER DATABASE T-SQL-satsen.
Återigen börjar vi med uttalandet som visas i lista 4 nedan. Den skapar en enda databas med datafilen på 100 MB och en tillhörande loggfil. Vårt mål är att säkerställa förallokering genom att utöka den här filen och sedan lägga till fler filer.
-- 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
Utöka datafiler
T-SQL-satsen som utökar en datafil visas i Lista 5. Den anger databasnamnet, filnamnet och den önskade initiala storleken och ökningen. I det här fallet ställer vi in SQL Server att allokera 1 GB vid start och sedan allokera 512 MB för alla efterföljande automatiska tillväxter.
-- Listing 5: Extend the Primary Datafile
USE [master]
GO
ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 1048576KB , FILEGROWTH = 524288KB )
GO
Lista 6 visar hur koden skulle se ut om vi anger MAXSIZE på 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
Om vi ställer in FILEGROWTH-satsen till 0, ställer vi in vår SQL Server så att den INTE odlar datafilen automatiskt . I det här fallet måste vi uttryckligen utfärda kommandon för att utöka datafilen eller lägga till andra filer.
Lägga till datafiler
Lista 7 visar koden vi använder för att lägga till en ny datafil till databasen. Observera att vi återigen måste ange det logiska filnamnet och det fysiska filnamnet som inkluderar en fullständig sökväg.
Vi kan också placera den fysiska filen på en annan volym. För det behöver vi bara ändra vägen.
-- 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
Att utöka och lägga till datafiler gäller även för scenariot där vi väljer att inaktivera autotillväxt för våra databaser (se figur 4).
Sedan måste vi utöka databasen manuellt med ovanstående koder från listor 5 eller 6, eller lägga till filer som i listning 7.
Använda filgrupper
Filgrupper låter oss hantera datafilsamlingarna tillsammans. Vi kan logiskt gruppera vissa datafiler lagrade på olika diskar eller olika volymer i en filgrupp. Den filgruppen skapar ett abstraktionslager mellan tabellerna och indexen och de faktiska fysiska filerna som lagrar data.
Därför, om vi skapar en tabell på en filgrupp, sprids data i denna tabell över alla datafiler som tilldelats filgruppen.
Hittills har vi bara sysslat med den PRIMÄRA filgruppen. Lista 8 visar hur vi kan lägga till en ny fil MyDB02 till en annan filgrupp än den primära filgruppen.
Den första satsen efter att ha ställt in databaskontexten till master skapar den nya filgruppen FG01. Nästa programsats lägger sedan till filen i denna nya filgrupp med liknande alternativ som de som används i Lista 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
Släpp datafiler
Figur 5 visar resultatet av de operationer vi hittills har utfört. Vi har tre datafiler. Två av dem finns i den PRIMÄRA filgruppen, och den tredje är i filgruppen FG01.
Låt oss anta att vi har gjort något fel, till exempel ställ in fel filstorlek. Sedan kan vi släppa filgruppen med hjälp av följande kod i Lista 9:
-- Listing 9: Drop Data Files
USE [MyDB]
GO
ALTER DATABASE [MyDB] REMOVE FILE [MyDB02]
GO
Slutsats
Den här artikeln utforskade databasfiltyperna, de möjliga komplikationer som orsakas av datafilernas tillväxt och sätten att lösa problemet. Vi undersökte också T-SQL-koderna för att utöka datafiler och lägga till nya datafiler till en databas. Vi berörde också användningen av filgrupper.
Vårt mål är att säkerställa att när vi distribuerar databaser förbereder vi databasen för att lagra all data den någonsin kommer att behöva för en viss applikation.
Referenser
- Databasfiler och filgrupper