Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Основи на управлението на файлове с данни в SQL Server

Въведение

Файловете с данни са физически обекти, които съставляват най-важната част от системата на базата данни, тъй като съдържат действителни данни. Можете да мислите за база данни като колекция от файлове с данни. Инстанция ви дава средствата за монтиране и достъп до такива файлове.

Тук управлението на файлове с данни е разбиране как да наблюдавате и преоразмерявате съществуващи файлове с данни и как да добавяте или премахвате файловете с данни от база данни.

T-SQL кодовете за тези операции присъстват в документацията на Microsoft. Въпреки това, в тази статия бихме искали да обсъдим тактиките около управлението на тези файлове за тези от нас, които все още изпълняват локални инсталации на SQL Server.

Типове файлове с данни и възможни проблеми

За всяка нова база данни, създадена в SQL Server, трябва да имаме създадени поне два файла – първичен файл с данни и лог файл.

  • Основният файл с данни има разширение .MDF.
  • Регистрационният файл има разширение .LDF.
  • Когато добавяме файлове с данни към база данни на SQL Server, обикновено използваме разширението .NDF.

Забележка :Възможно е да се създават файлове с данни в SQL Server без разширение, но това не е най-добрата практика. Използването на .mdf, .ndf и .ldf служи за разграничаване на тези файлове, когато ги преглеждаме на ниво операционна система.

Очевидно файловете с данни се създават, когато създавате база данни. Можете да го направите с СЪЗДАВАНЕ НА БАЗА ДАННИ команда. Въпреки че изглежда толкова лесно, трябва да сте наясно с възможните проблеми.

В зависимост от това колко големи в крайна сметка ще станат базата данни и свързаните с нея файлове с данни, може да се сблъскате с проблеми с фрагментацията и други проблеми с времето за архивиране и придвижването на вашите данни. Това се случва, че файловете с данни не са оразмерени правилно.

Разгледайте илюстрацията по-долу. Той показва резултата от изпълнение на CREATE DATABASE и предоставяне на името на базата данни (MyDB).

Списък 1 показва подробностите за създадената база данни:

-- 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

Може да се чудите откъде SQL Server е получил всички тези опции, тъй като всичко, което направихме, беше да издадем CREATE DATABASE MyDB.

SQL Server използва настройките на базата данни на модела като стойности по подразбиране за всяка нова база данни, създадена в този екземпляр. В този случай виждаме първоначалния размер на файла от 100MB. Автоматичният растеж е съответно 12MB и 64MB за данните и регистрационните файлове.

Последващите проблеми

Последствията от настройките, подчертани на фигура 1, са:

  1. Основният файл с данни започва от 100 MB. Той е малък размер. По този начин, в зависимост от нивото на активност в базата данни, тя ще трябва да нарасне много скоро.
  2. Винаги, когато има нужда от автоматично нарастване файла с данни, SQL сървърът трябва да придобие 128MB от наличното пространство на операционната система. Отново е малко, което означава, че базата данни ще нараства автоматично често . Разрастването на базата данни е скъпа операция, която може да повлияе на производителността, ако се случва твърде често. Освен това честото нарастване на базата данни може да причини феномен, наречен фрагментация, който от своя страна има способността да причинява сериозно влошаване на производителността на бази данни. Другата крайност на задаване на увеличението на висока стойност може да доведе до завършване на операциите по растеж, в зависимост от производителността на основната система за съхранение.
  3. Файловете на базата данни могат да се увеличават за неопределено време. Това означава, че при достатъчно време тези файлове могат да заемат цялото пространство на тома, където се намират. За да ги преместите, ви е необходим обем с техния размер или повече. Друга опция е добавяне на място за съхранение към обема, когато тези файлове се намират.

Това са ключови проблеми, свързани със стойностите по подразбиране за създаване на бази данни.

Предварително разпределение

Като се има предвид въздействието на растежа върху производителността, би било по-разумно да се оразмери правилно базата данни в началото на проекта. По този начин ние отговаряме на изискванията за решение в обозримо бъдеще.

Да приемем, че знаем, че нашата база данни в крайна сметка ще стане 1GB. Може да разпределим 1 GB място за съхранение, когато проектът започне. Тогава базата данни никога не трябва да нараства. Той премахва проблемите с фрагментацията, причинени от нарастването на базата данни.

Списък 2 показва скрипта, приложим за това предварително разпределение:

-- 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

Споменаваме 1GB пространство за демонстрационни цели. Обикновено производствената база данни може да изисква 1TB. Въпросът е:разпределете необходимото място в началото. След това премахвате или значително намалявате нуждата от растеж.

Сега трябва да се запитаме дали наистина искаме един-единствен файл от 1TB да седи на нашия том. Би било разумно да го разделите на по-малки парчета. Когато се появят паралелни операции, като архивиране, всеки файл ще бъде адресиран от една нишка на процесора за многопроцесорна система. С един файл няма да върви гладко.

Отново модифицираме нашия скрипт, за да посрещнем това изискване в листинг 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

Допълнителна информация

Трябва също да споменем, че няма полза от използването на този подход за регистрационни файлове. Работата е там, че SQL Server винаги записва в лог файловете последователно. Също така използвахме разширението .ndf за новите файлове, които добавяме.

Клаузата MAXSIZE гарантира, че нашите файлове с данни няма да се увеличават безкрайно. Дадохме на всеки файл различно логическо и физическо име – клаузата NAME указва логическото име на файла, а клаузата FILENAME указва физическото име.

Създаването на база данни с по-големи файлове с данни ще отнеме повече време, отколкото иначе. Може би е по-разумно първо да създам малка база данни и след това да я манипулирате с подходящи команди за преоразмеряване и добавяне на файлове, докато установим идеална структура на базата данни.

Създавайки базата данни с изрични опции, ние се справихме с трите опасения, повдигнати по-рано в тази статия. Фигура 2 показва резултата от този подход:

Сега имаме база данни, правилно конфигурирана, за да побере нарастването на данните за продължителен период, без да е необходимо нарастване на файлове с данни. Той премахва рисковете от фрагментиране и помага да се осигури по-добро управление на файловете с данни.

Управление на файлове с данни

Вместо да създаваме четири или пет файла с данни в израза CREATE DATABASE, можем да използваме клаузите MODIFY и ADD на оператора ALTER DATABASE T-SQL.

Още веднъж започваме с изявлението, показано в листинг 4 по-долу. Той създава единна база данни със 100MB файл с данни и придружаващ регистрационен файл. Нашата цел е да осигурим предварително разпределение, като разширим този файл и след това добавим още файлове.

-- 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

Разширяване на файлове с данни

Изявлението на T-SQL, което разширява файл с данни, е показано в листинг 5. Той определя името на базата данни, името на файла и желания първоначален размер и инкремент. В този случай настройваме SQL Server да разпределя 1GB при стартиране и след това разпределяме 512MB за всички следващи автоматични нараствания.

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

Списък 6 показва как би изглеждал кодът, ако посочим MAXSIZE от 2GB:

-- 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

Ако зададем клаузата FILEGROWTH на 0, ние задаваме нашия SQL Server да НЕ увеличава автоматично файла с данни . В този случай трябва изрично да издадем команди, за да увеличим файла с данни или да добавим други файлове.

Добавяне на файлове с данни

Списък 7 показва кода, който използваме за добавяне на нов файл с данни към базата данни. Имайте предвид, че трябва отново да посочим името на логическото и физическото име на файл, което включва пълен път.

Също така можем да поставим физическия файл на различен том. За това трябва само да променим пътя.

-- 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

Разширяването и добавянето на файлове с данни се отнасят и за сценария, при който избираме да деактивираме автоматичното нарастване за нашите бази данни (вижте фигура 4).

След това трябва да разширим базата данни ръчно, като използваме горните кодове от листинги 5 или 6, или да добавим файлове, както е в листинг 7.

Използване на файлови групи

Файловите групи ни позволяват да управляваме заедно колекциите от файлове с данни. Можем логически да групираме някои файлове с данни, съхранявани на различни дискове или различни томове, в една файлова група. Тази файлова група създава абстракционен слой между таблиците и индексите и действителните физически файлове, съхраняващи данните.

Следователно, ако създадем таблица във файлова група, данните в тази таблица се разпределят във всички файлове с данни, присвоени на файловата група.

До този момент имахме работа само с ПЪРВНАТА файлова група. Списък 8 показва как можем да добавим нов файл MyDB02 към файлова група, различна от основната файлова група.

Първият израз след задаване на контекста на базата данни за master създава новата файлова група FG01. След това следващият израз добавя файла към тази нова файлова група с опции, подобни на тези, използвани в листинг 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

Изпускане на файлове с данни

Фигура 5 показва резултата от операциите, които сме извършили до момента. Имаме три файла с данни. Два от тях са в ОСНОВНАТА файлова група, а третият е във файловата група FG01.

Да предположим, че сме направили нещо нередно, например, задали грешен размер на файла. След това можем да пуснем файловата група, като използваме следния код в листинг 9:

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

Заключение

Тази статия изследва типовете файлове на базата данни, възможните усложнения, причинени от нарастването на файловете с данни, и начините за разрешаване на проблема. Също така, ние разгледахме T-SQL кодовете за разширяване на файлове с данни и добавяне на нови файлове с данни към база данни. Засегнахме и използването на файлови групи.

Нашата цел е да гарантираме, че когато внедряваме бази данни, ние подготвяме базата данни за съхраняване на всички данни, които някога ще са необходими за конкретно приложение.

Препратки

  1. Файлове и файлови групи от бази данни

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ограничение по подразбиране на SQL за вмъкване на колона със стойност по подразбиране в таблицата на SQL Server

  2. Как работи операторът IF в SQL Server

  3. DATEPART() Примери в SQL Server

  4. Можете ли да имате логика if-then-else в SQL?

  5. OLTP в паметта:Какво е новото в SQL Server 2016