Вот СП, чтобы все началось. Я предполагаю, что вы уже настроили почтовый ящик базы данных, и он работает правильно. Вы можете запустить его вручную, чтобы посмотреть, как он работает. При необходимости отрегулируйте значение по умолчанию @FreeSpaceThresholdMB. SP имеет некоторые ограничения:
- Он может только проверить наличие свободного пространства, доступного
- Он не будет проверять пространство, используемое
- он не будет отображаться на основе процентного
.
CREATE PROCEDURE dbo.CheckFixedDriveFreeSpace
@FreeSpaceThresholdMB INT = 1024
AS
--Name : dbo.CheckFixedDriveFreeSpace
--Purpose : Performs a rudimentary check of free space on fixed drives,
-- sends an email as needed.
--Inputs : @FreeSpaceThresholdMB - the threshold for checking free disk space.
-- If free space is greater, no action is taken. If less, an
-- email is sent.
BEGIN
CREATE TABLE #FixedDrives (
Drive CHAR(1) PRIMARY KEY NONCLUSTERED,
MBFree INT
)
INSERT INTO #FixedDrives EXEC xp_fixeddrives
DECLARE @ErrMsg VARCHAR(MAX)
SET @ErrMsg = ''
SELECT @ErrMsg = @ErrMsg + fd.Drive + ':' + CHAR(9) + CAST(fd.MBFree AS VARCHAR) + ' MB' + CHAR(13) + CHAR(10)
FROM #FixedDrives fd
WHERE fd.MBFree < @FreeSpaceThresholdMB
IF @@ROWCOUNT > 0
BEGIN
SET @ErrMsg = 'Warning: one or more disk drives is running out of free space:' + CHAR(13) + CHAR(10) + @ErrMsg
DECLARE @Subj NVARCHAR(255)
SET @Subj = @@SERVERNAME + ' - Low Disk Space'
EXEC msdb..sp_send_dbmail
@recipients = 'Your email address',
@Subject = @Subj,
@body = @ErrMsg
END
DROP TABLE #FixedDrives
END
GO
Вы можете «подключить» SP к заданию агента SQL и запланировать его выполнение так часто, как вам нравится. Вот "ежечасно" График работы:
IF NOT EXISTS (
SELECT *
FROM msdb.dbo.sysschedules s
WHERE s.name = N'DBA-Hourly Schedule'
)
EXEC msdb.dbo.sp_add_schedule
@schedule_name=N'DBA-Hourly Schedule',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=8,
@freq_subday_interval=1,
@active_start_date=20140101,
@active_end_date=99991231,
@active_start_time=0,
@active_end_time=235959
GO
Далее создайте SQL Agent Работа:
IF NOT EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'DBA-Check Fixed Drive Free Space')
BEGIN
EXEC msdb.dbo.sp_add_job
@job_name=N'DBA-Check Fixed Drive Free Space',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=2,
@notify_level_netsend=0,
@notify_level_page=2,
@delete_level=0,
@description=N'Self-explanatory.',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'sa',
@notify_email_operator_name=N'Some Operator',
@notify_page_operator_name=N'Some Operator',
@start_step_id = 1
EXEC msdb.dbo.sp_attach_schedule
@job_name=N'DBA-Check Fixed Drive Free Space',
@schedule_name=N'DBA-Hourly Schedule'
EXEC msdb.dbo.sp_add_jobserver
@job_name=N'DBA-Check Fixed Drive Free Space',
@server_name = N'(local)'
END
GO
Добавить шаг задания (ы):
IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'DBA-Check Fixed Drive Free Space')
BEGIN
--Calling sp_delete_jobstep with a step_id value of zero deletes all job steps for the job.
EXEC msdb.dbo.sp_delete_jobstep
@job_name=N'DBA-Check Fixed Drive Free Space',
@step_id=0
DECLARE @Cmd NVARCHAR(MAX)
SET @Cmd = N'EXEC dbo.CheckFixedDriveFreeSpace
@FreeSpaceThresholdMB = 1024 --Or Whatever number you want
GO'
EXEC msdb.dbo.sp_add_jobstep
@job_name=N'DBA-Check Fixed Drive Free Space',
@step_name=N'Check Fixed Drive Free Space',
[email protected]_id=1,
@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',
@[email protected],
--Name Of The DB Where You Created [dbo].[CheckFixedDriveFreeSpace]
@database_name=N'ReplaceMe',
@flags=0
END
ELSE
RAISERROR('SQL Server job "DBA-Check Fixed Drive Free Space" does not exist.', 16, 1);
GO
Теперь давайте момент подумать о том, что мы создали ... У нас есть работа агента SQL, работающая один раз в час в «верхней части часа». Он выполняет SP, который отправляет электронную почту, когда доступное дисковое пространство низкое. Это хорошее начало, но у него есть некоторые недостатки. Большой недостаток заключается в том, что наша работа вызвана только графиком. Если есть события, которые быстро потребляют дисковое пространство, один или несколько дисков могут выходить за пределы пространства задолго до запуска задания - мы не узнаем, пока не станет слишком поздно. Если вы хотите продолжить это, мы можем улучшить то, что было создано до сих пор с уведомлениями о событиях. ПРИМЕЧАНИЕ. Я считаю, что вам понадобится SQL Server 2008 или более поздняя версия.
Есть события для DATA_FILE_AUTO_GROW и LOG_FILE_AUTO_GROW. Давайте «подключаемся» к этим событиям, чтобы каждый раз, когда увеличивался файл данных или журналов, мы автоматически проверяем наши диски.
--Create a queue just for file autogrowth events.
CREATE QUEUE queFileAutoGrowthNotification
GO
--Create a service just for file autogrowth events.
CREATE SERVICE svcFileAutoGrowthNotification
ON QUEUE queFileAutoGrowthNotification ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification])
GO
-- Create the event notification for file autogrowth events on the service.
CREATE EVENT NOTIFICATION enFileAutoGrowthEvents
ON SERVER
WITH FAN_IN
FOR DATA_FILE_AUTO_GROW, LOG_FILE_AUTO_GROW
TO SERVICE 'svcFileAutoGrowthNotification', 'current database';
GO
CREATE PROCEDURE dbo.ReceiveFileAutoGrowthEvent
AS
BEGIN
SET NOCOUNT ON
DECLARE @MsgBody XML
WHILE (1 = 1)
BEGIN
BEGIN TRANSACTION
-- Receive the next available message FROM the queue
WAITFOR (
RECEIVE TOP(1) -- just handle one message at a time
@MsgBody = CAST(message_body AS XML)
FROM queFileAutoGrowthNotification
), TIMEOUT 1000 -- if the queue is empty for one second, give UPDATE and go away
-- If we didn't get anything, bail out
IF (@@ROWCOUNT = 0)
BEGIN
ROLLBACK TRANSACTION
BREAK
END
ELSE
BEGIN
--Although we've captured the message body, we're not using any of the event data.
--Run this SP when the event is triggered.
EXEC [ReplaceMe].dbo.CheckFixedDriveFreeSpace
@FreeSpaceThresholdMB = 1024 --Or Whatever number you want.
/*
Alternatively, you could start a SQL Agent job when the event is triggered.
(You won't be able to do this with SQLExpress versions.)
EXEC msdb.dbo.sp_start_job
@job_name = 'DBA-Check Fixed Drive Free Space'
*/
/*
Commit the transaction. At any point before this, we
could roll back -- the received message would be back
on the queue AND the response wouldn't be sent.
*/
COMMIT TRANSACTION
END
END
END
GO
ALTER QUEUE dbo.queFileAutoGrowthNotification
WITH
STATUS = ON,
ACTIVATION (
PROCEDURE_NAME = dbo.ReceiveFileAutoGrowthEvent,
STATUS = ON,
--STATUS = OFF,
MAX_QUEUE_READERS = 1,
EXECUTE AS OWNER)
GO
Вы должны изучить Интеграционные службы. – mxix
Какую особенность функции SIS вы имеете в виду? – QWE
Вы можете настроить пакет с помощью команды Sql с вашими запросами и электронной почтой, чтобы отправить вам электронное письмо с результатами. Запланируйте его на сервере Sql Server Agent для ежедневного запуска. Вы можете достичь этого во многом в рамках SSIS. – mxix