Въведение
В предишна статия подчертахме, че базата данни msdb съхранява практически всички обекти, свързани с автоматизацията. В тази статия ще разгледаме случая на преместване на задания и обекти между екземпляри на SQL Server.
Нека започнем със списъка с обекти, съхранявани в msdb на този екземпляр на SQL Server.
Имаме няколко работни места, създадени с план за поддръжка (вижте статията Създаване на планове за поддръжка в SQL Server). Имаме и два сигнала и един оператор. Msdb също съхранява сигнали и оператори (вижте фигура 1). Ще изтрием тези обекти и след това ще ги възстановим, като възстановим резервно копие на базата данни msdb.
Преглед на обекти, съхранени в msdb
Ако отправим заявка към съответните системни обекти, ние също виждаме тези обекти, върнати като резултатен набор. (Вижте листинг 1, фигура 2). Msdb също така съхранява системните каталози със записи на работни места, архивни регистри, оператори, места за поддръжка, поща в базата данни и други елементи, свързани с автоматизацията.
-- Listing 1: Check List of Jobs in the Instance
use msdb
go
select @@SERVERNAME as ServerName
select name from sysjobs;
Резервно копие на msdb
За да илюстрираме концепцията за един екземпляр на SQL Server, първо правим резервно копие на базата данни msdb. В производствените сценарии редовното архивиране на вашите системни бази данни трябва да бъде част от вашата стратегия. Обикновено са достатъчно малки, за да се впишат удобно в ежедневния пълен архивен график.
Разбира се, когато се позовавам на системна база данни, това не включва необходимия tempdb. Освен това може да не се изисква ежедневно архивиране за моделна база данни – достатъчно е седмично архивиране. За пълните ежедневни архиви помислете за master и msdb.
Използвайки простия код в листинг 2, правим резервно копие на базата данни msdb.
-- Listing 2: Backup msdb Database
backup database msdb to disk = 'E:\DriveF\msdb_18072020.bak';
Отпадане на работни места
След като резервното копие е готово, пускаме заданията в инстанцията. Обърнете внимание, че отпадането на заданията, създадени от план за поддръжка, изисква изтриване на плановете за поддръжка, които са ги създали (вижте фигура 3).
Редовните задания могат да бъдат премахнати, като ги изтриете с GUI. Друг начин е да стартирате кода от листинг 3, последван от кода от листинг 4.
Списък 3 генерира набора от скриптове, необходими за отпадане на заданията. След това в листинг 4 изпълняваме скриптове, генерирани в листинг 3.
Можете да използвате този подход, въпреки че имената на работни места във вашия екземпляр вероятно са различни от моите.
-- Listing 3: Generate Script to Drop Jobs
USE [msdb]
GO
select 'EXEC msdb.dbo.sp_delete_job @job_name=N''' + [name] + ''', @delete_unused_schedule=1' from sysjobs;
GO
-- Listing 4: Drop SQL Agent Jobs
EXEC msdb.dbo.sp_delete_job @job_name=N'DB1_BackupTransactionLog', @delete_unused_schedule=1
EXEC msdb.dbo.sp_delete_job @job_name=N'syspolicy_purge_history', @delete_unused_schedule=1
След като изхвърлим работните места, можем да проверим дали няма останали работни места. Използвайте същия скрипт, както е показано в листинг 1. Разглеждаме два начина за сценария:
- Някой случайно е изтрил задания и подобни обекти в даден екземпляр.
- Искаме да импортираме задания от един екземпляр в друг.
Възстановяване на msdb
Започваме операцията за възстановяване, използвайки скрипта от листинг 5. В този скрипт започваме с настройка на базата данни в режим single_user. Тъй като някой или нещо (акаунт на SQL агент?) може да е влязло в тази база данни, това е необходимо.
След това издаваме командата „възстановяване“ и задаваме новата база данни msdb на multi_user. Имайте предвид, че използвахме опцията REPLACE в оператора за възстановяване. Ако мигрирате msdb към нов екземпляр, ще е необходима клаузата REPLACE. Без него SQL Server може да върне грешка относно набора за архивиране, който не принадлежи към базата данни msdb на екземпляра.
-- Listing 5: Restore msdb database
use master
go
alter database msdb set single_user with rollback immediate;
GO
restore database msdb from disk = 'E:\DriveG\msdb_18072020.bak'
with replace;
GO
alter database msdb set multi_user;
GO
След като операцията по възстановяване приключи, липсващите задания и други обекти се връщат. Те идват в комплект със съответните си трудови истории. Всички връзки между заданията с бази данни и други обекти са непокътнати. Задачите работят така, сякаш никой и нищо не ги е изтрило.
Заключение
Можем лесно да мигрираме задания и подобни обекти от един екземпляр на SQL Server към друг. За това се нуждаем от процес на архивиране и възстановяване на msdb. По същия начин можем да възстановим тези обекти в екземпляр на SQL Server, ако бъдат загубени по някаква причина.