sql >> Databasteknik >  >> RDS >> Sqlserver

Hantera MDF-filer i SQL Server 2019

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:

  1. Visa databasfildetaljerna med hjälp av DMV:er och SQL Server Management Studio.
  2. Bifoga och koppla bort användardatabasernas MDF-filer.
  3. 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:

  1. Använder SQL Server Management Studio.
  2. 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.


  1. Visa SQL Server Agent jobbhistorik med SSMS

  2. Skicka e-post från en utlösare i SQL Server (T-SQL)

  3. Hur flexibla/begränsande är SQLite-kolumntyper?

  4. Vilken är den bästa metoden för att skicka parametrar till SQLCommand?