Въведение
През последните два или три месеца бях помолен два пъти за решение, присъщо на SQL Server, което консолидира отчет за архивиране за няколко екземпляра на SQL Server в едно предприятие. Този въпрос дойде от приятели, които не искаха непременно да харчат пари за закупуване на инструмент, но бяха по-склонни да използват възможностите на SQL Server. Помислих за два възможни начина да постигна това:
- Използване на свързани сървъри, изгледи на каталог, задачи на SQL агент и поща от база данни
- Използване на централен сървър за управление
В тази статия ще демонстрирам първата и се надявам да имаме втора част от статията по-късно.
Сценарий
Моята среда се състои от набор от три екземпляра, разположени на отделни сървъри на AWS. Тези „сървъри“ всъщност са Amazon EC2, работещи със SQL Server 2017 RTM CU5. Също така ще се възползваме от услугата Amazon Simple Email, за да конфигурираме Database Mail. В производството определено можете да използвате вашите локални имейл сървъри и да постигнете същите цели. Ще забележите по-късно в тази статия, че името на хоста (и следователно имената на екземпляра) са еднакви. Това е така, защото сървърите са клонирани от едно и също изображение на машината на Amazon (простете за „мързела“). Това вероятно няма да е така в производството.
Направете няколко резервни копия
Нека започнем, като направим няколко резервни копия на бази данни, разположени на тези три екземпляра. Това ще генерира данните, с които ще работим. След това ще проверим дали резервните копия са заснети в системните таблици msdb.dbo.backupset и msdb.dbo.backupmediafamily . Пълните описания на тези таблици могат да бъдат прегледани в тази документация на Microsoft или просто да се използват sp_columns .
-- Листинг 1:Правене на резервни копия на екземпляри-- Архивирайте единична DB с една база данни stripebackup newdb на disk='newdb.bak'-- Архивирайте всички DBs в инстанцията с времева марка в резервния набор nameexec sp_MSforeachdb @command1='declare @path varchar(300)set @path=''M:\MSSQL\BACKUP\?_Backup'' + convert(varchar(10),getdate(),110) + ''.bak''print @pathbackup база данни [?] към [email protected]'-- Архивирайте единична голяма БД с база данни с четири stripesbackup [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
Фигура 3. Описание на msdb.dbo.backupset
Проверка на архиви
Следният скрипт се възползва от два изгледа на каталога backupset и backupmediafamily за да прегледате историята на архивите, създадени на екземпляр на SQL Server. Каталогът с резервни копия съдържа ред за всеки резервен набор. Наборът за архивиране се дефинира като съдържанието на операция за архивиране, която се добавя към набор от медии. Наборът от медии е набор от носители, към които са записани една или повече операции за архивиране.
-- Листинг 2:Проверете архиви с помощта на msdb таблици --PRINT 'Проверка на успешно архивирани бази данни'използвайте msdbgoselect bus.database_name,bus.type, case bus.type, когато 'D', след това 'Full', когато 'I' след това „Диференциал“, когато „L“, след това „Log“, край 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 от backupset busjoin backupmediafamily bmf на bus.media_set_id=bmf.media_set_idwhere bus.backup_start_date>=(getdate() - 7.backup des_order byФигура 5. Примерен изход от резервни проверки
Проверка на резервни копия на други екземпляри
Използвайки свързани сървъри, можем да извличаме данни от отдалечени екземпляри. В този случай ще използваме прост свързан сървър, за да извлечем информация за хронологията на архивирането от msdb бази данни на два отдалечени екземпляра. Конфигурацията за сигурност за тези свързани сървъри зависи изцяло от вас, но ние запазихме, че тук е много проста за целта на нашата цел. Списък 3 показва скрипта, който може да използва тези свързани сървъри за обобщаване на данни от историята на архивирането.
Фигура 6. Прост свързан сървър
Фигура 7. Свързан сървър за две отдалечени инстанции
-- Листинг 3:Проверка на архиви с помощта на msdb таблици в свързани сървъриизползвайте msdbgowith srva като (изберете bus.server_name instance, bus.database_name,bus.type, case bus.type, когато 'D', след това 'Full', когато 'I' след това 'Differential', когато 'L', след това 'Log' край 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 от backupset busjoin backupmediafamily bmf на bus.media_set_id=bmf.media_set_idwhere bus.backup_start_date>=(getdate() - 3)), slect. екземпляр, bus.database_name,bus.type, case bus.type, когато 'D', след това 'Full', когато 'I', след това 'Differential', когато 'L', след това 'Log' край backup_type, bus.backup_start_date, bus.backup_finish_date,( ((ЧАСТ ДАТА(HH,bus.backup_finish_d изяде))- (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 от [10.0.1.155].msdb.dbo.backupset busjoin. 1.155].msdb.dbo.backupmediafamily bmf на bus.media_set_id=bmf.media_set_idwhere bus.backup_start_date>=(getdate() - 3)), srvc като (изберете bus.server_name instance, bus.database_name, case_name, bus.bus. .type, когато 'D', след това 'Full', когато 'I', след това 'Differential', когато 'L', след това 'Log' край 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 от [10.0.1.83].ms. db.dbo.backupset busjoin [10.0.1.83].msdb.dbo.backupmediafamily bmf на bus.media_set_id=bmf.media_set_idwhere bus.backup_start_date>=(getdate() - 3))изберете * от srvaunion selectons * от srvaunion selectons * от srvbuunion selectons *;Включване на SES и поща от база данни
Следващата стъпка, която предприемаме, е да автоматизираме тази проверка и да изпратим по пощата резултатния набор до администраторите на база данни. Необходимите стъпки биха били, както следва в обобщение:
- Конфигуриране на Amazon SES . Можете да научите как бързо да настроите имейл на AWS, като използвате документацията, предоставена в Amazon SES Quick Start. Когато използвате локална имейл услуга, това няма да е необходимо за DBA.
- Конфигуриране на поща от база данни . Тази статия не е предназначена за демонстрация на Database Mail, така че ние просто даваме екранна снимка на конфигурацията на SQL пощенския акаунт:
Фигура 7. Настройки на SQL Mail акаунт
- Номерът на порта, когато използвате SES за изпращане на имейли, е 587 НЕ 25
- Amazon SES изисква сигурна връзка, така че квадратчето за отметка, идентифицирано в люляк (фиг. 7), трябва да бъде избрано.
- Изисква се основно удостоверяване с помощта на SMTP идентификационни данни (т.е. анонимно удостоверяване не е разрешено).
Просто трябва да сме наясно с няколко неща, когато използваме Amazon SES за Database Mail:
- Конфигуриране на SQL агент да използва пощенския профил . Агентът на SQL Server трябва да бъде конфигуриран да използва пощенския профил, създаден по време на конфигурацията на Database Mail, за да може задачите на агента да задействат имейли. (Вижте Фиг. 8)
- Създайте промежуточна таблица . Етапна таблица ще съдържа обобщения набор от резултати за всички данни от историята на архивирането от екземплярите, към които сме насочени с помощта на свързани сървъри. Таблицата DDL е показана в листинг 4.
-- Листинг 4:Таблица за архивиране DDLSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[backuphistory]( [екземпляр] [nvarchar](128) NULL, [име на база данни] [nvarchar](128) ] . [char](1) NULL, [backup_type] [varchar](12) NULL, [backup_start_date] [datetime] NULL, [backup_finish_date] [datetime] NULL, [backup_time (secs)] [int] NULL, [backup_size] [ numeric](20, 0) NULL, [име_на_физическо_устройство] [nvarchar](260) NULL) НА [ОСНОВНО]GOФигура 8. Настройки на SQL агент
Продължаваме и планираме скрипта в листинг 3 в задача на SQL агент и имаме пълния скрипт в листинг 5.
-- Листинг 5:Пълна задача на SQL агент за известяване на историята на архивиранеUSE [msdb]GO/****** Обект:Работа [Обобщение на историята на архивирането на предприятието] Дата на скрипта:26.09.2018 г. 22:16:46 ч. ******/BEGIN TRANSACTIONDECLARE @ReturnCode INTSELECT @ReturnCode =0/****** Обект:JobCategory [[Uncategorized (Local)]] Дата на скрипта:26.09.2018 22:16:46 ** ****/АКО НЕ СЪЩЕСТВУВА (ИЗБЕРЕТЕ име ОТ msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' И category_class=1)BEGINEXEC @ReturnCode =msdb.dbo.sp_add_category @class=N'JOB' , @type=N'LOCAL', @name=N'[Uncategorized (Local)]'IF (@@ERROR <> 0 ИЛИ @ReturnCode <> 0) ОТИДИТЕ 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'@description=налично описание.', @category_name=N'[Uncategorized (Local)]', @owner_login_name=N'TWE NTYTOWERS\Administrator', @job_id =@jobId OUTPUTIF (@@ERROR <> 0 ИЛИ @ReturnCode <> 0) ОТИДИТЕ QuitWithRollback/****** Обект:Стъпка [Обобщена история на архивирането] Дата на скрипта:26.9.2018 г. 22:16:46 ******/EXEC @ReturnCode =msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'Обобщена история на архивирането', @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 Архивиране с помощта на msdb таблици ---- На всички свързани сървъри използвайте таблица msdbgotruncate [msdb].[dbo].[backuphistory]; със srva като (изберете bus.server_name instance, bus.database_name,bus.type, case bus.type, когато '''' D'', след това ''Full'', когато ''I'', след това ''Differential'', когато ''L'', след това ''Log'' край 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 от backupset busjoin backupmediafamily bmf на bus.media_set_id=bmf.media_set_idwhere bus.backup_start_date>=(getdate() - 3)), srvb като (изберете bustabasce.server_name, име на_bus.bus. case bus.type когато ''D'', след това ''Full'', когато ''I'', след това ''Differential'', когато ''L'', след това ''Log'' край 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 от [10.0.1.155] .msdb.dbo.backupset busjoin [10.0.1.155].msdb.dbo.backupmediafamily bmf на bus.media_set_id=bmf.media_set_idwhere b us.backup_start_date>=(getdate() - 3)), srvc като (изберете bus.server_name instance, bus.database_name,bus.type, case bus.type, когато ''D'', след това ''Full'', когато '' I'' след това ''Differential'', когато ''L'', след това ''Log'' край 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 от [10.0.1.83].msdb.dbo.backupset busjoin [10.0.1.83].msdb.dbo.backup bmfmedia. на bus.media_set_id=bmf.media_set_idwhere bus.backup_start_date>=(getdate() - 3))вмъкнете в [msdb].[dbo].[backuphistory]изберете * от srvaunion изберете * от srvbunions изберете * от srvc;', @database_name_name. =N'msdb', @flags=0IF (@@ГРЕШКА <> 0 ИЛИ @ReturnCode <> 0) ОТИДЕТЕ QuitWithRollback/****** Обект:Стъпка [Запитване на членове сървъри за архивиране] Дата на скрипта:26.9.2018 22:16:46 ******/EXEC @ReturnCode =msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'Query Членски сървъри за архивиране ', @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, pri @os_system=n, @oub_system N'TSQL', @command=N'DECLARE @tableHTML NVARCHAR(MAX);SET @tableHTML =N''Резюме на историята на архивирането на предприятия
' ' + N''
Име на екземпляра | '' + N''Име на базата данни | '' + N''Начална дата на архивиране | '' + N''Резервна крайна дата | '' + N''Време за архивиране (сек.) | '' + N''Размер за архивиране | '' + N''Име на физическо устройство |
---|
Благодаря и поздрави,
Операции с корпоративна база данни
'';EXEC msdb.dbo.sp_send_dbmail @ recipients=''[email protected];[email protected]'', @subject =''Резюме на историята на архивирането на предприятието'', @body =@tableHTML , @body_format =''HTML'';', @database_name=N'msdb', @flags=0IF (@@ERROR <> 0 ИЛИ @ReturnCode <> 0) ОТИДИТЕ QuitWithRollback/****** Обект:Стъпка [Поддържане на пълен резултат] Дата на скрипта:9/26/ 2018 22:16:46 ******/EXEC @ReturnCode =msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'Mail Пълен набор от резултати за поддръжка', @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'command=N', 'DECLARE @tableHTML NVARCHAR(MAX);SET @tableHTML =N''
Резюме на архивната история на предприятието
'' + N''<борд на таблицата r="1">'' + N''
Благодаря и поздрави,
Операции с корпоративна база данни
'';EXEC msdb.dbo.sp_send_dbmail @ recipients=''[email protected];[email protected]'', @subject =''Резюме на историята на архивирането на предприятието'', @body =@tableHTML , @body_format =''HTML'';', @database_name=N'msdb', @flags=0IF (@@ERROR <> 0 ИЛИ @ReturnCode <> 0) ОТИДЕТЕ QuitWithRollbackEXEC @ReturnCode =msdb.dbo.sp_update_job @job_id =@jobId, @start_step_id@ =1IF ( ИЛИ @ReturnCode <> 0) ОТИДЕТЕ QuitWithRollbackEXEC @ReturnCode =msdb.dbo.sp_add_jobserver @job_id =@jobId, @server_name =N'(local)'IF (@@ERROR <> 0 ИЛИ @ReturnCode GOTO GOTO GOTO GOTO GOTO 0) EndSaveQuitWithRollback:IF (@@TRANCOUNT> 0) ОТМЕНЯНЕ НА ТРАНЗАКЦИЯEndSave:GO
Изпълнението на тази задача води до изхода, показан на Фигура 9. Таблицата е създадена с помощта на много прост HTML и може да бъде допълнително разработена, за да отговаря на вашите нужди.
Фигура 9. Извеждане по имейл на изпълнение на задание на SQL агент
Заключение
Минахме през прост метод за агрегиране на информация за историята на архивирането (и евентуално всякакви други данни, съдържащи се в системните бази данни), използвайки свързани сървъри. По-нататък продължихме да автоматизираме този процес, използвайки SQL Agent, Database Mail и малко HTML. Този метод може да изглежда малко груб и съм сигурен, че има инструменти, които могат да се справят много по-добре, но това би било предназначение на сървъра за тези, които тепърва започват със SQL Server или среди с нисък бюджет. С малко креативност можете допълнително да персонализирате скриптовете и да ги адаптирате за други цели.
Препратки
- Конфигуриране на поща от база данни
- Първи стъпки с Amazon SES
- Свързани сървъри
- История на архивиране и информация за заглавки