sql >> Databáze >  >> RDS >> Sqlserver

Základy správy datových souborů na SQL Serveru

Úvod

Datové soubory jsou fyzické objekty, které tvoří nejdůležitější část databázového systému, protože obsahují aktuální data. Databázi si můžete představit jako kolekci datových souborů. Instance vám poskytuje prostředky pro připojení a přístup k takovým souborům.

Správa datových souborů zde znamená pochopení toho, jak monitorovat a měnit velikost existujících datových souborů a jak přidávat nebo odstraňovat datové soubory z databáze.

Kódy T-SQL pro tyto operace jsou uvedeny v dokumentaci společnosti Microsoft. V tomto článku bychom však rádi probrali taktiku správy těchto souborů pro ty z nás, kteří stále provozují místní instalace SQL Serveru.

Typy datových souborů a možné problémy

Pro každou novou databázi vytvořenou v SQL Serveru musíme mít vytvořeny alespoň dva soubory – primární datový soubor a soubor protokolu.

  • Primární datový soubor má příponu .MDF.
  • Soubor protokolu má příponu .LDF.
  • Když přidáváme datové soubory do databáze SQL Server, obvykle používáme příponu .NDF.

Poznámka :Je možné vytvořit datové soubory na SQL Serveru bez jakékoli přípony, ale to není nejlepší postup. Použití .mdf, .ndf a .ldf slouží k rozlišení těchto souborů, když je prohlížíme na úrovni operačního systému.

Je zřejmé, že datové soubory se vytvářejí při vytváření databáze. Můžete to udělat pomocí VYTVOŘIT DATABÁZI příkaz. I když se to zdá tak snadné, měli byste si být vědomi možných problémů.

V závislosti na tom, jak velká se databáze a související datové soubory nakonec stanou, můžete čelit problémům s fragmentací a dalším problémům s dobou zálohování a přesunem dat. Dochází k tomu, že datové soubory nemají správnou velikost.

Podívejte se na ilustraci níže. Zobrazuje výsledek spuštění CREATE DATABASE a poskytuje název databáze (MyDB).

Výpis 1 zobrazuje podrobnosti o vytvořené databázi:

-- Listing 1: Create Database Script
USE [master]
GO

/****** Object:  Database [MyDB]    Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 102400KB , MAXSIZE = UNLIMITED, FILEGROWTH = 131072KB )
 LOG ON 
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 102400KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

Možná se divíte, kde SQL Server vzal všechny tyto možnosti, protože jsme pouze vydali CREATE DATABASE MyDB.

SQL Server používá nastavení modelové databáze jako výchozí hodnoty pro každou novou databázi vytvořenou v této instanci. V tomto případě vidíme počáteční velikost souboru 100 MB. Autogrowth je 12 MB a 64 MB pro data a soubory protokolu.

Následné problémy

Důsledky nastavení zvýrazněných na obrázku 1 jsou:

  1. Primární datový soubor začíná od velikosti 100 MB. Jedná se o malou velikost. V závislosti na úrovni aktivity v databázi tedy bude muset velmi brzy růst.
  2. Vždy, když je potřeba automatický růst datový soubor, SQL server potřebuje získat 128 MB z dostupného místa v operačním systému. Opět je to malé, což znamená, že databáze se bude často automaticky rozrůstat . Růst databáze je nákladná operace, která může ovlivnit výkon, pokud k němu dochází příliš často. Kromě toho může časté narůstání databází způsobit jev zvaný fragmentace, který má zase schopnost způsobit vážné snížení výkonu databází. Druhý extrém nastavení přírůstku na vysokou hodnotu může mít za následek, že operace růstu budou trvat dlouho, než se dokončí, v závislosti na výkonu základního úložného systému.
  3. Soubory databáze se mohou neomezeně zvětšovat. To znamená, že s dostatečným časem mohou tyto soubory zabrat veškerý prostor na svazku, kde jsou umístěny. Chcete-li je přesunout, potřebujete objem jejich velikosti nebo větší. Další možností je přidání úložiště do svazku, když jsou tyto soubory uloženy.

Toto jsou klíčové problémy spojené se závislostí na výchozích hodnotách pro vytváření databází.

Předběžné přidělení

Vzhledem k dopadu růstu na výkon by dávalo větší smysl správně dimenzovat databázi na začátku projektu. Tímto způsobem vyhovíme požadavkům na řešení v dohledné budoucnosti.

Předpokládejme, že víme, že naše databáze bude mít nakonec velikost 1 GB. Při zahájení projektu můžeme přidělit 1 GB úložiště. Databáze pak nikdy nemusí růst. Odstraňuje problémy s fragmentací způsobené růstem databáze.

Výpis 2 ukazuje skript použitelný pro toto předpřidělení:

-- Listing 2: Create Database Script with Pre-allocation
USE [master]
GO

/****** Object:  Database [MyDB]    Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 1024MB , MAXSIZE = 2048MB, FILEGROWTH = 512MB )
 LOG ON 
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 512MB , MAXSIZE = 2048GB , FILEGROWTH = 512MB )
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

Pro demonstrační účely uvádíme 1GB prostoru. Produkční databáze může obvykle vyžadovat 1 TB. Jde o to:na začátku přidělit potřebný prostor. Pak eliminujete nebo výrazně snížíte potřebu růstu.

Nyní si musíme položit otázku, zda skutečně chceme, aby na našem svazku seděl jeden 1TB soubor. Bylo by moudré to rozdělit na menší kousky. Když dojde k paralelním operacím, jako je zálohování, každý soubor bude adresován jedním vláknem CPU pro víceprocesorový systém. S jedním souborem by to nešlo hladce.

Opět upravujeme náš skript tak, aby vyhovoval tomuto požadavku ve výpisu 3:

-- Listing 3: Create Database Script with Pre-allocation and 
USE [master]
GO

/****** Object:  Database [MyDB]    Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'MyDB01', FILENAME = N'C:\MSSQL\Data\MyDB01.mdf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
( NAME = N'MyDB02', FILENAME = N'C:\MSSQL\Data\MyDB02.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) 
( NAME = N'MyDB03', FILENAME = N'C:\MSSQL\Data\MyDB03.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
( NAME = N'MyDB04', FILENAME = N'C:\MSSQL\Data\MyDB04.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
( NAME = N'MyDB05', FILENAME = N'C:\MSSQL\Data\MyDB05.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB )
 LOG ON 
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 512MB , MAXSIZE = 2048GB , FILEGROWTH = 512MB )
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

Další informace

Měli bychom také zmínit, že nemá cenu používat tento přístup pro soubory protokolu. Jde o to, že SQL Server vždy zapisuje do souborů protokolu postupně. Také jsme použili příponu .ndf pro nové soubory, které přidáváme.

Klauzule MAXSIZE zajišťuje, že naše datové soubory nebudou narůstat donekonečna. Každému souboru jsme dali jiný logický a fyzický název – klauzule NAME určuje logický název souboru a klauzule FILENAME fyzický název.

Vytvoření databáze s většími datovými soubory zabere více času než jinak. Možná bude rozumnější vytvořit nejprve malou databázi a poté s ní manipulovat pomocí vhodných příkazů pro změnu velikosti a přidání souborů, dokud nevytvoříme ideální strukturu databáze.

Vytvořením databáze s explicitními možnostmi jsme vyřešili tři obavy uvedené dříve v tomto článku. Obrázek 2 ukazuje výsledek tohoto přístupu:

Nyní máme databázi správně nakonfigurovanou tak, aby se přizpůsobila nárůstu dat po delší dobu, aniž by bylo nutné růst datových souborů. Odstraňuje rizika fragmentace a pomáhá zajistit lepší správu datových souborů.

Správa datových souborů

Místo vytváření čtyř nebo pěti datových souborů v příkazu CREATE DATABASE můžeme použít klauzule MODIFY a ADD příkazu ALTER DATABASE T-SQL.

Opět začneme prohlášením uvedeným ve výpisu 4 níže. Vytváří jedinou databázi s datovým souborem o velikosti 100 MB a doprovodným souborem protokolu. Naším cílem je zajistit předběžné přidělení rozšířením tohoto souboru a následným přidáním dalších souborů.

-- Listing 4: Create Database Script
USE [master]
GO

IF EXISTS (SELECT * FROM sys.databases WHERE name='MyDB')
DROP DATABASE MyDB;

/****** Object:  Database [MyDB]    Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 102400KB , MAXSIZE = UNLIMITED, FILEGROWTH = 131072KB )
 LOG ON 
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 102400KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

Rozšířit datové soubory

Příkaz T-SQL, který rozšiřuje datový soubor, je uveden ve výpisu 5. Uvádí název databáze, název souboru a požadovanou počáteční velikost a přírůstek. V tomto případě nastavíme SQL Server tak, aby při startu alokoval 1 GB a poté alokoval 512 MB pro všechny následné automatické nárůsty.

-- Listing 5: Extend the Primary Datafile
USE [master]
GO
ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 1048576KB , FILEGROWTH = 524288KB )
GO

Výpis 6 ukazuje, jak by kód vypadal, kdybychom zadali MAXSIZE 2 GB:

-- Listing 6: Extend the Primary Datafile with Maximum Size
USE [master]
GO
ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 1048576KB , MAXSIZE = 2097152KB , FILEGROWTH = 524288KB )
GO

Pokud nastavíme klauzuli FILEGROWTH na 0, nastavíme náš SQL Server tak, aby NENÍ automaticky růst datového souboru . V tomto případě musíme explicitně zadat příkazy k rozšíření datového souboru nebo přidání dalších souborů.

Přidání datových souborů

Výpis 7 ukazuje kód, který používáme k přidání nového datového souboru do databáze. Všimněte si, že musíme znovu zadat název logického souboru a název fyzického souboru, který obsahuje úplnou cestu.

Také můžeme umístit fyzický soubor na jiný svazek. K tomu potřebujeme pouze změnit cestu.

-- Listing 7: Add Data Files to the Primary Filegroup
USE [master]
GO
ALTER DATABASE [MyDB] ADD FILE ( NAME = N'MyDB01', FILENAME = N'C:\MSSQL\Data\MyDB01.ndf' , SIZE = 1048576KB , FILEGROWTH = 524288KB ) TO FILEGROUP [PRIMARY]
GO

Rozšiřování a přidávání datových souborů se vztahuje také na scénář, kdy se rozhodneme zakázat automatický růst pro naše databáze (viz obrázek 4).

Poté musíme databázi ručně rozšířit pomocí výše uvedených kódů z výpisů 5 nebo 6 nebo přidat soubory jako ve výpisu 7.

Používání skupin souborů

Skupiny souborů nám umožňují spravovat kolekce datových souborů společně. Některé datové soubory uložené na různých discích nebo různých svazcích můžeme logicky seskupit do jedné skupiny souborů. Tato skupina souborů vytváří abstrakční vrstvu mezi tabulkami a indexy a skutečnými fyzickými soubory uchovávajícími data.

Pokud tedy vytvoříme tabulku ve skupině souborů, data v této tabulce se rozloží mezi všechny datové soubory přiřazené skupině souborů.

Do této chvíle jsme se zabývali pouze PRIMÁRNÍ skupinou souborů. Výpis 8 ukazuje, jak můžeme přidat nový soubor MyDB02 do skupiny souborů jiné než primární skupina souborů.

První příkaz po nastavení kontextu databáze na hlavní vytvoří novou skupinu souborů FG01. Další příkaz pak přidá soubor do této nové skupiny souborů s podobnými možnostmi, jaké jsou použity ve výpisu 7.

-- Listing 8: Add Data Files to the Primary Filegroup
USE [master]
GO
ALTER DATABASE [MyDB] ADD FILEGROUP [FG01]
GO
ALTER DATABASE [MyDB] ADD FILE ( NAME = N'MyDB02', FILENAME = N'C:\MSSQL\Data\MyDB02.ndf' , SIZE = 102400KB , MAXSIZE = 2097152KB , FILEGROWTH = 524288KB ) TO FILEGROUP [FG01]
GO

Odstranění datových souborů

Obrázek 5 ukazuje výsledek operací, které jsme dosud provedli. Máme tři datové soubory. Dva z nich jsou ve skupině souborů PRIMARY a třetí je ve skupině souborů FG01.

Předpokládejme, že jsme udělali něco špatně, například jsme nastavili špatnou velikost souboru. Potom můžeme skupinu souborů zrušit pomocí následujícího kódu ve výpisu 9:

-- Listing 9: Drop Data Files
USE [MyDB]
GO
ALTER DATABASE [MyDB]  REMOVE FILE [MyDB02]
GO

Závěr

Tento článek prozkoumal typy databázových souborů, možné komplikace způsobené nárůstem datových souborů a způsoby řešení problému. Také jsme zkoumali kódy T-SQL pro rozšiřování datových souborů a přidávání nových datových souborů do databáze. Dotkli jsme se také použití skupin souborů.

Naším cílem je zajistit, že když nasadíme databáze, připravíme databázi na uložení všech dat, která kdy bude pro konkrétní aplikaci potřebovat.

Odkazy

  1. Databázové soubory a skupiny souborů

  1. Proč se autoinkrement MySQL zvyšuje u neúspěšných vložení?

  2. SAP Lumira a most JDBC-ODBC

  3. Oracle text escapující se složenými závorkami a zástupnými znaky

  4. Analyzujte název souboru a cestu z úplné cesty