Úvod
V předchozím článku jsme zdůraznili, že databáze msdb ukládá prakticky všechny objekty související s automatizací. V tomto článku se podíváme na případ přesouvání úloh a objektů mezi instancemi SQL Serveru.
Začněme seznamem objektů uložených v msdb na této instanci SQL Server.
Máme vytvořeno několik úloh s plánem údržby (viz článek Vytváření plánů údržby v SQL Serveru). Máme také dvě upozornění a jednoho operátora. Msdb ukládá také výstrahy a operátory (viz obrázek 1). Tyto objekty odstraníme a poté je obnovíme obnovením zálohy databáze msdb.
Zobrazení objektů uložených v msdb
Pokud se dotazujeme na relevantní systémové objekty, vidíme také tyto objekty vrácené jako výsledná sada. (Viz výpis 1, obrázek 2). Msdb také ukládá systémové katalogy se záznamy úloh, protokoly zálohování, operátory, místa údržby, databázovou poštu a další položky související s automatizací.
-- Listing 1: Check List of Jobs in the Instance
use msdb
go
select @@SERVERNAME as ServerName
select name from sysjobs;
Záloha msdb
Abychom ilustrovali koncept jedné instance SQL Serveru, nejprve provedeme zálohu databáze msdb. V produkčních scénářích by pravidelné zálohování vašich systémových databází mělo být součástí vaší strategie. Obvykle jsou dostatečně malé, aby se pohodlně vešly do denního plánu plného zálohování.
Samozřejmě, když odkazuji na systémovou databázi, nezahrnuje to nezbytné tempdb. Navíc nemusí být vyžadována ani denní záloha modelové databáze – stačí týdenní záloha. Pro úplné denní zálohy zvažte hlavní a msdb.
Pomocí jednoduchého kódu ve výpisu 2 provedeme zálohu databáze msdb.
-- Listing 2: Backup msdb Database
backup database msdb to disk = 'E:\DriveF\msdb_18072020.bak';
Zrušení úloh
Jakmile je záloha připravena, zrušíme úlohy na instanci. Pamatujte, že zrušení úloh vytvořených plánem údržby vyžaduje odstranění plánů údržby, které je vytvořily (viz obrázek 3).
Běžné úlohy lze odstranit jejich odstraněním pomocí GUI. Dalším způsobem je spuštění kódu z výpisu 3, následovaného kódem z výpisu 4.
Výpis 3 generuje sadu skriptů nezbytných pro zrušení úloh. Poté ve výpisu 4 spustíme skripty vygenerované ve výpisu 3.
Tento přístup můžete použít, i když se názvy úloh ve vaší instanci pravděpodobně liší od mých.
-- 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
Po zrušení úloh můžeme ověřit, že nezůstala žádná pracovní místa. Použijte stejný skript jako ve výpisu 1. Zvažujeme dva způsoby scénáře:
- Někdo omylem smazal úlohy a podobné objekty v instanci.
- Chceme importovat úlohy z jedné instance do jiné.
Obnovování msdb
Operaci obnovy zahájíme pomocí skriptu z výpisu 5. V tomto skriptu začneme nastavením databáze do režimu jednoho_uživatele. Protože někdo nebo něco (účet SQL Agent?) může být přihlášeno do této databáze, je to nutné.
Poté zadáme příkaz „restore“ a nastavíme novou databázi msdb na multi_user. Všimněte si, že jsme použili volbu REPLACE v příkazu restore. Pokud migrujete msdb do nové instance, bude nezbytná klauzule REPLACE. Bez něj může SQL Server vrátit chybu o tom, že sada záloh nepatří do databáze msdb v instanci.
-- 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
Po dokončení operace obnovy jsou chybějící úlohy a další objekty zpět. Přicházejí kompletní s jejich příslušnou pracovní historií. Všechny vztahy mezi úlohami s databázemi a dalšími objekty jsou nedotčeny. Úlohy fungují, jako by je nikdo a nic nikdy neodstranil.
Závěr
Můžeme snadno migrovat úlohy a podobné objekty z jedné instance SQL Serveru do druhé. K tomu potřebujeme proces zálohování a obnovy msdb. Podobně můžeme tyto objekty obnovit na instanci SQL Serveru, pokud se z nějakého důvodu ztratí.