SQL Server-databaser lagrar sina data och objekt i filer. Varje databas har minst en datafil (och en loggfil), men den är inte begränsad till bara en – den kan ha många datafiler. Om du någon gång hamnar i den situationen att du behöver ta bort en datafil från en databas, måste du tömma filen först innan du tar bort den.
Men oroa dig inte, att tömma en fil raderar faktiskt inte data. Den migrerar helt enkelt filens data till andra filer inom samma filgrupp.
Exemplen nedan visar hur man tömmer en datafil och sedan tar bort den från databasen med Transact-SQL.
Snabbexempel
Här är ett snabbt exempel som visar hur du tömmer en datafil och tar bort den från databasen:
-- Empty the file DBCC SHRINKFILE (Solutions2, EMPTYFILE); GO -- Remove the file ALTER DATABASE Solutions REMOVE FILE Solutions2; GO
Så som förklarat tömmer detta filen och tar sedan bort den helt från databasen. När du använder EMPTYFILE
, detta flyttar all data från filen till andra filer i samma filgrupp. Därför måste du se till att detta inte är den enda filen i filgruppen (annars får du ett felmeddelande). EmptyFile försäkrar dig också att ingen ny data kommer att läggas till filen.
Ett längre exempel
Om du är förvirrad av det föregående exemplet, låt oss gå igenom processen att skapa en ny databas, lägga till en ny datafil, sedan tömma den och sedan ta bort den.
Skapa en databas och se dess datafilinformation
-- 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 byter vi till huvuddatabasen innan vi skapar en ny databas som heter Test
. Vi byter sedan till den nya databasen och väljer viss information om dess databasfiler från sys.database_files
systemkatalogvy.
Lägg till 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 lägger nu till en ny datafil med det logiska namnet Test2
och en fysisk sökväg till /var/opt/mssql/data/Test2.mdf
(observera att detta är en Linux/Mac-sökväg. Om du använder Windows, använd bakåtstreck istället för snedstreck). Återigen frågar vi sys.database_files
systemkatalogvy så att vi kan se detaljerna i vår nya fil.
Töm datafilen och ta bort den
För detta exempel, låt oss anta att databasen har satts i produktion och datafilen vi just skapat har laddats upp med data. Nu vill vi ta bort den filen (av vilken anledning som helst). Men innan vi tar bort filen måste vi tömma den (migrera dess data till en annan fil).
Så här 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å detta är precis som det första exemplet på den här sidan, förutom att vår databas har ett annat namn. Och i det här exemplet frågar vi sys.database_files
för att bekräfta att filen verkligen har tagits bort.