2015-04-22 51 views
-1

我們在可用空間方面存在問題,並且沒有經濟手段來升級它。因此,我必須非常小心地監視數據庫大小,增長情況和剩餘空間。每天早上,我手動運行查詢以獲得可用空間,並將結果複製到excel文件中。正如你可以想象的那樣,這是一個非常艱鉅的過程,並且浪費我大量的時間,因爲我必須爲每個服務器單獨執行。如何監視可用磁盤空間

我想知道是否有辦法從生產環境中自動檢索統計信息(特別是剩餘空間)並將其移至相同或其他數據庫/服務器中的特殊表。我希望每天自動更新表格。它不一定是一張桌子。任何方式,讓我每天節省我的時間將不勝感激。

你能建議嗎?你的數據庫中是否有類似的解決方案?請分享你的經驗。

+0

您應該看看Integration Services。 – mxix

+0

你有什麼特別的功能? – QWE

+0

您可以使用查詢和電子郵件任務設置包含Sql命令任務的包,以向您發送包含結果的電子郵件。安排在Sql Server Agent上每日運行。您可以在SSIS中以多種方式實現此目的。 – mxix

回答

1

這是一個SP來讓事情開始。我將假設您已經設置了數據庫郵件,並且它運行正常。你可以手動運行它,看看它是如何工作的。根據需要調整@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代理工作:

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 

添加作業步驟(S):

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 Agent Job嗎?在Microsoft SQL Management Studio中,展開Object Explorer中的SQL Server代理節點,右鍵單擊Jobs節點並選擇New Job ...

+0

我會研究它。工作中的步驟應該是什麼。你怎麼想? – QWE

+0

@QWE在這裏開始使用:https://msdn.microsoft.com/en-us/library/cc645912.aspx – HingeSight

0

我認爲您應該考慮使用powershell腳本來完成這項工作。請閱讀這個topic它談論你想要什麼。

+0

這是一個非常有用的鏈接。非常感謝!! – QWE