sql >> Databáze >  >> RDS >> Sqlserver

Systémové databáze SQL Server – údržba MSDB

V předchozích článcích série SQL Server System Databases jsme prošli systémové databáze, které jsou standardně instalovány během instalace SQL Server, pochopili jsme účel každé z těchto systémových databází a podrobněji jsme prozkoumali databázi Tempdb a její údržbu. V tomto článku podrobněji prozkoumáme databázi MSDB spolu s často se vyskytujícími problémy s databází MSDB a jak je správně vyřešit.

Databáze MSDB

MSDB Systémová databáze SQL Server uchovává všechny důležité konfigurační informace a historické informace týkající se SQL Server Agent Service, SQL Server Service Broker, Database Mail, Log Shipping, Database Mirroring atd.:

  • Služba SQL Server Agent
    • Úlohy SQL Server Agent – ​​konfigurační data a podrobnosti o historii
    • Výstrahy SQL Server Agent – ​​konfigurační data
    • Operátoři SQL Server Agent – ​​konfigurační data
    • Proxy serverů SQL Server Agent – ​​konfigurační data
    • Související informace
  • SQL Server Database Mail, včetně Service Broker – Konfigurační data a historické podrobnosti protokolu pošty.
  • Podrobnosti o zálohování a obnově SQL serveru – údaje historie všech událostí zálohování a obnovy databáze, k nimž dochází v instanci serveru SQL.
  • Plány údržby, balíčky SSIS a související informace – Konfigurační data, související data a data o provádění všech těchto položek prostřednictvím SQL Server Agent Jobs.
  • Konfigurace protokolů odesílání, profily replikačních agentů, úlohy sběrače dat – konfigurační data všech zmíněných technik vysoké dostupnosti.

Kdykoli dojde ke změně některé z výše uvedených kritických konfigurací, doporučujeme provést Úplné zálohování databáze MSDB, aby se předešlo jakékoli ztrátě dat v případě selhání.

Přestože služba SQL Server Agent Service ukládá důležité podrobnosti o konfiguraci napříč tabulkami v MSDB SQL Server také ukládá několik podrobností o konfiguraci do registru Windows. K tomu používá rozšířenou uloženou proceduru s názvem sp_set_sqlagent_properties .

Pojďme se rychle podívat do umístění registru, kde SQL Server ukládá konfigurace SQL Server Agent Service. Důležité :Toto je pouze pro účely učení a nedoporučujeme měnit žádné konfigurační hodnoty. Jinak by to mohlo skončit podivnými chybami souvisejícími se službou SQL Server Agent Service.

Otevřete Editor registru zadáním regedit v příkazovém řádku:

Klikněte na Enter otevřete Editor registru :

Nyní přejděte na cestu:

Počítač\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL13.MSSQLSERVER\SQLServerAgent

Podívejte se na níže uvedené podrobnosti konfigurace. Označený fragment odkazuje na název instance SQL Serveru a může se ve vašem prostředí lišit v závislosti na verzi SQL Serveru a názvu instance.

Rychlý pohled na registr ukazuje, že jsou uloženy určité parametry související se službou SQL Server Agent Service. Vzhledem k tomu, že nedoporučujeme měnit žádné parametry související se službou SQL Server Agent Service a sdílené výše pouze pro účely učení, nebudeme se zde podrobně zabývat.

Pokud však zamýšlíte změnit kteroukoli z vlastností služby SQL Server Agent Service tak, aby splňovala obchodní nebo produkční požadavky, můžete ji upravit kliknutím pravým tlačítkem myši na službu SQL Server Agent a výběrem Vlastnosti jak je uvedeno níže.

I když je k dispozici mnoho parametrů souvisejících se službou SQL Server Agent Service a rozsah tohoto článku souvisí s databází msdb, vyloučil jsem je a pokryl jsem pouze možnosti specifické pro databázi msdb kliknutím na nabídku Historie, jak je uvedeno níže, kde jsme můžete nakonfigurovat velikost protokolů historie úloh a historie agentů.

Často se vyskytující problémy v databázi MSDB

V jakékoli produkční instanci SQL Serveru budeme mít povoleno mnoho úloh SQL Server Agent, databázových e-mailů, plánů údržby a úplných/transakčních protokolů. V závislosti na ne. databází v instanci nebo č. dostupných úloh SQL Server Agent nebo využití Database Mail, náš SQL Server začne protokolovat informace o historii všech povolených funkcí, čímž se zvětší velikost MSDB databáze. Pokud není správně udržován, ovlivní to výkon databáze MSDB a operace s tím související.

Podívejme se na funkce diskutované dříve a na tabulky používané k ukládání historických dat, abychom pochopili, jak můžeme mít velikost těchto tabulek pod kontrolou.

  • Historie záloh
  • Historie úloh SQL Server Agent
  • Plány údržby
  • Historie pošty databáze SQL Server
  • Balíčky SSIS

Chcete-li zjistit, které tabulky v databázi MSDB zabírají více místa, můžeme použít Přehledy využití disku podle nejlepších tabulek který je součástí výchozích sestav SQL Server v SQL Server Management Studio.

Otevřete SSMS a klikněte pravým tlačítkem na MSDB databáze> Přehledy > Standardní přehledy > Využití disku podle nejlepších tabulek k vygenerování sestavy tabulek seřazených podle Využití disku:

Klikněte na Využití disku podle nejlepších tabulek k zobrazení zprávy. Vzhledem k tomu, že moje instance je vývojová, nejsou zde velké tabulky, ale tento přehled může zobrazit velikost všech tabulek v databázi seřazených v sestupném pořadí.

Můžeme také použít níže uvedený dotaz k získání velikostí tabulek v databázi.

SELECT -- TOP(10)
	  SCHEMA_NAME(o.[schema_id]) Schema_name
	, o.name object_name
    , total_size = CAST(SUM(au.total_pages) * 8. / 1024 AS DECIMAL(18,2))
    , total_rows = SUM(CASE WHEN i.index_id IN (0, 1) AND au.[type] = 1 THEN p.[rows] END)
FROM sys.objects o 
JOIN sys.indexes i ON o.[object_id] = i.[object_id]
JOIN sys.partitions p ON i.[object_id] = p.[object_id] AND i.index_id = p.index_id
JOIN sys.allocation_units au ON p.[partition_id] = au.container_id
WHERE i.is_disabled = 0
AND i.is_hypothetical = 0
AND o.Type in ('S','U','V')
GROUP BY o.name, SCHEMA_NAME(o.[schema_id])
ORDER BY 3 DESC

Jakmile víme, které tabulky zabírají více místa, můžeme použít související uložené procedury, abychom měli jejich velikost pod kontrolou.

Historie záloh

Primární odpovědností DBA je zajistit, aby byly ve všech produkčních instancích SQL Server povoleny úplné zálohy a transakční protokoly, aby bylo možné obnovit databáze do určitého okamžiku.

SQL Server ukládá podrobnosti o zálohování a informace o obnovení v následujících tabulkách databáze MSDB :

  • záložní soubor
  • skupina záložních souborů
  • backupmediafamily
  • backupmediaset
  • zálohování
  • obnovit soubor
  • obnovit skupinu souborů
  • obnovení historie

Za významné ne. databází v instanci SQL Server nakonfigurované s úplnými zálohami a zálohami transakčního protokolu mohou záznamy ve výše uvedených tabulkách narůstat rychleji.

SQL Server tedy poskytuje dvě systémové uložené procedury v MSDB databáze pro kontrolu velikosti výše uvedených tabulek:

  • sp_delete_backuphistory – odstraní data historie záloh ve výše uvedených 8 tabulkách na základě nejstaršího data parametr.
  • sp_delete_database_backuphistory – odstraní data historie záloh ve výše uvedených 8 tabulkách na základě názvu databáze .

Syntaxe pro provádění výše uvedených systémových uložených procedur:

exec msdb.dbo.sp_delete_backuphistory @oldest_date = 'oldest_date'
exec msdb.dbo.sp_delete_database_backuphistory @database_name = 'database_name'

Když spustíme kteroukoli z výše popsaných uložených procedur v databázi obsahující velké záznamy napříč tabulkami historie zálohování, můžeme se zablokovat nebo si všimnout, že se záznamy mažou velmi pomalu. Abychom to vyřešili, vytvoříme níže uvedený chybějící index v záložní sadě stůl. Lze jej identifikovat pomocí plánu provádění uložené procedury, aby se kteroukoli z našich uložených procedur spouštěl rychleji.

IF NOT EXISTS (SELECT * FROM sys.indexes WHERE OBJECT_ID = OBJECT_ID('[dbo].[backupset]') AND name = 'IX_BackupSet_FinDate_MediaSet')
CREATE NONCLUSTERED INDEX IX_BackupSet_FinDate_MediaSet ON backupset(backup_finish_date) 
INCLUDE (media_set_id)
GO

Historie úloh SQL Server Agent

SQL Server ukládá veškerou historii úloh SQL Server Agent v msdb.dbo.sysjobhistory stůl. SQL Server má také systémovou uloženou proceduru s názvem msdb.dbo.sp_purge_jobhistory který pomáhá udržovat historii systémových pracovních míst velikost tabulky pod kontrolou.

Syntaxe pro spuštění sp_purge_jobhistory uložená procedura bude:

exec msdb.dbo.sp_purge_jobhistory @job_name = 'job_name', @job_id = 'job_id', @oldest_date ='oldest_date'

Všechny 3 parametry jsou volitelné a doporučujeme provést výše uvedený postup předáním nejstaršího_datu parametr k uchování sysjobhistorie velikost tabulky pod kontrolou.

Plány údržby

SQL Server ukládá podrobnosti o všech plánech údržby v níže uvedených tabulkách:

  • msdb.dbo.sysmaintplan_log
  • msdb.dbo.sysmaintplan_logdetail

SQL Server má vestavěnou uloženou proceduru s názvem msdb.dbo.sp_maintplan_delete_log abyste měli velikost těchto 2 tabulek pod kontrolou.

Syntaxe pro provedení procedury bude:

exec msdb.dbo.sp_maintplan_delete_log @plan_id = '', @subplan_id = '', @oldest_Time = 'oldest_datetime'

Všechny 3 parametry jsou volitelné. Doporučujeme provést výše uvedený postup a předat parametr nejstarší_čas, abyste udrželi velikost dvou výše uvedených tabulek pod kontrolou.

Historie pošty databáze SQL Server

SQL Server ukládá všechny protokoly historie pošty databáze v níže uvedených tabulkách:

  • sysmail_mailitems
  • sysmail_log
  • sysmail_attachments
  • sysmail_attachments_transfer

Chcete-li mít tyto velikosti tabulky historie pod kontrolou, nabízí SQL Server 2 systémové uložené procedury s názvem msdb.dbo.sysmail_delete_mailitems_sp a msdb.dbo.sysmail_delete_log_sp.

Syntaxe pro provedení těchto uložených procedur bude:

exec msdb.dbo.sysmail_delete_mailitems_sp @sent_before = 'oldest_datetime', @sent_status = NULL
exec msdb.dbo.sysmail_delete_log_sp @logged_before = 'oldest_datetime', @event_type = NULL

U obou postupů jsou všechny parametry volitelné. Doporučuje se však použít sent_before nebo logged_befor e parametry k odstranění starších záznamů na základě doby uchování.

V několika scénářích, pokud jsou všechny tabulky související s Database Mail velké, spusťte delete postup bude běžet navždy. Rychlejší způsob, jak problém vyřešit, je smazat omezení cizího klíče u sysmail_attachments a sysmail_send_retries tabulky, zkraťte výše uvedené 4 tabulky a znovu vytvořte 2 cizí klíče zpět na sysmail_attachments a sysmail_send_retries tabulky jak je uvedeno níže:

USE MSDB;

ALTER TABLE [dbo].[sysmail_attachments] DROP [FK_sysmail_mailitems_mailitem_id];
GO
ALTER TABLE [dbo].[sysmail_send_retries] DROP [FK_mailitems_mailitem_id];
GO

TRUNCATE TABLE [dbo].[sysmail_attachments];
TRUNCATE TABLE [dbo].[sysmail_send_retries];
TRUNCATE TABLE [dbo].[sysmail_mailitems];
TRUNCATE TABLE [dbo].[sysmail_log];

ALTER TABLE [dbo].[sysmail_attachments]  WITH CHECK ADD  CONSTRAINT [FK_sysmail_mailitems_mailitem_id] FOREIGN KEY([mailitem_id])
REFERENCES [dbo].[sysmail_mailitems] ([mailitem_id])
ON DELETE CASCADE;
ALTER TABLE [dbo].[sysmail_attachments] CHECK CONSTRAINT [FK_sysmail_mailitems_mailitem_id];
GO

ALTER TABLE [dbo].[sysmail_send_retries]  WITH CHECK ADD  CONSTRAINT [FK_mailitems_mailitem_id] FOREIGN KEY([mailitem_id])
REFERENCES [dbo].[sysmail_mailitems] ([mailitem_id])
ON DELETE CASCADE;
ALTER TABLE [dbo].[sysmail_send_retries] CHECK CONSTRAINT [FK_mailitems_mailitem_id];
GO

Balíčky SSIS

SQL Server ukládá všechny SSIS(*.dtsx) balíčky v msdb.dbo.sysssispackages stůl. Tato tabulka je konfigurační tabulkou, avšak v náhodných případech je pravděpodobné, že na tabulku může být vysypáno mnoho SSIS balíčků. To způsobí, že velikost této tabulky se zvětší.

V těchto případech musíme identifikovat, zda existují nějaké nechtěné balíčky, a odstranit tyto balíčky, abychom zachovali sysssispackages velikost tabulky pod kontrolou.

Sečteno a podtrženo

SQL Server nemá vestavěné úlohy pro zpracování úlohy mazání napříč všemi tabulkami diskutované výše. Přesto máme parametr nejstaršího data dostupné pro všechny výše uvedené postupy.

Proto doporučený přístup ke zpracování velikosti tabulky MSDB pod kontrolou by bylo definovat dobu uchování na základě počtu dní a vytvořit novou úlohu SQL Server Agent, která by spouštěla ​​níže uvedený skript na plánovaném základě:

declare @retention_date datetime = '2021-04-01'
exec msdb.dbo.sp_delete_backuphistory @oldest_date = @retention_date;
exec msdb.dbo.sp_purge_jobhistory @oldest_date = @retention_date;
exec msdb.dbo.sp_maintplan_delete_log @oldest_Time = @retention_date;
exec msdb.dbo.sysmail_delete_mailitems_sp @sent_before = @retention_date;
exec msdb.dbo.sysmail_delete_log_sp @logged_before = @retention_date;

Závěr

Dozvěděli jsme se o seznamu tabulek, které mohou růst rychleji v MSDB databáze a jak udržet velikost těchto tabulek pod kontrolou. Odvodili jsme praktický skript se seznamem procedur, které je třeba pravidelně spouštět, abychom zabránili MSDB databáze roste do obrovské velikosti. Doufám, že tento článek bude užitečný pro vaši automatizaci a tyto informace vás osvobodí od údržby databáze MSDB a soustředíte se na jiné činnosti.


  1. Proč má klauzule Oracle IN limit 1000 pouze pro statická data?

  2. Jak rozdělit hodnoty jednoho sloupce na více hodnot sloupců?

  3. Jednoduchý způsob, jak transponovat sloupce a řádky v SQL?

  4. Vyhledávání databázových objektů a dat tabulek na serveru SQL