MSDB je systémová databáze používaná SQL Serverem. MSDB ukládá všechny druhy dat, jako je historie zálohování a obnovy, historie úloh SQL Agent, historie sledování dopravy protokolu, balíčky SSIS, data Database Engine Tuning Advisor a data fronty Service Broker. Stejně jako databáze uživatelů potřebuje msdb pravidelnou údržbu, včetně optimalizace indexu a, což je důležitější, pravidelného čištění.
Historie zálohování a obnovení
Ve výchozím nastavení neexistuje žádná metoda pro vyčištění nebo odstranění zálohování a obnovení historie z msdb. Uchovává se navždy, dokud nenastavíte ruční nebo automatický proces smazání dat. Pokud tato data nevyčistíte, bude msdb nadále růst, což znamená, že čtení a zápis do těchto tabulek se může zpomalit a ovlivnit rychlost vašich úloh zálohování.
Většina nástrojů třetích stran a renomovaných řešení údržby zahrnuje procesy pro vymazání historie zálohování a obnovení, aby se předešlo tomu, že se to stane problémem. Snadný způsob, jak zjistit, zda čistíte historii záloh nebo ne, je dotazovat se přímo msdb:
SELECT CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, msdb.dbo.backupset.database_name, msdb.dbo.backupset.backup_finish_date, CASE msdb..backupset.type WHEN 'D' THEN ' Database' KDYŽ 'L' THEN 'Log' END AS backup_typeFROM msdb.dbo.backupmediafamilyINNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id =msdb.dbo.backupset.media_set_idsfinset_date_backup BY;Pokud máte historii zálohování nebo obnovy starší než 90 dní, měli byste prozkoumat, zda existuje regulační požadavek, který nařizuje uchovávat historické informace o těchto zálohách po určité období. Pokud požadavek neexistuje, měli byste zvážit vymazání dat starších než určité časové období. K obnově databází není potřeba historie záloh a doporučujeme ji pravidelně čistit, aby msdb zůstala na rozumné velikosti. Dodržení 90 dnů nebo méně je rozsah, který klientům obvykle doporučuji.
Chcete-li nastavit proces pro vyčištění zálohy a obnovení historie, vytvořte úlohu, která spustí
sp_delete_backuphistory
uloženou proceduru v msdb a předejte jí parametr data. Uložená procedura vymaže veškerou historii zálohování a obnovení starší než zadané datum. Můžete také vytvořit plán údržby databáze a použít úlohu Vyčistit historii.Poradce pro ladění databáze
Database Engine Tuning Advisor, také známý jako DTA, je nástroj, který mohou vývojáři a správci databáze použít k vyladění databáze. DTA využívá databázi msdb k ukládání historie ladění a dalších podpůrných objektů.
Běžně nacházím zbytky DTA v msdb na produkčních serverech klientů. Když najdu tyto tabulky, dotazuji se přímo na ně, abych zjistil, zda se DTA stále používá. Naštěstí jsem ještě nenašel klienta aktivně provozujícího DTA proti produkci, protože to může výrazně ovlivnit výkon. Jakmile potvrdím a komunikuji s klientem, vypustím tabulky DTA z msdb. V některých případech se tím uvolní několik gigabajtů místa. V rámci preventivních opatření jsem si také udělal čas na vysvětlení dopadu na výkon, který může mít spuštění DTA proti produkci, a povzbuzuji své klienty, aby jakékoli budoucí použití prováděli na vývojovém serveru.
SQL Server Agent
Občas najdu klienta, který nechtěně zrušil zaškrtnutí políčka, aby omezil velikost protokolu historie úloh. To je snadná chyba, pokud máte zaneprázdněný server a protokol se neustále převaluje tak rychle, že nemáte žádnou užitečnou historii úloh, na kterou byste se mohli odkazovat při odstraňování problémů s úlohami SQL Server Agent. Lepším přístupem je zvýšit maximální velikost protokolu historie úloh (v řádcích) na mnohem vyšší hodnotu, než jej nechat neomezeně růst.
V případech, kdy klienti měli neomezený růst pracovních míst, se tabulka sysjobhistory nadměrně zvětšila a bylo potřeba ji vyčistit. Nejlepší způsob, jak vyčistit historii, je použít
sp_purge_jobhistory
a předejte parametr data. Uložená procedura vymaže veškerou historii úloh starší než zadané datum. Pokud musíte uchovávat minimální počet dní historie SQL Server Agent, omezení protokolu historie úloh na základě řádků není účinné. Místo toho neomezujte velikost protokolu historie úloh a také naplánujte úlohu, která spustí sp_purge_jobhistory a předá parametr date na minimální počet dní historie úlohy, který potřebujete. Běžně se používá hodnota 14 nebo 30 dní.Zprostředkovatel služeb
Nedávno jsem narazil na problém s klientem, kde velikost msdb narostla na 14 GB. Po pokusu o aktualizaci instance na aktuální aktualizaci service pack se při upgradu nezdařilo použití skriptů na msdb a způsobilo opětovné exponenciální nárůst msdb. Po nějakém výzkumu jsme zjistili, že Service Broker byl povolen pro oznámení událostí, ale nebyl správně nakonfigurován. Více než rok byla oznámení událostí zařazena do fronty, ale nebyla směrována.
Při kontrole sys.transmission_queue jsem zjistil, že zprostředkovatel služeb v cílové databázi není dostupný a že zprostředkovatel služeb byl administrativně deaktivován. Poté jsem zkontroloval, jaká oznámení událostí byla nastavena, dotazem na sys.server_events_notifications a našel jsem pouze jednu položku:zachytit všechny události protokolu chyb. Pak jsem se zeptal sys.transmissions_queue, abych viděl, kolik událostí bylo ve frontě, a našel jsem tam několik milionů záznamů.
Po projednání s klientem a vysvětlení zjištěných skutečností jsme se shodli, že nejlepším postupem je zrušit upozornění na událost a vyčistit aktuální frontu vytvořením nového brokera. K tomu jsem provedl ALTER DATABASE msdb SET NEW_BROKER. To bylo provedeno po hodinách a po dobré plné záloze msdb.
Po vymazání transfer_queue a odstranění události jsem byl schopen snížit msdb ze 14 GB na 300 MB. Před opravou tohoto problému měla databáze msdb nejvyšší latenci disku na instanci a klient docházel k pravidelným zablokování. Po implementaci této změny, stejně jako dalších optimalizací, se uživatelská zkušenost klienta výrazně zlepšila.
Zapsat zásilku
Na začátku své kariéry DBA jsem zdědil konsolidační server, který měl několik stovek databází, které byly odeslány na sekundární server v jiném datovém centru. Tento server fungoval několik let a odesílal protokoly každých 15 minut. Nejen, že tato instance netrpěla tím, že nebyla vyčištěna historie zálohování, ale také nebyla správně vymazána historie sledování odesílání protokolu. Jakmile jsem vyčistil historii zálohování a zkontroloval velikost msdb, stále se zobrazovalo více využitého místa, než by mělo. Spustil jsem skript, který mi ukázal celkovou velikost každé tabulky, a zjistil jsem, že
log_shipping_monitor_history_detail
stůl byl velmi velký. V tomto případě se mi podařilo spustitsp_cleanup_log_shipping_history
pro vymazání historie a získání msdb zpět do normální velikosti.Indexování
Optimalizace indexů v msdb je stejně důležitá jako vaše uživatelské databáze. Mnohokrát jsem našel klienty, kteří optimalizují databáze uživatelů, ale ne systémové databáze. Vzhledem k tomu, že databázi msdb hojně využívá SQL Server Agent, Log Shipping, Service Broker, SSIS, zálohování a obnova a další procesy, mohou být indexy velmi fragmentované. Ujistěte se, že vaše úlohy optimalizace indexu zahrnují také vaše systémové databáze nebo alespoň msdb. Viděl jsem, jak optimalizace indexu uvolňují několik gigabajtů místa z vysoce fragmentovaných indexů v rámci msdb.
Shrnutí
Zanedbání msdb může negativně ovlivnit výkon vašeho prostředí. Je důležité sledovat velikost msdb a také procesy, které ji používají, aby bylo zajištěno, že funguje optimálně. Historie zálohování a obnovy je nejčastějším důvodem, proč se databáze msdb nadýmá, nicméně Poradce pro ladění databázového stroje, historie agenta SQL Server, zprostředkovatel služeb, odesílání protokolů a nedostatek údržby indexu, to vše může přispět k nadměrnému růstu msdb a ovlivnit výkon databáze.