Introduktion
Datafiler er fysiske objekter, der udgør den vigtigste del af databasesystemet, da de indeholder faktiske data. Du kan tænke på en database som en samling af datafiler. En instans giver dig mulighed for at montere og få adgang til sådanne filer.
Her er administration af datafiler at forstå, hvordan man overvåger og ændrer størrelse på eksisterende datafiler, og hvordan man tilføjer eller fjerner datafiler fra en database.
T-SQL-koder til disse operationer findes i Microsoft-dokumentationen. I denne artikel vil vi dog gerne diskutere taktikken omkring administration af disse filer for dem af os, der stadig kører lokale installationer af SQL Server.
Datafiltyper og mulige problemer
For hver ny database, der oprettes i SQL Server, skal vi have mindst to filer oprettet – en primær datafil og en logfil.
- Den primære datafil har filtypenavnet .MDF.
- Logfilen har filtypenavnet .LDF.
- Når vi tilføjer datafiler til en SQL Server-database, bruger vi typisk filtypenavnet .NDF.
Bemærk :Det er muligt at oprette datafilerne i SQL Server uden nogen udvidelse, men det er ikke den bedste praksis. Brug af .mdf, .ndf og .ldf tjener til at skelne mellem disse filer, når vi ser dem på operativsystemniveau.
Naturligvis oprettes datafiler, når du opretter en database. Du kan gøre det med OPRET DATABASE kommando. Selvom det virker så nemt, bør du være opmærksom på mulige problemer.
Afhængigt af hvor stor databasen og dens tilknyttede datafiler i sidste ende bliver, kan du blive udsat for fragmenteringsproblemer og andre problemer med backup-tid og flytning af dine data. Det sker, fordi datafilerne ikke har den rigtige størrelse.
Tag et kig på illustrationen nedenfor. Den viser resultatet af at udføre CREATE DATABASE og angive navnet på databasen (MyDB).
Liste 1 viser de oprettede databasedetaljer:
-- Liste 1:Opret databasescriptUSE [master]GO/***** Objekt:Database [MyDB] Script Dato:29/11/2020 22:38:18 ***** */CREATE DATABASE [MyDB] INDEHOLDELSE =INGEN PÅ PRIMÆR (NAVN =N'MyDB', FILNAVN =N'C:\MSSQL\Data\MyDB.mdf', STØRRELSE =102400KB, MAXSIZE =UBEGRÆNSET, FILEGROWTH =21B31K) ( NAME =N'MyDB_log', FILENAME =N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE =102400KB , MAXSIZE =2048GB , FILEGROWTH =65536KB )GOIF (1 =FULLTYTEKSTSERVICEInstalleret PROFULLTEKSTDIENSTJENESTE) ].[dbo].[sp_fulltext_database] @action ='aktiver'endGO
Du undrer dig måske over, hvor SQL Server fik alle disse muligheder fra, da alt, hvad vi gjorde, var at udstede CREATE DATABASE MyDB.
SQL Server bruger modeldatabaseindstillinger som standardværdier for enhver ny database, der er oprettet på den instans. I dette tilfælde ser vi den oprindelige filstørrelse på 100 MB. Autovæksten er henholdsvis 12 MB og 64 MB for data og logfiler.
De efterfølgende problemer
Implikationen af indstillingerne fremhævet i figur 1 er:
- Den primære datafil starter fra størrelsen 100 MB. Det er en lille størrelse. Afhængigt af aktivitetsniveauet i databasen skal den derfor vokse meget snart.
- Når der er behov for at autovokse datafilen, skal SQL-serveren hente 128 MB fra tilgængelig plads på operativsystemet. Igen er den lille, hvilket betyder, at databasen automatisk vil vokse hyppigt . Databasevæksten er en dyr operation, der kan påvirke ydeevnen, hvis den sker for ofte. Desuden kan hyppige databasevækster forårsage et fænomen kaldet fragmentering, som på sin side har en evne til at forårsage alvorlige ydeevneforringelser på databaser. Den anden yderlighed med at indstille stigningen til høj værdi kan resultere i, at vækstoperationer tager lang tid at fuldføre, afhængigt af det underliggende lagersystems ydeevne.
- Databasefilerne kan vokse i det uendelige. Det betyder, at disse filer, med tilstrækkelig tid, kan optage al pladsen på volumen, hvor de sidder. For at flytte dem skal du have et volumen af deres størrelse eller mere. En anden mulighed er at tilføje lagerplads til volumen, når disse filer sidder.
Disse er nøgleproblemer forbundet med afhængig af standardværdier for oprettelse af databaser.
Pre-allokering
I betragtning af vækstens præstationspåvirkning ville det give mere mening at tilpasse databasen korrekt ved projektets begyndelse. På denne måde imødekommer vi løsningskravene i en overskuelig fremtid.
Antag, at vi ved, at vores database med tiden bliver 1 GB i størrelse. Vi tildeler muligvis 1 GB lagerplads, når projektet starter. Så behøver databasen aldrig at vokse. Det eliminerer fragmenteringsproblemerne forårsaget af databasevæksten.
Liste 2 viser det script, der gælder for denne forudallokering:
-- Liste 2:Opret databasescript med Pre-allocationUSE [master]GO/****** Objekt:Database [MyDB] Script Dato:29/11/2020 10:38:18 pm * *****/CREATE DATABASE [MyDB] INDEHOLDELSE =INGEN PÅ PRIMÆR ( NAME =N'MyDB', FILENAME =N'C:\MSSQL\Data\MyDB.mdf', SIZE =1024MB , MAXSIZE =2048MB, FILEGROTH =512MB ) LOG PÅ ( NAVN =N'MyDB_log', FILNAVN =N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE =512MB , MAXSIZE =2048GB , FILEGROWTH =512MB )GOIF (1 =FULLTEXPERTEXTEKST) )beginEXEC [MyDB].[dbo].[sp_fulltext_database] @action ='aktiver'endGO
Vi nævner 1 GB plads til demonstrationsformål. Typisk kan en produktionsdatabase kræve 1TB. Pointen er:tildel den nødvendige plads i begyndelsen. Så fjerner eller reducerer du behovet for vækst væsentligt.
Nu må vi spørge os selv, om vi virkelig vil have en enkelt 1TB-fil på vores volumen. Det ville være klogt at dele det op i mindre bidder. Når parallelle operationer, såsom sikkerhedskopiering, forekommer, vil hver fil blive adresseret af en enkelt CPU-tråd til et multiprocessorsystem. Med en enkelt fil ville det ikke gå glat.
Igen ændrer vi vores script for at imødekomme dette krav i liste 3:
-- Liste 3:Opret databasescript med forudallokering og BRUG [master]GO/****** Objekt:Database [MyDB] Script Dato:29/11/2020 10:38:18 pm ******/CREATE DATABASE [MyDB] INDEHOLDELSE =INGEN PÅ PRIMÆR ( NAME =N'MyDB01', FILENAME =N'C:\MSSQL\Data\MyDB01.mdf' , SIZE =256MB , MAXSIZE =512MB, FILEGROWTH =512MB ),( NAME =N'MyDB02', FILEGROWTH =N'C:\MSSQL\Data\MyDB02.ndf' , SIZE =256MB , MAXSIZE =512MB, FILEGROWTH =512MB NAME =FILEGROWTH =512MB NAVN,') =N'C:\MSSQL\Data\MyDB03.ndf' , SIZE =256MB , MAXSIZE =512MB, FILEGROWTH =512MB ),( NAME =N'MyDB04', FILENAME =N'C:\MSSQL\Data\MyDB04.ndf ' , STØRRELSE =256 MB , MAKSSTØRRELSE =512 MB, FILVÆRK =512 MB ), ( NAVN =N'MyDB05', FILNAVN =N'C:\MSSQL\Data\MyDB05.ndf' , STØRRELSE =256 MB , 51 MAXSIZE, =51 MAXSIZE, =51 MAXSIZE ) LOG PÅ ( NAME =N'MyDB_log', FILENAME =N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE =512MB , MAXSIZE =2048GB , FILEGROWTH =512MB )GOIF (1 =FULLTEKSTSERVICE('exstalled') beginEXEC [MinDB].[dbo].[sp _fulltext_database] @action ='aktiver'endGO
Yderligere oplysninger
Vi bør også nævne, at der ikke er nogen værdi i at bruge denne tilgang til logfiler. Sagen er, at SQL Server altid skriver til logfiler sekventielt. Vi har også brugt .ndf-udvidelsen til de nye filer, vi tilføjer.
MAXSIZE-klausulen sikrer, at vores datafiler ikke vil vokse i det uendelige. Vi har givet hver fil et forskelligt logisk og fysisk navn – NAME-udtrykket angiver det logiske navn på filen, og FILENAME-udtrykket angiver det fysiske navn.
At oprette en database med større datafiler vil tage længere tid end ellers. Det er måske mere rimeligt først at oprette en lille database og derefter manipulere den med passende kommandoer for at ændre størrelse og tilføje filer, indtil vi etablerer en ideel databasestruktur.
Ved at oprette databasen med eksplicitte muligheder har vi adresseret de tre bekymringer, der blev rejst tidligere i denne artikel. Figur 2 viser resultatet af denne fremgangsmåde:
Nu har vi en database korrekt konfigureret til at imødekomme datavæksten i en længere periode uden behov for datafilvækst. Det fjerner fragmenteringsrisici og hjælper med at sikre en bedre datafilhåndtering.
Håndtering af datafiler
I stedet for at oprette fire eller fem datafiler i CREATE DATABASE-sætningen, kan vi bruge MODIFY- og ADD-sætningerne i ALTER DATABASE T-SQL-sætningen.
Endnu en gang begynder vi med udsagnet vist i liste 4 nedenfor. Den opretter en enkelt database med 100MB datafilen og en tilhørende logfil. Vores mål er at sikre forhåndstildeling ved at udvide denne fil og derefter tilføje flere filer.
-- Liste 4:Opret databasescriptUSE [master]GOIF EKSISTERER (VÆLG * FRA sys.databases WHERE name='MyDB')DROP DATABASE MyDB;/****** Objekt:Database [MyDB] Scriptdato:29/11/2020 10:38:18 pm ******/CREATE DATABASE [MyDB] INDEHOLDELSE =INGEN PÅ PRIMÆR (NAVN =N'MyDB', FILENAME =N'C:\MSSQL\Data\ MyDB.mdf' , SIZE =102400KB , MAXSIZE =UBEGRÆNSET, FILEGROWTH =131072KB ) LOG PÅ ( NAME =N'MyDB_log', FILENAME =N'E:\MSSQL\Log\MyDB_log.ldf' =4SIKB01000000000 =4ZEKGB , FILEGROWTH =65536KB )GOIF (1 =FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))beginEXEC [MyDB].[dbo].[sp_fulltext_database] @action ='enable'endGO
Udvid datafiler
T-SQL-sætningen, der udvider en datafil, er vist i liste 5. Den specificerer databasenavnet, filnavnet og den ønskede startstørrelse og stigning. I dette tilfælde indstiller vi SQL Server til at allokere 1 GB ved start og derefter allokere 512 MB til alle efterfølgende auto vækster.
-- Liste 5:Udvid den primære datafilUSE [master]GOALTER DATABASE [MyDB] MODIFY FILE ( NAME =N'MyDB', SIZE =1048576KB, FILEGROWTH =524288KB)GO
Liste 6 viser, hvordan koden ville se ud, hvis vi angiver MAXSIZE på 2 GB:
-- Liste 6:Udvid den primære datafil med Maksimal SizeUSE [master]GOALTER DATABASE [MyDB] MODIFY FILE ( NAME =N'MyDB', SIZE =1048576KB , MAXSIZE =2097152KB 2097152KB 28 =5B24GOTH)<8K24GOTH /kode>
Hvis vi sætter FILEGROWTH-sætningen til 0, sætter vi vores SQL Server til IKKE at autovokse datafilen . I dette tilfælde skal vi eksplicit udstede kommandoer for at udvide datafilen eller tilføje andre filer.
Tilføjelse af datafiler
Liste 7 viser den kode, vi bruger til at tilføje en ny datafil til databasen. Bemærk, at vi igen skal angive det logiske filnavn og det fysiske filnavn, som inkluderer en fuld sti.
Vi kan også placere den fysiske fil på et andet volumen. Til det behøver vi kun at ændre stien.
-- Liste 7:Tilføj datafiler til den primære filgruppe. Brug [master]GOALTER DATABASE [MyDB] TILFØJ FIL (NAVN =N'MyDB01', FILENAME =N'C:\MSSQL\Data\MyDB01.ndf ' , STØRRELSE =1048576KB , FILVÆRK =524288KB ) TIL FILGRUPPE [PRIMÆR]GÅ
Udvidelse og tilføjelse af datafiler gælder også for scenariet, hvor vi vælger at deaktivere autogrowth for vores databaser (se figur 4).
Så skal vi udvide databasen manuelt ved at bruge ovenstående koder fra lister 5 eller 6, eller tilføje filer som i oversigt 7.
Brug af filgrupper
Filgrupper lader os administrere datafilsamlingerne sammen. Vi kan logisk gruppere nogle datafiler, der er gemt på forskellige diske eller forskellige volumener, i én filgruppe. Denne filgruppe skaber et abstraktionslag mellem tabellerne og indekserne og de faktiske fysiske filer, der lagrer dataene.
Derfor, hvis vi opretter en tabel på en filgruppe, bliver dataene i denne tabel spredt ud over alle de datafiler, der er tildelt til filgruppen.
Indtil dette tidspunkt har vi kun beskæftiget os med den PRIMÆRE filgruppe. Liste 8 viser, hvordan vi kan tilføje en ny fil MyDB02 til en anden filgruppe end den primære filgruppe.
Den første sætning efter at have sat databasekonteksten til master opretter den nye filgruppe FG01. Den næste sætning tilføjer derefter filen til denne nye filgruppe med lignende muligheder som dem, der blev brugt i liste 7.
-- Liste 8:Tilføj datafiler til den primære filgruppeUSE [master]GOALTER DATABASE [MyDB] TILFØJ FILGRUPPE [FG01]MÅL DATABASE [MinDB] TILFØJ FIL (NAVN =N'MyDB02', FILENAME =N' C:\MSSQL\Data\MyDB02.ndf' , SIZE =102400KB , MAXSIZE =2097152KB , FILEGROWTH =524288KB ) TIL FILGRUPPE [FG01]GÅ
Sletning af datafiler
Figur 5 viser resultatet af de operationer, vi har udført indtil nu. Vi har tre datafiler. To af dem er i den PRIMÆRE filgruppe, og den tredje er i FG01-filgruppen.
Lad os antage, at vi har gjort noget forkert, for eksempel indstille den forkerte filstørrelse. Derefter kan vi droppe filgruppen ved at bruge følgende kode i liste 9:
-- Liste 9:Slip datafiler BRUG [MyDB]GOALTER DATABASE [MyDB] FJERN FIL [MyDB02]GO
Konklusion
Denne artikel undersøgte databasefiltyperne, de mulige komplikationer forårsaget af væksten i datafilerne og måderne at løse problemet på. Vi undersøgte også T-SQL-koderne til at udvide datafiler og tilføje nye datafiler til en database. Vi kom også ind på brugen af filgrupper.
Vores mål er at sikre, at når vi implementerer databaser, forbereder vi databasen til at gemme alle de data, den nogensinde har brug for til en bestemt applikation.
Referencer
- Databasefiler og filgrupper