En SQL Server-databas innehåller primära datafiler, sekundära datafiler (valfritt) och transaktionsloggfiler.
De primära och sekundära datafilerna innehåller tabeller, databasobjekt, scheman och data.
Filtillägget för den primära databasfilen är *.mdf , och filtillägget för den sekundära datafilen är *.ndf .
Transaktionsloggfilerna lagrar alla ändringar som gjorts av transaktionerna (infoga, uppdatera och ta bort). Om SQL Server startar om oväntat eller kraschar, rullar databasmotorn tillbaka den ofullständiga transaktionen före felpunkten med hjälp av transaktionsloggfilen.
Förlängningen av transaktionsloggfilen är *.ldf . Du kanske vill hänvisa till den här artikeln för att förstå arkitekturen för transaktionsloggfiler.
I den här artikeln ska jag förklara hur vi kan hantera databasfilerna (MDF-filer) i SQL Server 2019.
Artikeln kommer att täcka följande punkter:
- Visa databasfildetaljerna med hjälp av DMV:er och SQL Server Management Studio.
- Bifoga och koppla bort användardatabasernas MDF-filer.
- Bifoga och koppla bort systemdatabasernas MDF-filer.
Visa databasfiler med dynamiska hanteringsvyer
För att se detaljerna i databasens mdf-filer kan vi använda sys.database_files och sys.master_files . Frågan ska skrivas enligt följande:
use master
go
select DB_NAME(database_id),
name as [logical Name],
physical_name as [File Location],
state_desc as [State of the file],
Size [Size of data File],
case when convert(varchar,max_size) =-1 then 'Unlimited' else convert(varchar,max_size) end as [Maximum Size]
from sys.master_files where type_desc='ROWS'
and database_id >5
Eftersom exemplet hänvisar till MDF-detaljerna för alla databaser behöver vi en annan kod för att se de specifika databasfilerna. För det ändamålet använder vi sys.database_files .
Följande skript kommer att hämta information om SSISDB databas:
use SSISDB
Go
select
name as [logical Name],
physical_name as [File Location],
state_desc as [State of the file],
Size [Size of data File],
case when convert(varchar,max_size) =-1 then 'Unlimited' else convert(varchar,max_size) end as [Maximum Size]
from sys.database_files
Visa databasfilerna med SQL Server Management Studio
Alternativet att visa MDF-fillistan som är tillgänglig i SQL Server Management Studio (SSMS).
I SQL Server Management Studio, ansluta till SQL Server-instansen. Expandera sedan Databaser -> Högerklicka på valfri databas -> Klicka på Egenskaper :
I Databasegenskaper klickar du på Filer . Det kommer att presentera listan över databasen MDF och LDF filer:
Koppla bort och bifoga användardatabasens MDF-filer
Det finns två sätt att ta bort och bifoga MDF-filer från användardatabasen:
- Använder SQL Server Management Studio.
- Använder T-SQL-skript.
Bifoga och koppla loss databas med SSMS
Bifoga databasen
Starta SSMS -> Anslut till SQL Server-instansen -> Högerklicka på Databas -> Klicka på Bifoga .
Det öppnar Bifoga databaser fönster. Klicka på Lägg till i det fönstret:
I det nya Locate Database Files fönster, bläddra i filsystemet för att hitta MDF fil. Dubbelklicka på den.
De associerade datafilerna och loggfilerna fylls i de associerade filerna rutnätsvy i Bifoga databaser fönster. Klicka på OK för att bifoga databasen.
När databasen är bifogad kan du se den i SQL Server Management Studio:
Koppla bort databasen
Starta SQL Server Management Studio och anslut till SQL Server-instansen . Utöka listan Databaser.
Högerklicka på den nödvändiga databasen -> Uppgifter -> Klicka på Koppla bort .
Om du tvångsmässigt vill koppla bort alla användare och processer som är anslutna till databasen gör du det i Koppla bort databasen fönster.
Markera Släpp anslutningar alternativet i Databaser att koppla bort och klicka på OK .
Bifoga och koppla loss databasen med T-SQL
Vi kan använda SKAPA DATABAS MED ATTACH fråga med följande syntax:
USE [master]
GO
CREATE DATABASE [DatabaseName] ON
( FILENAME = 'Path of Primary Database file (MDF)' ),
( FILENAME = N'Path of Secondary Database file (NDF)' ),
...
...
( FILENAME = N'Path of Transactional Log file (LDF)' )
FOR ATTACH
GO
För att bifoga databasen, kör följande T-SQL-fråga:
USE [master]
GO
CREATE DATABASE [WideWorldImporters] ON
( FILENAME = N'C:\MSSQL\SQLData\WideWorldImporters.mdf' ),
( FILENAME = N'C:\MSSQL\SQLLog\WideWorldImporters.ldf' ),
( FILENAME = N'C:\MSSQL\SQLData\WideWorldImporters_UserData.ndf' )
FOR ATTACH
GO
Vi kan också köra sp_detach_db lagrad procedur för att koppla bort databasen.
Om du vill koppla bort användare med våld kan du använda ALTER DATABASE SET SINGLE_USER kommandot i följande skript:
Use [master]
GO
ALTER DATABASE [WideWorldImporters] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
EXEC sp_detach_db [WideWorldImporters]
GO
Hantera systemdatabasens MDF-filer
Anta att vi vill flytta systemdatabasernas MDF-filer (master, model, msdb och Tempdb) till en annan plats. Låt oss undersöka processen.
Flytta masterdatabasen
För att flytta master databas, öppna SQL Server Configuration Manager -> Klicka på SQL Server Services -> Högerklicka på SQL Server-tjänsten för den önskade SQL Server-instansen (MSSQLSERVER ) -> Klicka på Egenskaper :
För att ändra master.mdf filplats, klicka på datafilens sökväg för huvudfilen.
master.mdf sökvägsvärdet följs av -d och mastlog.ldf sökvägsvärde följs av -l
Ersätt dessa värden med följande:
Datafil:-dD:\MS_SQL\Data\master.mdf
Loggfil:-lD:\MS_SQL\Log\mastlog.ldf
När värdena har ändrats klickar du på Uppdatera som visas i illustrationen nedan:
Klicka på OK för att spara värdena.
Stoppa sedan SQL Server-tjänsterna och kopiera databasfilerna till en ny plats. När du är klar, starta SQL-tjänsten igen.
Kör frågan nedan för att verifiera filens plats.
select DB_NAME(database_id)[Database Name], physical_name [File Location] from sys.master_files
where DB_NAME(database_id)='master'
Flytta modelldatabasen
För att flytta modelldatabasen till en annan enhet måste vi först köra kommandot ALTER DATABASE MODIFY FILE. Den tjänar till att ändra platsen i SQL Server-systemkatalogen.
Kör nedanstående kommando:
ALTER DATABASE model
MODIFY FILE (NAME = modeldev, FILENAME = 'D:\MS_SQL\Data\model.mdf');
GO
ALTER DATABASE model
MODIFY FILE (NAME = modellog, FILENAME = 'D:\MS_SQL\Log\modellog.ldf');
GO
Stoppa sedan SQL Server-tjänster genom att utföra kommandot nedan i PowerShell:
/*Stop SQL Services*/
PS C:\> Stop-Service MSSQLSERVER -Force
/*Start SQL Services*/
PS C:\> Start-Service MSSQLSERVER
Kopiera model.mdf och modellog.ldf filer till en ny plats och starta tjänsterna.
Kör frågan nedan för att verifiera filens plats:
select DB_NAME(database_id)[Database Name], physical_name [File Location] from sys.master_files
where DB_NAME(database_id)='model'
Flytta MSDB-databasen
För att flytta MSDB databas till en annan enhet, kör kommandot ALTER DATABASE MODIFY FILE först för att ändra platsen i SQL Server-systemkatalogen:
ALTER DATABASE msdb
MODIFY FILE (NAME = MSDBData, FILENAME = 'D:\MS_SQL\Data\MSDBData.mdf');
GO
ALTER DATABASE msdb
MODIFY FILE (NAME = MSDBLog, FILENAME = 'D:\MS_SQL\Log\MSDBLog.ldf');
GO
Stoppa SQL Server-tjänsterna genom att köra följande kommando i PowerShell:
/*Stop SQL Services*/
PS C:\> Stop-Service MSSQLSERVER -Force
/*Start SQL Services*/
PS C:\> Start-Service MSSQLSERVER
Kopiera MSDBData.mdf och MSDBLog.ldf filer till den nya platsen och starta tjänsterna.
Kör frågan nedan för att verifiera filens plats:
select DB_NAME(database_id)[Database Name], physical_name [File Location] from sys.master_files
where DB_NAME(database_id)='msdb'
Flytta TempDB-databasen
För att flytta TempDB databas till en annan enhet, kör kommandot ALTER DATABASE MODIFY FILE först för att ändra filplatsen i SQL Server-systemkatalogen:
ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, FILENAME = 'D:\MS_SQL\Data\tempdb.mdf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp2, FILENAME = 'D:\MS_SQL\Data\tempdb_mssql_2.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp3, FILENAME = 'D:\MS_SQL\Data\tempdb_mssql_3.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp4, FILENAME = 'D:\MS_SQL\Data\tempdb_mssql_4.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp5, FILENAME = 'D:\MS_SQL\Data\tempdb_mssql_5.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp6, FILENAME = 'D:\MS_SQL\Data\tempdb_mssql_6.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp7, FILENAME = 'D:\MS_SQL\Data\tempdb_mssql_7.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp8, FILENAME = 'D:\MS_SQL\Data\tempdb_mssql_8.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, FILENAME = 'D:\MS_SQL\Log\templog.ldf');
GO
Starta om SQL Server-tjänsterna genom att köra följande kommando i PowerShell:
/*Restart SQL Services*/
PS C:\> Restart-Service MSSQLSERVER -Force
Kör frågan nedan för att verifiera filens plats:
select DB_NAME(database_id)[Database Name], physical_name [File Location] from sys.master_files
where DB_NAME(database_id)='tempdb'
Du kan också använda Transaction Log-verktyget från Devart-företaget – det inkluderar möjligheten att visa MDF- och LDF-fildata också.
Sammanfattning
Den här artikeln förklarade databasfilerna i SQL Server-databasen och sätten att visa MDF-filplatserna. Den beskrev också processerna för att bifoga och ta bort databaserna och illustrerade processen steg för steg för att flytta systemdatabasens datafiler.