數據庫服務器巡檢得到結果如下
創建存儲過程獲取服務器狀態
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
執行腳本創建數據庫連接