В предишните статии от серията SQL Server System Databases, ние научихме предназначението на всички бази данни на SQL Server System, които идват като част от инсталацията на SQL Server, и разбрахме най-добрите практики, които трябва да бъдат приложени за тях. Освен това разбрахме по-подробно базите данни Tempdb и MSDB. Тъй като архивирането и възстановяването на системната база данни е малко по-различно в сравнение с потребителските бази данни, ще разгледаме подробно как да архивираме системни бази данни и да възстановим системната база данни от архиви в тази статия.
Резервно копие на SQL база данни
Терминът Резервно копие се отнася до копиране на данните в база данни като архивен файл, който може да се използва за възстановяване или възстановяване на данните допълнително.
Пълно архивиране на база данни ще съдържа копията на данни във файловете с данни и регистрационните файлове, за да се възстанови като база данни или да се извърши възстановяване в момента в случай на бедствия или катастрофални повреди. Следователно редовното пълно архивиране на системата, както и потребителските бази данни са от решаващо значение.
Освен пълно архивиране, SQL Server поддържа няколко други опции за архивиране като диференциално архивиране, архивиране на транзакционен регистрационен файл, архивиране на файлове и др., но няма да се фокусираме върху тях, тъй като това е извън обхвата на тази статия.
Пълно архивиране на базата данни трябва да бъде планирано да се изпълнява периодично или след някакви специфични промени в конфигурацията. Въпреки че SQL Server може да приеме пълното архивиране на база данни в различни разширения на файлове, се препоръчва да запазите този архив като *.bak файл за по-лесно класифициране и поддръжка.
Синтаксисът на базата данни за архивиране има много налични опции, но ние ще се съсредоточим само върху основните команди, необходими за пълното архивиране на всяка база данни. Пълният синтаксис присъства в статията на MSDN.
Синтаксис на РЕЗЕРВНА БАЗА ДАННИ (минимален)
BACKUP DATABASE <Database_name>
TO DISK = <File_Path>
GO
Резервно копие на потребителски бази данни
За да направите пълно архивно копие на AdventureWorks база данни, просто заменете Име на база данни и Пътят на файла в горната команда BACKUP DATABASE и я изпълнете:
BACKUP DATABASE [AdventureWorks]
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\AdventureWorks_Full.bak'
GO
Архивиране на системни бази данни
Използвайки горната команда BACKUP DATABASE, можем да направим пълно архивиране на системни бази данни, като master, msdb и model:
BACKUP DATABASE master
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\master_Full.bak'
GO
BACKUP DATABASE model
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\model_Full.bak'
GO
BACKUP DATABASE msdb
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\msdb_Full.bak'
GO
Можем да отидем до горния път на папката и там виждаме пълните архиви на базата данни, създадени успешно както за потребителската база данни, така и за системните бази данни:
Възможно ли е да се архивира базата данни tempdb?
Нека опитаме да направим пълно архивиране на системната база данни tempdb, използвайки същия синтаксис на BACKUP DATABASE:
BACKUP DATABASE tempdb
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\tempdb_Full.bak'
GO
Както обсъждахме в предишни статии, tempdb е единствената база данни, за която има резервно копие не може да се вземе . Базата данни tempdb ще се създава наново, когато се стартират услугите на SQL Server. Следователно, ако има някакви проблеми с tempdb, рестартирането на услугата SQL Server ще помогне за разрешаването им.
Възстановяване на база данни
Възстановяването на база данни от Full Backup(*.bak) връща базата данни с пълни данни или „връща“ база данни до определен момент. Командата RESTORE може да се използва и за възстановяване на файлове, файлови групи или транзакционни регистрационни файлове, но не е в обхвата на настоящата статия.
За възстановяване на пълен архив на база данни , можем да използваме синтаксиса по-долу. Забележка:Подобно на командата BACKUP, командата RESTORE има много опции, но ще се обърнем само към основните. Можете да намерите подробна информация за тези опции в специална статия в MSDN.
ВЪЗСТАНОВЯВАНЕ на синтаксис на БАЗА ДАННИ
RESTORE DATABASE <Database_Name>
FROM DISK = <File Path>
WITH REPLACE
GO
Възстановяване на потребителска база данни
За да възстановите AdventureWorks база данни от пълното архивиране, което взехме по-рано, можем да използваме командата RESTORE DATABASE, като заменим Име на базата данни и Пътят на файла както е показано по-долу:
RESTORE DATABASE [AdventureWorks]
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\AdventureWorks_Full.bak'
WITH REPLACE
GO
Възстановяване на база данни за модели
Нека се опитаме да възстановим базата данни на моделната система с помощта на командата RESTORE DATABASE:
RESTORE DATABASE model
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\model_Full.bak'
WITH REPLACE
GO
Архивирането на база данни на модела може да бъде успешно възстановено с помощта на командата RESTORE DATABASE по подразбиране.
Възстановяване на основната база данни
Сега нека опитаме да възстановим главната база данни на системата с помощта на командата RESTORE DATABASE:
RESTORE DATABASE master
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\master_Full.bak'
WITH REPLACE
GO
Той хвърли грешка, в която се посочва, че екземплярът на SQL Server трябва да работи в режим на един потребител, за да възстанови основната база данни. Както показва съобщението за грешка, трябва да стартираме нашия екземпляр на SQL Server в режим на един потребител и след това да опитаме да възстановим главната база данни.
За да стартирате екземпляр на SQL Server в режим на един потребител, можем да приложим един от следните методи:
- Команден ред
- Параметри за стартиране на SQL Server в SQL Server Configuration Manager.
Подход на командния ред
За да стартирате екземпляра на SQL Server в режим на един потребител чрез командния ред, отворете командния ред с Изпълни като администратор опция, както е показано по-долу:
След като е готово, въведете командата:
NET STOP <SQL_Server_Service_Name>
SQL_Server_Service_Name могат да бъдат получени чрез SQL Server Configuration Manager или services.msc
Мениджър на конфигурацията на SQL сървър
Services.msc
Тъй като нашата услуга на SQL Server е екземпляр по подразбиране, можем да използваме името MSSQLSERVER както е подчертано по-горе. След като бъде въведен, той ще поиска потвърждение за спиране на всички зависими услуги. Можем да спрем и услугата SQL Server Agent, като напишем Y за Да .
Когато услугата SQL Server е спряна, можем да я стартираме в режим на един потребител. Изпълнете командата по-долу, където /m означава стартиране на SQL Server Service в режим на един потребител.
NET START MSSQLSERVER /m
Когато се извърши, можем да опитаме да възстановим главната база данни. Изпълнете командата RESTORE BACKUP както преди:
Като стартираме екземпляр на SQL Server в режим на един потребител, ние сме в състояние да възстановим успешно основната системна база данни от последното известно пълно архивиране на базата данни без никакви проблеми. По този начин научихме, че за възстановяване на основната база данни, екземплярът на SQL Server трябва да е в режим на един потребител.
С екземпляр на SQL Server в режим на един потребител, само един потребител може да се свърже и след като нашите дейности по възстановяване са завършени, трябва да го променим обратно в режим на много потребители, като спрем екземпляра на SQL Server и стартираме екземпляр на SQL Server без опция /m, както е показано по-долу:
NET STOP MSSQLSERVER
NET START MSSQLSERVER
Веднъж стартирани в нормален режим или режим на много потребители, всички потребители могат да се свържат към екземпляра на SQL Server и да извършват своите дейности. Можем също така да потвърдим, че основната база данни е била възстановена до момента, в който е направено пълно архивиране и всички промени в конфигурацията, извършени след това, трябва да бъдат извършени отново.
Няколко неща, които трябва да се отбележат, докато екземплярът на SQL Server е в режим на един потребител:
- Когато екземплярът на SQL Server е в режим на един потребител, само една потребителска сесия може да се свърже с него. Следователно, уверете се, че услугата SQL Server Agent и всички други услуги, свързани с SQL Server, са в спирани статус. В противен случай тези връзки може да се установят първо и ако това се случи, не можем да се свържем със SQL Server, за да възстановим базата данни.
- Докато се свързвате чрез SSMS в режим на един потребител, изключете Object Explorer и се свържете само през прозореца за заявка. Ако се установи връзка от Object Explorer, се установява единична връзка. Следователно не можете да се свържете от прозореца на заявката. Вижте екранната снимка по-долу – тя демонстрира как да свържете само прозореца за нова заявка, без да се свързвате чрез Object Explorer:
Параметър за стартиране на SQL Server в Configuration Manager
Тези, които са по-удобни с GUI вместо с командния ред, могат да приложат подхода по-долу.
1). Отворете SQL Server Configuration Manager като напишете MSSQLManager13.msc в командния ред. Тук 13 се отнася до SQL Server 2016, така че използвайте правилните съответстващи числа за други версии на SQL Server:
- SQL сървър 2012 – SQLServerManager11.msc
- SQL сървър 2014 – SQLServerManager12.msc
- SQL сървър 2016 – SQLServerManager13.msc
- SQL сървър 2017 – SQLServerManager14.msc
- SQL сървър 2019 – SQLServerManager15.msc
2). Разгънете SQL Server Services :
3). Щракнете с десния бутон върху услугата SQL Server, идентифицирана като SQL Server (MSSQLSERVER) > Свойства .
4). Изберете Параметри за стартиране раздел меню.
5). Кликнете върху -m в Посочете параметър за стартиране поле, след което щракнете върху Добавяне за да стартирате услугата SQL Server в режим на един потребител.
6). Щракнете върху OK и рестартирайте услугата SQL Server, за да стартирате услугата SQL Server в режим на един потребител.
За да промените екземпляра на SQL Server от режим на един потребител в режим за няколко потребители или нормален режим след възстановяване на основната база данни, просто щракнете върху параметър -m от Съществуващ параметър с , Щракнете върху Премахване и рестартирайте услугата SQL Server.
Възстановяване на MSDB база данни
Сега, нека опитаме да възстановим архива на системната база данни msdb, като използваме командата RESTORE DATABASE по подразбиране:
RESTORE DATABASE msdb
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\msdb_Full.bak'
WITH REPLACE
GO
Този опит ни носи грешка, че Изключителен достъп не може да бъде получен, тъй като базата данни се използва . Това съобщение за грешка показва, че някой друг процес използва msdb . Следователно, трябва да приложим един от следните подходи, за да възстановим правилно базата данни msdb:
- Стартирайте екземпляра или услугата на SQL Server в режим на един потребител, както направихме по-рано, за да избегнете свързване и достъп до msdb база данни.
- Или донесете msdb база данни в режим на един потребител, без никой потребител да се свързва с нея.
Тъй като знаем как да превърнем екземпляра или услугата на SQL Server в режим на един потребител, докато възстановяваме основната системна база данни, ще опитаме втората опция, като променим базата данни msdb в режим на един потребител, за да възстановим архива на базата данни msdb.
Изпълнете командата по-долу:
USE [master]
GO
ALTER DATABASE [msdb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
Важно :Изпълнението на горната команда може да се провали в следните случаи:
- Услугата за агент на SQL Server е стартирана и работи. За да коригирате грешката, спрете услугата на агент на SQL Server и опитайте отново.
- Всички потребителски сесии са свързани към базата данни msdb. Можем да открием активни връзки към msdb или друга база данни, като използваме следната заявка:
use master
GO
select spid
from sys.sysprocesses
where dbid = db_id('msdb')
Ако тази заявка донесе някакви резултати, това показва, че някои потребителски сесии са свързани към базата данни msdb. В този случай трябва да убием тези сесии чрез командата KILL и заменяме spid получено от горното изпълнение на заявка:
KILL <spid>
Когато няма свързани сесии към msdb база данни, ще можем успешно да преведем базата данни msdb в режим на един потребител. Всеки път, когато база данни е в режим на един потребител, ще можем да видим думата (единичен потребител), показана в близост до базата данни, както е подчертано по-долу за база данни msdb:
Нека опитаме да възстановим msdb база данни сега използвайки нашата команда RESTORE DATABASE:
С базата данни msdb в режим на един потребител успяхме да възстановим msdb база данни успешно от последното известно добро Пълно архивиране на msdb база данни. Възстановяването на база данни от резервно копие по подразбиране ще я преведе в многопотребителски режим и ако все още е в режим на един потребител по някаква причина, можем да изпълним командата по-долу, за да я върнем обратно в многопотребителски режим:
USE [master]
GO
ALTER DATABASE [msdb] SET MULTI_USER
GO
Преизграждане на системни бази данни
За всяка идеална производство среди е изключително важно да имате пълно архивиране на системните бази данни, за да възстановите системните бази данни без загуба на данни в случай на случайни грешки от потребители или повреда на базата данни или възстановяване при аварийно възстановяване.
В най-лошия случай, ако услугите на SQL Server не могат да бъдат стартирани, тогава ще трябва първо да опитаме да възстановим системните бази данни от последните известни пълни архиви и ако нямаме налични пълни архиви и не можем да стартираме SQL Server Services, тогава сме остава само една последна опция, т.е. Преизграждане на системните бази данни. Забележката :Възстановяването на системни бази данни ще изчисти всички конфигурации на ниво сървър, съхранявани във всички системни бази данни, и може да загубим всички конфигурации на ниво сървър/инстанция, като входове, конфигурации на агент на SQL Server, други критични подробности, съхранявани в системните бази данни, които сме виждали в предишните ни статии.
Нека да разгледаме набързо как да възстановим системните бази данни (Както споменахме по-горе, този процес трябва да се извърши като последна мярка за връщане на екземпляра на SQL Server при липса на Пълни архиви на системни бази данни).
За да изградим отново системните бази данни, ще ни трябва инсталационният носител на SQL Server, монтиран или копиран на сървъра, където е инсталиран нашият екземпляр на SQL Server. След като приключим, трябва да изпълним следните стъпки:
- В командния ред отидете до пътя, където се намират инсталационните файлове на SQL Server (setup.exe):
C:\Program Files\Microsoft SQL Server\130\Setup Bootstrap\SQLServer2016
- Изпълнете командата по-долу, като замените всички параметри с валидни стойности. Стойност ACTION =REBUILDDATABASE обозначава, че всички системни бази данни трябва да бъдат възстановени след изпълнение на тази команда.
Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName /SQLSYSADMINACCOUNTS=accounts [ /SAPWD= StrongPassword ] [ /SQLCOLLATION=CollationName]
Параметрите, които трябва да се променят, включват:
- Име на инстанция – Името на екземпляра на SQL Server, в нашия случай е RRJ
- Профили – името на акаунта на системния администратор, в нашия случай е sa
- Силна парола – силна парола за sa акаунт на системния администратор.
- CollationName – Името на сравняване на базата данни на SQL Server, ако трябва да бъде променено.
Заключение
Научихме се как да архивираме и възстановяваме потребителски и системни бази данни и разбрахме допълнителните мерки, необходими за възстановяване на системни бази данни като главни и msdb системни бази данни. В случай на липсващи пълни архиви на системни бази данни, ние също научихме как да възстановим системни бази данни от инсталационния носител на SQL Server и разбрахме свързаните с конфигурацията загуби на данни, свързани с възстановяването на системни бази данни. За да обобщим, косвено разбрахме важността на планирането на пълни архиви за системни бази данни в допълнение към потребителските бази данни.
Благодарим ви за отделеното време и скоро ще се срещнем отново с друга интересна статия.