364 lines
15 KiB
Transact-SQL
364 lines
15 KiB
Transact-SQL
USE [HCITools]
|
|
GO
|
|
|
|
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DBA_Check]') AND type in (N'P', N'PC'))
|
|
DROP PROCEDURE [dbo].[DBA_Check]
|
|
GO
|
|
|
|
USE [HCITools]
|
|
GO
|
|
|
|
SET ANSI_NULLS ON
|
|
GO
|
|
|
|
SET QUOTED_IDENTIFIER ON
|
|
GO
|
|
|
|
|
|
|
|
|
|
CREATE PROCEDURE [dbo].[DBA_Check]
|
|
@in_debug int = null,
|
|
@in_CheckType smallint
|
|
AS
|
|
/*=============================================================================
|
|
|
|
Explication du traitement realise par la SP
|
|
-------------------------------------------
|
|
Cette SP sert à vérifier un ensemble de points critiques sur une instance SQL Server
|
|
|
|
Contexte d'utilisation
|
|
----------------------
|
|
Cette SP est appelée par le job D92100 - DBA Check
|
|
|
|
Parametres
|
|
----------
|
|
@in_debug : non utilisé
|
|
@in_CheckType : 1 = Check du recovery mode des bases de données
|
|
2 = Check de l'existance d'un backup (De base et/ou de log) en fonction du recovery mode de la base de données
|
|
3 = Check d'évenements relatifs aux serveurs liés la veille
|
|
4 = Check des triggers d'AMR manquants
|
|
|
|
Creation : 30.03.16 / FLA
|
|
|
|
Modifications : 30.01.18 - FLA - Ajout d'un check d'événements relatifs aux serveurs liés
|
|
20.06.16 - FLA - Bug sur test de la version SQL, suppression du test car inutile
|
|
05.10.10 - FLA - Ajout de la gestion des environnements pour le test du recovery mode
|
|
01.10.20 - FLA - Ajout du check des triggers d'AMR
|
|
06.10.20 - FLA - Suppresion du raiseerror
|
|
10.11.20 - FLA - Check if Arizona exist for check 4
|
|
23.11.20 - SPE - Monitor Scanned Documents
|
|
23.11.20 - SPE - Add check log level of services (trace, debug, info)
|
|
25.02.21 - RTC - Remove check 5 for pending Scan : ask by CCA
|
|
05.08.21 - SPE - Remove check linkedservers if ActivePharmacyReplicationPlugin
|
|
16.08.21 - SPE - Add check activepos_read size
|
|
17.03.22 - FLA : Change DBA mail
|
|
20.06.23 - RTC : Update Backup check to allign to Commvault random schedule
|
|
|
|
=============================================================================*/
|
|
|
|
set nocount on;
|
|
|
|
declare @result_sp int,
|
|
@errno int,
|
|
@errmsg varchar(255)
|
|
|
|
/*------------------- Declaration des variables --------------------*/
|
|
declare @DatabaseName sysname,
|
|
@Message varchar(8000),
|
|
@xml XML,
|
|
@delimiter VARCHAR(1),
|
|
@param_group_counter_list NVARCHAR(3000),
|
|
@LastBackUpTime datetime,
|
|
@RecoveryMode varchar(10),
|
|
@Type varchar(10),
|
|
@Event varchar(400),
|
|
@TableName sysname,
|
|
@totImages int,
|
|
@ModeUsed varchar(255)
|
|
|
|
|
|
|
|
/*------------ Affectation des parametres aux variables ------------*/
|
|
SET @Message = ''
|
|
SET @totImages = 0
|
|
SET @ModeUsed = ''
|
|
SELECT @param_group_counter_list = HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_NOT_DB'
|
|
SET @delimiter = ','
|
|
SET @xml = CAST(('<X>'+REPLACE(@param_group_counter_list, @delimiter, '</X><X>')+'</X>') AS XML)
|
|
|
|
/*-------------------------- Traitement ---------------------------*/
|
|
BEGIN TRY
|
|
|
|
IF @in_CheckType = 1
|
|
BEGIN
|
|
IF EXISTS (SELECT type FROM master.cfg.InstanceContext WHERE type = 'PROD')
|
|
BEGIN
|
|
declare c_backup cursor local forward_only static for
|
|
select name
|
|
from sys.databases
|
|
where name in ('Arizona','ArizonaCash') /* On vérifie que Arizona et ArizonaCash ne sont pas en mode SIMPLE */
|
|
AND recovery_model_desc = 'SIMPLE'
|
|
|
|
open c_backup
|
|
|
|
FETCH NEXT FROM c_backup
|
|
into @DatabaseName
|
|
|
|
while @@fetch_status = 0
|
|
begin
|
|
|
|
SET @Message = @Message + 'La base '+@DatabaseName+' est en recovery SIMPLE ' + CHAR(13)
|
|
|
|
FETCH NEXT FROM c_backup
|
|
into @DatabaseName
|
|
end
|
|
|
|
close c_backup
|
|
deallocate c_backup
|
|
END
|
|
END
|
|
ELSE IF @in_CheckType = 2
|
|
BEGIN
|
|
|
|
declare c_backup cursor local forward_only static for
|
|
select DatabaseName, LastBackUpTime,recovery_model_desc,type
|
|
FROM
|
|
(SELECT sdb.Name AS DatabaseName,sdb.recovery_model_desc,sdb.type,MAX(bus.backup_finish_date) AS LastBackUpTime
|
|
FROM
|
|
(select sd.name,sd.recovery_model_desc, a.type
|
|
FROM sys.databases sd WITH (NOLOCK)
|
|
LEFT OUTER JOIN
|
|
(SELECT 'FULL' as recovery_model_desc,'D' as type
|
|
UNION
|
|
SELECT 'FULL','L'
|
|
UNION
|
|
SELECT 'SIMPLE','D') a
|
|
ON a.recovery_model_desc = sd.recovery_model_desc
|
|
where name <> 'model') sdb
|
|
LEFT OUTER JOIN msdb.dbo.backupset bus WITH (NOLOCK)
|
|
ON bus.database_name = sdb.name
|
|
AND (bus.type = 'D' OR bus.type = 'L')
|
|
AND bus.type = sdb.type
|
|
AND is_snapshot = 0
|
|
GROUP BY sdb.name,sdb.recovery_model_desc,sdb.type) b
|
|
WHERE (DATEDIFF(HOUR, CAST(b.LastBackUpTime as DATETIME), CAST(GETDATE() as DATETIME )) > 20 OR b.LastBackUpTime is null)
|
|
AND LOWER(DatabaseName) not in (SELECT C.value('.', 'varchar(3000)') AS value FROM @xml.nodes('X') AS X(C))
|
|
|
|
open c_backup
|
|
|
|
FETCH NEXT FROM c_backup
|
|
into @DatabaseName, @LastBackUpTime, @RecoveryMode, @Type
|
|
|
|
while @@fetch_status = 0
|
|
begin
|
|
|
|
SET @Message = @Message + 'Il n''y a pas eu de backup de '+REPLACE(REPLACE(@Type,'D','Database'),'L','Log')+' sur la base '+@DatabaseName+' en recovery mode '+@RecoveryMode+' depuis '+ isnull(CONVERT(varchar(50),@LastBackUpTime,121),'toujours') + CHAR(13)
|
|
|
|
FETCH NEXT FROM c_backup
|
|
into @DatabaseName, @LastBackUpTime, @RecoveryMode, @Type
|
|
end
|
|
|
|
close c_backup
|
|
deallocate c_backup
|
|
END
|
|
ELSE IF @in_CheckType = 3
|
|
BEGIN
|
|
|
|
IF EXISTS (SELECT *
|
|
FROM [master].sys.objects o WITH (NOLOCK)
|
|
WHERE o.name = 'DDL_audit'
|
|
AND o.type IN (N'U'))
|
|
BEGIN
|
|
declare c_lksrv cursor local forward_only static for
|
|
SELECT 'Linked Server Event :'+CHAR(13)+CHAR(10)+
|
|
'Login : '+DA_Event_Xml.value('(./EVENT_INSTANCE/LoginName)[1]','VARCHAR(50)')+CHAR(13)+CHAR(10)+
|
|
'Name : '+DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)')+CHAR(13)+CHAR(10)+
|
|
'Event : '+DA_Event_Xml.value('(./EVENT_INSTANCE/EventType)[1]','VARCHAR(50)')+CHAR(13)+CHAR(10)+
|
|
'With : '+[DA_App_Name]+CHAR(13)+CHAR(10)+
|
|
'From : '+[DA_Host_Name]+CHAR(13)+CHAR(10)+
|
|
'At : '+DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','VARCHAR(50)')+CHAR(13)+CHAR(10) as Mail
|
|
FROM [master].[dba].[DDL_audit]
|
|
where DA_App_Name <> 'ActivePharmacyReplicationPlugin' AND DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectType)[1]','VARCHAR(50)') = 'LINKED SERVER'
|
|
AND DA_Event_Xml.value('(./EVENT_INSTANCE/PostTime)[1]','DATETIME') > GETDATE()-1
|
|
AND NOT ((DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)') LIKE 'WA%'
|
|
OR DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)') LIKE 'WCV%'
|
|
OR DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)') LIKE 'WS%')
|
|
AND DA_Event_Xml.value('(./EVENT_INSTANCE/EventType)[1]','VARCHAR(50)') = 'ALTER_LINKED_SERVER'
|
|
AND ([DA_App_Name] = 'SQLCMD' OR [DA_App_Name] = 'Microsoft SQL Server' OR [DA_App_Name] = 'ActivePharmacy.ArizonaServerService'))
|
|
AND NOT (DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)') like 'AZLD_%'
|
|
AND [DA_App_Name] like 'SQLAgent%')
|
|
AND NOT (DA_Event_Xml.value('(./EVENT_INSTANCE/ObjectName)[1]','VARCHAR(50)') like 'DWH_%'
|
|
AND [DA_App_Name] like 'SQLAgent%')
|
|
|
|
open c_lksrv
|
|
|
|
FETCH NEXT FROM c_lksrv
|
|
into @Event
|
|
|
|
while @@fetch_status = 0
|
|
begin
|
|
|
|
SET @Message = @Message + @Event
|
|
|
|
FETCH NEXT FROM c_lksrv
|
|
into @Event
|
|
end
|
|
|
|
close c_lksrv
|
|
deallocate c_lksrv
|
|
|
|
END
|
|
END
|
|
ELSE IF @in_CheckType = 4
|
|
BEGIN
|
|
IF EXISTS (SELECT 1 FROM sys.databases where name = 'Arizona')
|
|
BEGIN
|
|
declare c_MON_Triggers cursor local forward_only static for
|
|
SELECT AMT.AMT_table_name
|
|
FROM Arizona.dbo.aps_monitor_table AMT
|
|
LEFT JOIN Arizona.sys.triggers TR
|
|
ON TR.name like 'aps[_]tIUD[_]MON[_]%'
|
|
AND OBJECT_NAME(TR.parent_id,DB_ID('Arizona')) = AMT.AMT_table_name
|
|
WHERE AMT.AMT_monitoring_type > 1
|
|
AND TR.name IS NULL
|
|
|
|
|
|
open c_MON_Triggers
|
|
|
|
FETCH NEXT FROM c_MON_Triggers
|
|
into @TableName
|
|
|
|
while @@fetch_status = 0
|
|
begin
|
|
|
|
SET @Message = @Message + 'Il manque le trigger de monitoring sur la table '+@TableName + CHAR(13)
|
|
|
|
FETCH NEXT FROM c_MON_Triggers
|
|
into @TableName
|
|
end
|
|
|
|
close c_MON_Triggers
|
|
deallocate c_MON_Triggers
|
|
END
|
|
END
|
|
ELSE IF @in_CheckType = 6
|
|
BEGIN
|
|
IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActivePos_server')
|
|
BEGIN
|
|
IF EXISTS(SELECT 1 FROM [ActivePos_server].[dbo].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info')
|
|
BEGIN
|
|
|
|
SELECT @ModeUsed = SettingValue FROM [ActivePos_server].[dbo].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info'
|
|
IF (@ModeUsed = 'Error' OR @ModeUsed = 'Warn' OR @ModeUsed = 'Fatal')
|
|
BEGIN
|
|
SET @Message = @Message + 'The log level in ActivePos_server is: '+@ModeUsed +' we can skip some important log.' + CHAR(13)
|
|
END
|
|
ELSE IF (@ModeUsed = 'Debug' OR @ModeUsed = 'Trace')
|
|
BEGIN
|
|
SET @Message = @Message + 'The log level in ActivePos_server is: '+@ModeUsed +' this cause some performances issues.' + CHAR(13)
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
SET @Message = @Message + 'The log level in ActivePos_server is: '+@ModeUsed +' This value is not supported.' + CHAR(13)
|
|
END
|
|
|
|
END
|
|
END
|
|
IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActivePos_write')
|
|
BEGIN
|
|
IF EXISTS(SELECT 1 FROM [ActivePos_write].[dbo].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info')
|
|
BEGIN
|
|
|
|
SELECT @ModeUsed = SettingValue FROM [ActivePos_write].[dbo].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info'
|
|
IF (@ModeUsed = 'Error' OR @ModeUsed = 'Warn' OR @ModeUsed = 'Fatal')
|
|
BEGIN
|
|
SET @Message = @Message + 'The log level in ActivePos_write is: '+@ModeUsed +' we can skip some important log.' + CHAR(13)
|
|
END
|
|
ELSE IF (@ModeUsed = 'Debug' OR @ModeUsed = 'Trace')
|
|
BEGIN
|
|
SET @Message = @Message + 'The log level in ActivePos_write is: '+@ModeUsed +' this cause some performances issues.' + CHAR(13)
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
SET @Message = @Message + 'The log level in ActivePos_write is: '+@ModeUsed +' This value is not supported.' + CHAR(13)
|
|
END
|
|
|
|
END
|
|
END
|
|
IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActiveSystemClient')
|
|
BEGIN
|
|
IF EXISTS(SELECT 1 FROM [ActiveSystemClient].[cfg].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info')
|
|
BEGIN
|
|
|
|
SELECT @ModeUsed = SettingValue FROM [ActiveSystemClient].[cfg].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info'
|
|
IF (@ModeUsed = 'Error' OR @ModeUsed = 'Warn' OR @ModeUsed = 'Fatal')
|
|
BEGIN
|
|
SET @Message = @Message + 'The log level in ActiveSystemClient is: '+@ModeUsed +' we can skip some important log.' + CHAR(13)
|
|
END
|
|
ELSE IF (@ModeUsed = 'Debug' OR @ModeUsed = 'Trace')
|
|
BEGIN
|
|
SET @Message = @Message + 'The log level in ActiveSystemClient is: '+@ModeUsed +' this cause some performances issues.' + CHAR(13)
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
SET @Message = @Message + 'The log level in ActiveSystemClient is: '+@ModeUsed +' This value is not supported.' + CHAR(13)
|
|
END
|
|
|
|
END
|
|
END
|
|
IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActiveSystemServer')
|
|
BEGIN
|
|
IF EXISTS(SELECT 1 FROM [ActiveSystemServer].[cfg].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info')
|
|
BEGIN
|
|
|
|
SELECT @ModeUsed = SettingValue FROM [ActiveSystemServer].[cfg].[Settings] where SettingId = 'Values.Diagnostics.MinLogLevel' and SettingValue <> 'Info'
|
|
IF (@ModeUsed = 'Error' OR @ModeUsed = 'Warn' OR @ModeUsed = 'Fatal')
|
|
BEGIN
|
|
SET @Message = @Message + 'The log level in ActiveSystemServer is: '+@ModeUsed +' we can skip some important log.' + CHAR(13)
|
|
END
|
|
ELSE IF (@ModeUsed = 'Debug' OR @ModeUsed = 'Trace')
|
|
BEGIN
|
|
SET @Message = @Message + 'The log level in ActiveSystemServer is: '+@ModeUsed +' this cause some performances issues.' + CHAR(13)
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
SET @Message = @Message + 'The log level in ActiveSystemServer is: '+@ModeUsed +' This value is not supported.' + CHAR(13)
|
|
END
|
|
|
|
END
|
|
END
|
|
END
|
|
ELSE IF @in_CheckType = 7
|
|
BEGIN
|
|
IF EXISTS (SELECT 1 FROM sys.databases where name = 'ActivePos_read')
|
|
BEGIN
|
|
IF EXISTS(SELECT 1 FROM sys.master_files where name = 'activepos_read_Data' and size * 8/1024 > 8192)
|
|
BEGIN
|
|
DECLARE @aposreadsize int
|
|
SELECT @aposreadsize = size * 8/1024 FROM sys.master_files where name = 'activepos_read_Data'
|
|
SET @Message = @Message + 'La taille de la base activepos_read est plus grande que 8Go! Taille actuelle: '+convert(varchar(255),@aposreadsize) + CHAR(13)
|
|
END
|
|
END
|
|
END
|
|
|
|
/* S'il y a une erreur, on envoie un mail aux DBA */
|
|
IF @Message <> ''
|
|
BEGIN
|
|
exec aps_Send_Mail_with_template
|
|
@in_param_varchar_2 = 'DBA_operator;',
|
|
@in_job_type = 3, /* 3 = warning */
|
|
@in_param_varchar_3 = @Message
|
|
END
|
|
/*---------------------- Traitement des erreurs ----------------------*/
|
|
END TRY
|
|
BEGIN CATCH
|
|
|
|
/* Traitement des erreurs (avec RaiseError) */
|
|
EXEC dbo.get_Error_Info @in_RaiseError = 1
|
|
|
|
END CATCH
|
|
|
|
|
|
GO
|