SQL Server-databaser gemmer deres data og objekter i filer. Hver database har mindst én datafil (og en logfil), men den er ikke begrænset til kun én – den kan have mange datafiler. Hvis du nogensinde kommer i den situation, hvor du skal fjerne en datafil fra en database, skal du først tømme filen, før du fjerner den.
Men bare rolig, tømning af en fil sletter faktisk ikke dataene. Det migrerer simpelthen filens data til andre filer inden for samme filgruppe.
Eksemplerne nedenfor viser, hvordan man tømmer en datafil og derefter fjerner den fra databasen ved hjælp af Transact-SQL.
Hurtigt eksempel
Her er et hurtigt eksempel, der viser dig, hvordan du tømmer en datafil og fjerner den fra databasen:
-- Empty the file DBCC SHRINKFILE (Solutions2, EMPTYFILE); GO -- Remove the file ALTER DATABASE Solutions REMOVE FILE Solutions2; GO
Så som forklaret tømmer dette filen og fjerner den derefter fuldstændigt fra databasen. Når du bruger EMPTYFILE
, dette flytter alle data fra filen til andre filer i samme filgruppe. Derfor skal du sørge for, at dette ikke er den eneste fil i filgruppen (ellers får du en fejl). EmptyFile forsikrer dig også om, at ingen nye data vil blive tilføjet til filen.
Et længere eksempel
Hvis du er forvirret over det forrige eksempel, så lad os gennemgå processen med at oprette en ny database, tilføje en ny datafil, tømme den og derefter fjerne den.
Opret en database og se dens datafiloplysninger
-- Switch to the master database USE master; GO -- Create a new database CREATE DATABASE Test; GO -- View it's data file and log file info USE Test; GO SELECT file_id, name, type_desc, physical_name, size, max_size FROM sys.database_files ; GO
Først skifter vi til masterdatabasen, før vi opretter en ny database kaldet Test
. Vi skifter derefter til den nye database og vælger visse oplysninger om dens databasefiler fra sys.database_files
systemkatalogvisning.
Tilføj en ny datafil
-- Add a new data file ALTER DATABASE Test ADD FILE ( NAME = Test2, FILENAME = '/var/opt/mssql/data/Test2.mdf', SIZE = 8MB ); GO -- View it's data file and log file info USE Test; GO SELECT file_id, name, type_desc, physical_name, size, max_size FROM sys.database_files ; GO
Vi tilføjer nu en ny datafil med det logiske navn Test2
og en fysisk sti til /var/opt/mssql/data/Test2.mdf
(bemærk, at dette er en Linux/Mac-sti. Hvis du bruger Windows, skal du bruge skråstreger i stedet for fremadgående skråstreger). Igen forespørger vi sys.database_files
systemkatalogvisning, så vi kan se detaljerne i vores nye fil.
Tøm datafilen og fjern den
Med henblik på dette eksempel, lad os antage, at databasen er blevet sat i produktion, og den datafil, vi lige har oprettet, er blevet indlæst med data. Nu vil vi fjerne den fil (uanset grund). Men før vi fjerner filen, skal vi tømme den (migrer dens data til en anden fil).
Sådan gør du det:
-- Empty the new data file DBCC SHRINKFILE (Test2, EMPTYFILE); GO -- Remove the file ALTER DATABASE Test REMOVE FILE Test2; GO -- View it's data file and log file info USE Test; GO SELECT file_id, name, type_desc, physical_name, size, max_size FROM sys.database_files ; GO
Så dette er ligesom det første eksempel på denne side, bortset fra at vores database har et andet navn. Og i dette eksempel forespørger vi sys.database_files
for at bekræfte, at filen faktisk er blevet slettet.