sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man tar bort en datafil från en SQL Server-databas (T-SQL)

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.


  1. PostgreSQL-funktion / lagrad procedur CURRENT_TIMESTAMP ändras inte

  2. Hur man sammanfogar strängar i SQLite

  3. Anropa en lagrad procedur med en annan i Oracle

  4. Välja slumpmässiga rader i MySQL