SQL server 存儲過程+作業 定時抓取數據庫服務器 狀態 實現巡檢(一臺服務器查看多臺服務器)

數據庫服務器巡檢得到結果如下
這裏寫圖片描述


創建存儲過程獲取服務器狀態


create   PROCEDURE [dbo].[proc_Server_inspection]
(
    @server_ip VARCHAR(20),
    @db_name VARCHAR(20)

)
AS
BEGIN
    SET NOCOUNT ON;

    --變量定義
    --計算過程執行時長
    DECLARE @starttime DATETIME
    DECLARE @totaltime INT
    --執行影響行數
    DECLARE @ROW INT
    --錯誤日誌
    DECLARE @ErrorMessage VARCHAR(1000)

    --變量賦值
    SET @starttime = GETDATE()

    --創建臨時表
create TABLE #tmp_inspection 
  (
       [cntr_time]  DATETIME   NULL ,
      [counter_name] VARCHAR(100) NULL ,
      [cntr_value] NUMERIC(27, 6) NULL ,
       )
ON  [PRIMARY];

IF @db_name ='本機'
BEGIN 

INSERT INTO    #tmp_inspection(cntr_time,counter_name,cntr_value)
EXEC  ( 'SELECT    GETDATE() AS cntr_time ,
                    counter_name ,
                    ( CASE WHEN object_name = ''SQLServer:Databases''
                           THEN cntr_value * 1.0 / 1024
                           ELSE cntr_value
                      END ) AS cntr_value
          FROM        sys.dm_os_performance_counters
          WHERE     counter_name IN ( ''Active Temp Tables'',
                                      ''Logical Connections'',
                                      ''User Connections'', ''Processes blocked'',
                                      ''Data File(s) Size (KB)'',
                                      ''Log File(s) Size (KB)'',
                                      ''Log File(s) Used Size (KB)'',
                                      ''Buffer cache hit ratio'',
                                      ''Buffer cache hit ratio base'' )
                    AND object_name IN ( ''SQLServer:Buffer Manager'',
                                         ''SQLServer:General Statistics'',
                                         ''SQLServer:Databases'' )
                    AND instance_name = ''''
          UNION
          SELECT    GETDATE() AS cntr_time ,
                    counter_name ,
                    cntr_value
          FROM       sys.dm_os_performance_counters
          WHERE     counter_name IN ( ''Page reads/sec'', ''Page writes/sec'',
                                      ''Latch Waits/sec'', ''Full Scans/sec'',
                                      ''Index Searches/sec'',
                                      ''Batch Requests/sec'', ''Transactions/sec'',
                                      ''Write Transactions/sec'' )
                    AND object_name IN ( ''SQLServer:Buffer Manager'',
                                         ''SQLServer:Databases'',
                                         ''SQLServer:Latches'',
                                         ''SQLServer:Access Methods'',
                                         ''SQLServer:SQL Statistics'' )
                    AND instance_name = ''''
         ;')
INSERT  INTO Server_inspection_day
EXEC  ('SELECT   
                '''+@server_ip+'''  ,

                *
        FROM    #tmp_inspection PIVOT  ( MAX(cntr_value) FOR [counter_name] IN ( [Active Temp Tables],
                                                              [Batch Requests/sec],
                                                              [Buffer cache hit ratio],
                                                              [Buffer cache hit ratio base],
                                                              [Full Scans/sec],
                                                              [Index Searches/sec],
                                                              [Latch Waits/sec],
                                                              [Logical Connections],
                                                              [Page reads/sec],
                                                              [Page writes/sec],
                                                              [Processes blocked],
                                                              [User Connections] ) )      AS b;')

END

ELSE 
BEGIN

INSERT INTO    #tmp_inspection(cntr_time,counter_name,cntr_value)
EXEC  ('SELECT    GETDATE() AS cntr_time ,
                    counter_name ,
                    ( CASE WHEN object_name = ''SQLServer:Databases''
                           THEN cntr_value * 1.0 / 1024
                           ELSE cntr_value
                      END ) AS cntr_value
          FROM      ['+@server_ip+'].['+@db_name+'].sys.dm_os_performance_counters
          WHERE     counter_name IN ( ''Active Temp Tables'',
                                      ''Logical Connections'',
                                      ''User Connections'', ''Processes blocked'',
                                      ''Data File(s) Size (KB)'',
                                      ''Log File(s) Size (KB)'',
                                      ''Log File(s) Used Size (KB)'',
                                      ''Buffer cache hit ratio'',
                                      ''Buffer cache hit ratio base'' )
                    AND object_name IN ( ''SQLServer:Buffer Manager'',
                                         ''SQLServer:General Statistics'',
                                         ''SQLServer:Databases'' )
                    AND instance_name = ''''
          UNION
          SELECT    GETDATE() AS cntr_time ,
                    counter_name ,
                    cntr_value
          FROM      ['+@server_ip+'].['+@db_name+'].sys.dm_os_performance_counters
          WHERE     counter_name IN ( ''Page reads/sec'', ''Page writes/sec'',
                                      ''Latch Waits/sec'', ''Full Scans/sec'',
                                      ''Index Searches/sec'',
                                      ''Batch Requests/sec'', ''Transactions/sec'',
                                      ''Write Transactions/sec'' )
                    AND object_name IN ( ''SQLServer:Buffer Manager'',
                                         ''SQLServer:Databases'',
                                         ''SQLServer:Latches'',
                                         ''SQLServer:Access Methods'',
                                         ''SQLServer:SQL Statistics'' )
                    AND instance_name = ''''
         ;')

 INSERT  INTO Server_inspection_day
EXEC( 'SELECT   
                  '''+@server_ip+''' ,

                *
        FROM    #tmp_inspection PIVOT  ( MAX(cntr_value) FOR [counter_name] IN ( [Active Temp Tables],
                                                              [Batch Requests/sec],
                                                              [Buffer cache hit ratio],
                                                              [Buffer cache hit ratio base],
                                                              [Full Scans/sec],
                                                              [Index Searches/sec],
                                                              [Latch Waits/sec],
                                                              [Logical Connections],
                                                              [Page reads/sec],
                                                              [Page writes/sec],
                                                              [Processes blocked],
                                                              [User Connections] ) )      AS b;')

END




     --計算總時長
     SET @totaltime=datediff(second,@starttime,getdate());



    --刪除臨時表
    IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#tmp_inspection'))
    BEGIN
    DROP TABLE #tmp_inspection
    END

    --記錄日誌
    INSERT INTO tb_SYSLOGS(Logger,Logtime,LogIP,Logname,LogTotalTime,LevelCode,Message,LogSQL)
    SELECT 'Templete',GETDATE(),'::1','sa',@totaltime,'Server_inspection','','影響行數' + CAST(@ROW AS VARCHAR(10)) + ',' + @ErrorMessage;

    END


創建job

創建作業每天上午10點調用一次存儲過程proc_Server_inspection


BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object:  JobCategory [[Uncategorized (Local)]]    Script Date: 2018/7/10 15:16:57 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'sqlsever數據庫服務器巡檢', 
        @enabled=1, 
        @notify_level_eventlog=0, 
        @notify_level_email=0, 
        @notify_level_netsend=0, 
        @notify_level_page=0, 
        @delete_level=0, 
        @description=N'每天十點定時執行', 
        @category_name=N'[Uncategorized (Local)]', 
        @owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object:  Step [循環調用存儲過程proc_Server_inspection]    Script Date: 2018/7/10 15:16:57 ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'循環調用存儲過程proc_Server_inspection', 
        @step_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', 
        @command=N'DECLARE @server_ip Nvarchar(50)
----遊標實現循環傳入參數
DECLARE @db_name Nvarchar(50)
DECLARE inspection_cur CURSOR FOR
  SELECT server_ip,db_name FROM database_sever_link
--打開遊標
OPEN inspection_cur
--獲取數據,遊標下移一行
FETCH NEXT FROM inspection_cur INTO @server_ip, @db_name
--檢測獲取數據是否成功
WHILE @@fetch_status=0
BEGIN
  --顯示通過遊標賦值的變量
  exec proc_Server_inspection @server_ip, @db_name --執行
  --遊標繼續下移
  FETCH NEXT FROM inspection_cur INTO @server_ip, @db_name
END
--關閉遊標
CLOSE inspection_cur 
deallocate inspection_cur', 
        @database_name=N'MonitorCenter', 
        @flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'每天10:00執行', 
        @enabled=1, 
        @freq_type=4, 
        @freq_interval=1, 
        @freq_subday_type=1, 
        @freq_subday_interval=1, 
        @freq_relative_interval=0, 
        @freq_recurrence_factor=0, 
        @active_start_date=20180710, 
        @active_end_date=99991231, 
        @active_start_time=100000, 
        @active_end_time=235959, 
        @schedule_uid=N'4a4fbbae-3fb1-4f37-94dd-1443562fa333'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:

GO



創建需要用到的表

-------創建表用於存放巡檢數據
CREATE TABLE [dbo].[Server_inspection_day]
    (
      [服務器地址] VARCHAR(20) NULL ,
      [巡檢時間] [DATETIME] NOT NULL ,
      [活動臨時表] [NUMERIC](27, 6) NULL ,
      [批量請求/秒] [NUMERIC](27, 6) NULL ,
      [緩衝區緩存命中數] [NUMERIC](27, 6) NULL ,
      [緩衝區緩存命中基數] [NUMERIC](27, 6) NULL ,
      [全掃描/秒] [NUMERIC](27, 6) NULL ,
      [索引掃描/秒] [NUMERIC](27, 6) NULL ,
      [鎖定等待/秒] [NUMERIC](27, 6) NULL ,
      [邏輯連接] [NUMERIC](27, 6) NULL ,
      [數據頁讀/秒] [NUMERIC](27, 6) NULL ,
      [數據頁寫/秒] [NUMERIC](27, 6) NULL ,
      [阻塞進程] [NUMERIC](27, 6) NULL ,
      [用戶連接數] [NUMERIC](27, 6) NULL
    )
ON  [PRIMARY];

----創建表用於存放數據庫服務器地址和數據庫名
CREATE TABLE [dbo].[database_sever_link]
    (
       [server_ip] VARCHAR(20),
       [db_name] VARCHAR(20)  
    )
ON  [PRIMARY];

將需要巡檢的數據庫服務器維護到database_sever_link表中

INSERT INTO database_sever_link
VALUES ('10.37.53.1','master' );
INSERT INTO database_sever_link
VALUES ('10.33.36.2','master' );
INSERT INTO database_sever_link
VALUES ('122.22.33.153','本機' );

備註:
本機 db_name寫本機、


創建數據庫連接

SELECT  
'exec sp_addlinkedserver   '''+server_ip+''', '' '', ''SQLOLEDB '', '''+server_ip+''';'  FROM  database_sever_link
UNION
SELECT 
'exec sp_addlinkedsrvlogin '''+server_ip+''', ''false '',null, ''sa '', ''123456'';'  FROM  database_sever_link

執行腳本創建數據庫連接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章