2015-04-22 2 views
-1

У нас есть постоянные проблемы с доступным пространством и нет финансовых средств для его обновления. Поэтому я должен быть очень осторожным в своем наблюдении за размером базы данных, ее ростом и оставшимся свободным пространством. Каждое утро я вручную запускаю запрос, чтобы получить свободное пространство, и я копирую результаты в файл excel. Как вы можете себе представить, это довольно сложный процесс и его отходы в большом количестве, потому что я должен делать это для каждого сервера отдельно.Как контролировать доступное дисковое пространство

Мне интересно, есть ли способ автоматически получить статистику (особенно свободное место слева) из производственной среды и переместить ее в специальную таблицу в той же или другой базе данных/сервере. Я бы хотел, чтобы таблица автоматически обновлялась ежедневно. Это не обязательно должна быть таблица. Любой способ, который позволит мне сэкономить свое время на ежедневной основе, будет оценен по достоинству.

Не могли бы вы посоветовать? У вас есть похожие решения в ваших базах данных? Пожалуйста, поделитесь своим опытом.

!

+0

Вы должны изучить Интеграционные службы. – mxix

+0

Какую особенность функции SIS вы имеете в виду? – QWE

+0

Вы можете настроить пакет с помощью команды Sql с вашими запросами и электронной почтой, чтобы отправить вам электронное письмо с результатами. Запланируйте его на сервере Sql Server Agent для ежедневного запуска. Вы можете достичь этого во многом в рамках SSIS. – mxix

ответ

1

Вот СП, чтобы все началось. Я предполагаю, что вы уже настроили почтовый ящик базы данных, и он работает правильно. Вы можете запустить его вручную, чтобы посмотреть, как он работает. При необходимости отрегулируйте значение по умолчанию @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 
+0

Большое вам спасибо! – QWE

0

Вы считали работу агента SQL Server? В Microsoft SQL Management Studio разверните узел агента SQL Server в проводнике объектов, щелкните правой кнопкой мыши на узле «Задания» и выберите «Создать задание» ...

+0

Я посмотрю. Какими должны быть шаги на рабочем месте. Как ты думаешь? – QWE

+0

@QWE смотрите здесь, чтобы начать: https://msdn.microsoft.com/en-us/library/cc645912.aspx – HingeSight

0

Думаю, вам стоит рассмотреть возможность использования сценария powershell для выполнения задания. Пожалуйста, прочтите это topic, в котором говорится о том, чего вы хотите.

+0

Это очень полезная ссылка. Огромное спасибо!! – QWE

Смежные вопросы