sql >> Databáze >  >> RDS >> Database

Monitorování záloh napříč instancemi

Úvod

Za poslední dva nebo tři měsíce jsem byl dvakrát požádán o řešení nativní pro SQL Server, které konsoliduje sestavu zálohování pro několik instancí SQL Serveru v rámci podniku. Tato otázka přišla od přátel, kteří nutně nechtěli utrácet peníze za nákup nástroje, ale byli více nakloněni využití možností SQL Serveru. Přemýšlel jsem o dvou možných způsobech, jak toho dosáhnout:

  1. Použití propojených serverů, zobrazení katalogu, úloh SQL Agent a databázové pošty
  2. Použití serveru Central Management Server

V tomto článku předvedu první část a doufám, že někdy později budeme mít druhou část článku.

Scénář

Moje prostředí se skládá ze sady tří instancí sedících na samostatných serverech na AWS. Tyto „servery“ jsou ve skutečnosti Amazon EC2 se systémem SQL Server 2017 RTM CU5. Budeme také využívat výhod Amazon Simple Email Service ke konfiguraci Database Mail. Ve výrobě můžete určitě použít své místní e-mailové servery a dosáhnout stejných cílů. Později v tomto článku si všimnete, že název hostitele (a tedy názvy instancí) jsou stejné. Je to proto, že servery byly naklonovány ze stejného obrazu Amazon Machine Image (promiňte "lenost"). To pravděpodobně nebude případ výroby.

Udělejte si několik záloh

Začněme tím, že provedeme několik záloh databází umístěných na těchto třech instancích. Tím se vygenerují data, se kterými budeme pracovat. Poté ověříme, zda jsou zálohy zachyceny v systémových tabulkách msdb.dbo.backupset amsdb.dbo.backupmediafamily . Úplný popis těchto tabulek si můžete prohlédnout v této dokumentaci společnosti Microsoft nebo jednoduše pomocí sp_columns .

-- Výpis 1:Zálohování instancí-- Zálohujte jednu DB pomocí jedné stripebackup databáze newdb na disk='newdb.bak'-- Zálohujte všechny DB v instanci s časovým razítkem v backupset nameexec sp_MSforeachdb @command1='declare @path varchar(300)set @path=''M:\MSSQL\BACKUP\?_Backup'' + convert(varchar(10),getdate(),110) + ''.bak''print databáze @pathbackup [?] na [email protected]'-- Zálohujte jednu velkou databázi se čtyřmi stripesbackup databází [PieceMealDB] todisk='M:\MSSQL\BACKUP\PieceMealDB_01.bak',disk='M:\MSSQL\BACKUP\PieceMealDB_02 .bak',disk='M:\MSSQL\BACKUP\PieceMealDB_03.bak',disk='M:\MSSQL\BACKUP\PieceMealDB_04.bak'withstats=10

Obr 3. Popis msdb.dbo.backupset

Kontrola záloh

Následující skript využívá dvě zobrazení katalogu backupset a backupmediafamily prozkoumat historii záloh vytvořených na instanci SQL Server. Katalog sad záloh obsahuje řádek pro každou sadu záloh. Sada zálohování je definována jako obsah operace zálohování, která je přidána do sady médií. Sada médií je kolekce pořadí médií, na které byla zapsána jedna nebo více operací zálohování.

-- Výpis 2:Kontrola záloh pomocí tabulek msdb --PRINT 'Kontrola úspěšně zálohovaných databází'použijte msdbgoselect bus.database_name,bus.type, case bus.type když 'D' pak 'Full' když 'I' pak 'Rozdíl' když 'L' pak 'Log' end backup_type, bus.backup_start_date, bus.backup_finish_date,(((DATEPART(HH,bus.backup_finish_date))- (DATEPART(HH,bus.backup_start_date)))*3600) + (((DATEPART(MI,bus.backup_finish_date)) - (DATEPART(MI,bus.backup_start_date)))*60) +(((DATEPART(SS,bus.backup_finish_date)) - DATEPART(SS,bus.backup_start_date)) )[backup_time (secs)], bus.backup_size,bmf.physical_device_name from backupset busjoin backupmediafamily bmf on bus.media_set_id=bmf.media_set_idwhere bus.backup_start_date>=(getdate() - 7)objednat podle bus.backup_prestart>_date desc  

Obr. 5. Ukázkový výstup kontrol zálohování

Kontrola záloh na jiných instancích

Pomocí Linked Servers můžeme extrahovat data ze vzdálených instancí. V tomto případě použijeme jednoduchý propojený server k extrahování informací o historii záloh z databází msdb dvou vzdálených instancí. Konfigurace zabezpečení těchto propojených serverů zcela závisí na vás, ale pro účely našeho cíle jsme zde ponechali velmi jednoduché. Výpis 3 ukazuje skript, který může využívat tyto propojené servery k agregaci dat historie zálohování.

Obr 6. Jednoduchý propojený server

Obr 7. Propojený server pro dvě vzdálené instance

-- Výpis 3:Kontrola záloh pomocí tabulek msdb na propojených serverech Použijte msdbgowith srva jako (vyberte instanci bus.server_name, bus.database_name,bus.type, case bus.type když 'D', pak 'Full' když 'I' potom 'Diferenciální', když 'L' potom 'Log' end backup_type, bus.backup_start_date, bus.backup_finish_date,(((DATEPART(HH,bus.backup_finish_date))-(DATEPART(HH,bus.backup_start_date)))*3600) +(((DATEPART(MI,bus.backup_finish_date)) - (DATEPART(MI,bus.backup_start_date)))*60) +(((DATEPART(SS,bus.backup_finish_date)) - DATEPART(SS,bus.backup_start_date) ))[backup_time (s)], bus.backup_size,bmf.physical_device_name from backupset busjoin backupmediafamily bmf on bus.media_set_id=bmf.media_set_idwhere bus.backup_start_date>=(getdate() - 3)), srvb as (vyberte bus.server_name instance, bus.database_name,bus.type, case bus.type when 'D' then 'Full' when 'I' then 'Differential' when 'L' then 'Log' end backup_type, bus.backup_start_date, bus.backup_finish_date,( ((DATEPART(HH,bus.backup_finish_d ate))- (DATEPART(HH,bus.backup_start_date)))*3600) +(((DATEPART(MI,bus.backup_finish_date)) - (DATEPART(MI,bus.backup_start_date)))*60) +((( DATEPART(SS,bus.backup_finish_date)) - DATEPART(SS,bus.backup_start_date)))[backup_time (s)], bus.backup_size,bmf.physical_device_name from [10.0.1.155].msdb.dbo.backupset bus.join [10. 1.155].msdb.dbo.backupmediafamily bmf na bus.media_set_id=bmf.media_set_idwhere bus.backup_start_date>=(getdate() - 3)), srvc as (vyberte instanci bus.server_name, bus.database_name,bus.type, case bus .type when 'D' then 'Full' when 'I' then 'Differential' when 'L' then 'Log' end backup_type, bus.backup_start_date, bus.backup_finish_date,(((DATEPART(HH,bus.backup_finish_date))- (DATEPART(HH,bus.backup_start_date)))*3600) +(((DATEPART(MI,bus.backup_finish_date)) - (DATEPART(MI,bus.backup_start_date)))*60) +(((DATEPART(SS, bus.backup_finish_date)) - DATEPART(SS,bus.backup_start_date)))[backup_time (s)], bus.backup_size,bmf.physical_device_name from [10.0.1.83].ms db.dbo.backupset busjoin [10.0.1.83].msdb.dbo.backupmediafamily bmf na bus.media_set_id=bmf.media_set_idwhere bus.backup_start_date>=(getdate() - 3))vyberte * ze srvaunion vybrat * z srvbunionselect * z;

Začlenění SES a Database Mail

Dalším krokem, který podnikneme, je automatizaci této kontroly a odeslání sady výsledků správcům databáze. Požadované kroky by byly v souhrnu následující:

    1. Nakonfigurujte Amazon SES . Můžete se naučit, jak rychle nastavit e-mail na AWS pomocí dokumentace poskytnuté na Amazon SES Quick Start. Při použití on-premise e-mailové služby to nebude pro DBA nutné.
    2. Konfigurovat databázovou poštu . Tento článek není určen k demonstraci Database Mail, takže uvádíme pouze snímek obrazovky konfigurace poštovního účtu SQL:

      Obr 7. Nastavení poštovního účtu SQL

      • Číslo portu při použití SES k odesílání e-mailů je 587 NE 25
      • Amazon SES vyžaduje zabezpečené připojení, proto musí být zaškrtnuto políčko označené lila (obr. 7).
      • Je vyžadováno základní ověřování pomocí přihlašovacích údajů SMTP (tj. anonymní ověřování není povoleno).

      Při používání Amazon SES pro Database Mail si musíme být vědomi několika věcí:

    3. Nakonfigurujte SQL Agent pro použití poštovního profilu . SQL Server Agent musí být nakonfigurován tak, aby používal poštovní profil vytvořený během konfigurace Database Mail pro úlohy agenta ke spouštění e-mailů. (Viz obr. 8)
    4. Vytvořte pracovní tabulku . Pracovní tabulka bude obsahovat agregovanou sadu výsledků pro všechna data historie zálohování z instancí, na které jsme se zaměřili pomocí propojených serverů. Tabulka DDL je uvedena ve výpisu 4.
-- Výpis 4:Tabulka historie záloh DDLSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[historie záloh]( [instance] [nvarchar](128) NULL, [název_databáze] [nvarchar](128) NULL, [typ] NULL [znak](1) NULL, [typ_zálohy] [varchar](12) NULL, [datum_zahájení_zálohy] [datum a čas] NULL, [datum_dokončení_zálohy] [datum a čas] NULL, [čas_zálohy (s)] [int] NULL, [velikost_zálohy] [ numeric](20, 0) NULL, [název fyzického_zařízení] [nvarchar](260) NULL) NA [PRIMARY]GO

Obr 8. Nastavení SQL Agent

Pokračujeme a naplánujeme skript ve výpisu 3 v SQL Agent Job a máme kompletní skript ve výpisu 5.

-- Výpis 5:Dokončete úlohu SQL Agent pro oznámení o historii zálohováníUSE [msdb]GO/****** Objekt:Úloha [Shrnutí historie podnikového zálohování] Datum skriptu:26. 9. 2018 22:16:46 ******/BEGIN TRANSACTIONDECLARE @ReturnCode INTSELECT @ReturnCode =0/****** Objekt:JobCategory [[Uncategorized (Local)]] Datum skriptu:26. 9. 2018 22:16:46 ** ****/IF NEEXISTUJE (VYBERTE název Z msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)BEGINEXEC @ReturnCode =msdb.dbo.sp_add_category @class=N'JOB' , @type=N'LOCAL', @name=N'[Uncategorized (Local)]'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollbackENDDECLARE @jobId BINARY(16)EXEC @ReturnCode =msdb. dbo.sp_add_job @job_name=N'Enteprise Backup History Summary', @enabled=1, @notify_level_eventlog=0, @notify_level_email=0, @notify_level_netsend=0, @notify_level_page=0, @delete_level=0, @description=N'No popis je k dispozici.', @category_name=N'[Uncategorized (Local)]', @owner_login_name=N'TWE NTYTOWERS\Administrator', @job_id =@jobId OUTPUTIF (@@ERROR <> 0 NEBO @ReturnCode <> 0) GOTO QuitWithRollback/****** Objekt:Krok [Historie souhrnného zálohování] Datum skriptu:26. 9. 2018 22:16:46 ******/EXEC @ReturnCode =msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'Aggregate Backup History', @step_id=1, @cmdexec_success_code=0, @ on_success_action=3, @on_success_step_id=0, @on_fail_action=2, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'-- Kontrola Zálohy pomocí tabulek msdb ---- Napříč Linked Serverspoužijte tabulku msdbgotruncate [msdb].[dbo].[historie záloh];s srva as (vyberte instanci bus.server_name, bus.database_name,bus.type, case bus.type když '' D'' potom ''Full'' když ''I'' pak ''Diferenciální'' když ''L'' pak ''Log'' end backup_type, bus.backup_start_date, bus.backup_finish_date,(((DATEPART(HH ,bus.backup_finish_date))- (DATEPART(HH,bus.backup_start_date)))*3600) +(((DATEPART(MI,bus.backup_fin) ish_date)) - (DATEPART(MI,bus.backup_start_date)))*60) +(((DATEPART(SS,bus.backup_finish_date)) - DATEPART(SS,bus.backup_start_date)))[backup_time (secs)], bus .backup_size,bmf.physical_device_name ze backupset busjoin backupmediafamily bmf na bus.media_set_id=bmf.media_set_idwhere bus.backup_start_date>=(getdate() - 3)), srvb jako (vyberte instanci bus.server_name, bus.database_name,bus.type, case bus.type when ''D'' then ''Full'' when ''I'' then ''Differential'' when ''L'' then ''Log'' end backup_type, bus.backup_start_date, bus.backup_finish_date ,(((DATEPART(HH,bus.backup_finish_date))- (DATEPART(HH,bus.backup_start_date)))*3600) +(((DATEPART(MI,bus.backup_finish_date)) - (DATEPART(MI,bus.backup_start_date) )))*60) +(((DATEPART(SS,bus.backup_finish_date)) - DATEPART(SS,bus.backup_start_date)))[backup_time (s)], bus.backup_size,bmf.physical_device_name from [10.0.1.155] .msdb.dbo.backupset busjoin [10.0.1.155].msdb.dbo.backupmediafamily bmf na bus.media_set_id=bmf.media_set_idwhere b us.backup_start_date>=(getdate() - 3)), srvc as (vyberte instanci bus.server_name, bus.database_name,bus.type, case bus.type když ''D'' potom ''Full'' když '' I'' potom ''Diferenciální'' když ''L'' pak ''Log'' end backup_type, bus.backup_start_date, bus.backup_finish_date,(((DATEPART(HH,bus.backup_finish_date))-(DATEPART(HH, bus.backup_start_date)))*3600) +(((DATEPART(MI,bus.backup_finish_date)) - (DATEPART(MI,bus.backup_start_date)))*60) +(((DATEPART(SS,bus.backup_finish_date)) - DATEPART(SS,bus.backup_start_date)))[backup_time (s)], bus.backup_size,bmf.physical_device_name from [10.0.1.83].msdb.dbo.backupset busjoin [10.0.1.83].msmediadb.dbo.backup na bus.media_set_id=bmf.media_set_idwhere bus.backup_start_date>=(getdate() - 3))vložit do [msdb].[dbo].[backuphistory]select * from srvaunion vybrat * ze srvbunionselect * z srvc;', @database_name =N'msdb', @flags=0IF (@@ERROR <> 0 NEBO @ReturnCode <> 0) GOTO QuitWithRollback/****** Objekt:Krok [Query Member Servers for Backups] Datum skriptu:26. 9. 2018 22:16:46 ******/EXEC @ReturnCode =msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'Query Member Servers for Backups ', @step_id=2, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=2, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @ity=0, @system_prior N'TSQL', @command=N'DECLARE @tableHTML NVARCHAR(MAX);SET @tableHTML =N''

Shrnutí historie podnikového zálohování

' ' + N'''' + N'''' + N'''' + N'''' + N'''' + N'''' + N'''' + N'''' + CAST ( ( SELECT td =bus.instance, '''', td =bus.database_name, '''' , td =bus.backup_start_date, '''', td =bus.backup_finish_date, '''', td =(((DATEPART(HH,bus.backup_finish_date))- (DATEPART(HH,bus.backup_start_date)))* 3600) +(((DATEPART(MI,bus.backup_finish_date)) - (DATEPART(MI,bus.backup_start_date)))*60) +(((DATEPART(SS,bus.backup_finish_date)) - DATEPART(SS,bus. backup_start_date))), '''', td =bus.backup_size, '''', td =bus.physical_device_name Z historie zálohování jako sběrnice KDE bus.backup_start_date>=(getdate() - 7) OBJEDNAT PODLE bus.backup_start_date desc FOR XML PATH(''tr''), TYPE ) AS NVARCHAR(MAX) ) + N''
Název instanceNázev databázeDatum zahájení zálohyDatum dokončení zálohyDoba zálohy (s)Velikost zálohyNázev fyzického zařízení
'' + ''

 

Děkuji a s pozdravem

 

Operace podnikové databáze

 

'';EXEC msdb.dbo.sp_send_dbmail @ recipients=''[email protected];[email protected]'', @subject =''Přehled historie podnikového zálohování'', @body =@tableHTML , @body_format =''HTML'';', ​​@název_databáze=N'msdb', @flags=0IF (@@ERROR <> 0 NEBO @ReturnCode <> 0) GOTO QuitWithRollback/****** Objekt:Krok [Mail Complete Result Set to Support] Datum skriptu:9/26/ 2018 22:16:46 ******/EXEC @ReturnCode =msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'Mail Complete Result Set to Support', @step_id=3, @cmdexec_success_code =0, @on_success_action=1, @on_success_step_id=0, @on_fail_action=2, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N 'DECLARE @tableHTML NVARCHAR(MAX);SET @tableHTML =N''

Shrnutí historie podnikového zálohování

'' + N'''' + N''Název instance '' + N''Název databáze'' + N'' Datum zahájení zálohování'' + N''Datum dokončení zálohy'' + N''Doba zálohy (s)'' + N''Velikost zálohy'' + N' 'Název fyzického zařízení'' + CAST ( ( SELECT td =bus.instance, '''', td =sběrnice. název_databáze, '''', td =bus.backup_start_date, '''', td =bus.backup_finish_date, '''', td =(((DATEPART(HH,bus.backup_finish_date))- (DATEPART(HH,bus .backup_start_date)))*3600) +(((DATEPART(MI,bus.backup_finish_date)) - (DATEPART(MI,bus.backup_start_date)))*60) +(((DATEPART(SS,bus.backup_finish_date)) - DATEPART(SS,bus.backup_start_date))), '''', td =bus.backup_size, '''', td =bus.physical_device_name FROM backuphistory as bus WHERE bus.backup_start_date>=(getdate() - 7) ORDER BY bus.backup_start_date desc FOR XML PATH(''tr''), TYPE ) AS NVARCHAR(MAX) ) + N'''' + ''

 

Děkuji a s pozdravem

 

Operace podnikové databáze

 

'';EXEC msdb.dbo.sp_send_dbmail @ recipients=''[email protected];[email protected]'', @subject =''Přehled historie podnikového zálohování'', @body =@tableHTML , @body_format =''HTML'';', ​​@název_databáze=N'msdb', @flags=0IF (@@ERROR <> 0 NEBO @ReturnCode <> 0) GOTO QuitWithRollbackEXEC @ReturnCode =msdb.dbo.sp_update_job @job_id =@jobId, @start_step_id =1IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollbackEXEC @ReturnCode =msdb.dbo.sp_add_jobserver @job_id =@jobId, @server_name =N'(local)'IF (@@ERROR <> 0 NEBO @ReturnCode <> 0) ROITTIONMOTO QuitAC EndSaveQuitWithRollback:IF (@@TRANCOUNT> 0) ROLLBACK TRANSACTIONEndSave:GO

Provedení této úlohy má za následek výstup zobrazený na obr. 9. Tabulka je vytvořena pomocí velmi jednoduchého HTML a lze ji dále rozvíjet podle vašich potřeb.

Obr 9. E-mailový výstup provádění úlohy agenta SQL

Závěr

Prošli jsme jednoduchou metodou agregace informací o historii zálohování (a případných dalších dat obsažených v systémových databázích) pomocí propojených serverů. Dále jsme pokračovali v automatizaci tohoto procesu pomocí SQL Agent, Database Mail a trochu HTML. Tato metoda se může zdát trochu hrubá a jsem si jistý, že existují nástroje, které dokážou mnohem lépe, ale to by byl účel serveru pro ty, kteří právě začínají s SQL Serverem nebo prostředími s nízkým rozpočtem. S trochou kreativity můžete skripty dále upravovat a přizpůsobovat je jiným účelům.

Odkazy

  1. Konfigurace databázové pošty
  2. Začínáme s Amazon SES
  3. Propojené servery
  4. Historie záloh a informace záhlaví

  1. Groovy SQL Oracle Array Funkce/procedura Registrace parametrů

  2. Preferovaný engine MySQL – MyISAM nebo InnoDB

  3. Najmout nebo najmout:Datový model pro proces náboru

  4. Funkce vrací více sloupců jako jeden sloupec namísto více sloupců