Advertisements
This script will check the always ON group and database status and notify an alert when the AG or database is not online and disconnected.
Table:
use DBAdata go CREATE TABLE [dbo].[tbl_alwayson_monitoring]( [replica_server_name] [nvarchar](256) NOT NULL, [Group_name] [nvarchar](256) NOT NULL, [role_desc] [nvarchar](60) NULL, [operational_state_desc] [nvarchar](60) NULL, [recovery_health_desc] [nvarchar](60) NULL, [synchronization_health_desc] [nvarchar](60) NULL, Upload_date datetime ) use DBAdata_archive go CREATE TABLE [dbo].[tbl_alwayson_monitoring]( [replica_server_name] [nvarchar](256) NOT NULL, [Group_name] [nvarchar](256) NOT NULL, [role_desc] [nvarchar](60) NULL, [operational_state_desc] [nvarchar](60) NULL, [recovery_health_desc] [nvarchar](60) NULL, [synchronization_health_desc] [nvarchar](60) NULL, Upload_date datetime )
SP:
/* --drop table tbl_alwayson_monitoring select * from tbl_alwayson_monitoring use DBAdata go CREATE TABLE [dbo].[tbl_alwayson_monitoring]( [replica_server_name] [nvarchar](256) NOT NULL, [Group_name] [nvarchar](256) NOT NULL, [role_desc] [nvarchar](60) NULL, [operational_state_desc] [nvarchar](60) NULL, [recovery_health_desc] [nvarchar](60) NULL, [synchronization_health_desc] [nvarchar](60) NULL, Upload_date datetime ) use DBAdata_archive go CREATE TABLE [dbo].[tbl_alwayson_monitoring]( [replica_server_name] [nvarchar](256) NOT NULL, [Group_name] [nvarchar](256) NOT NULL, [role_desc] [nvarchar](60) NULL, [operational_state_desc] [nvarchar](60) NULL, [recovery_health_desc] [nvarchar](60) NULL, [synchronization_health_desc] [nvarchar](60) NULL, Upload_date datetime ) */ /*=======================[usp_SpServerDiagnostics] & [usp_SpServerDiagnostics_new] both sp needed */ -- use DBAdata go -- DROP PROC [Usp_Alwayson_Monitoring] alter proc [dbo].Usp_Alwayson_Monitoring /* Summary: Alwayson status Contact: Muthukkumaran Kaliyamoorthy SQL DBA Description: Alwayson status run sp_server_diagnostics on target server ChangeLog: Date Coder Description 2013-jan-21 Muthukkumaran Kaliyamoorthy Updated the 2012 functionality */ --with Encryption as begin DECLARE @server_name SYSNAME DECLARE @DESC SYSNAME DECLARE @sql varchar(8000) DECLARE @minrow int DECLARE @maxrow int TRUNCATE TABLE tbl_alwayson_monitoring declare @spaceinfo table (id int primary key identity, servername varchar(100),Description varchar(100)) insert into @spaceinfo select Servername , Description from dbadata.dbo.dba_all_servers WHERE ha ='alwayson' and VERSION NOT IN('SQL2000','SQL2005','SQL2008','SQL2008R2') and SVR_status='running' --select * from dbadata.dbo.dba_all_servers SELECT @minrow = MIN(id)FROM @spaceinfo SELECT @maxrow = MAX(id) FROM @spaceinfo while (@minrow <=@maxrow) begin BEGIN TRY select @Server_name=Servername , @Desc=Description from @spaceinfo where ID = @minrow set @sql= 'EXEC(''SELECT * from OPENQUERY(['+@server_name+'], ''''select '''''''''+@server_name+''''''''',name,role_desc,operational_state_desc,recovery_health_desc, synchronization_health_desc,getdate() from sys.dm_hadr_availability_replica_cluster_states a join sys.dm_hadr_availability_replica_states b on a.group_id =b.group_id join sys.availability_groups_cluster c on b.group_id =c.group_id where b.synchronization_health_desc<>''''''''HEALTHY'''''''' '''')'') ' insert into dbadata.dbo.tbl_alwayson_monitoring exec(@sql) --SELECT @sql end try BEGIN CATCH SELECT @SERVER_NAME,ERROR_NUMBER() AS ErrorNumber,ERROR_MESSAGE() AS ErrorMessage; insert into tbl_Error_handling SELECT @SERVER_NAME,'AlwaysON',[Error_Line] = ERROR_LINE(),[Error_Number] = ERROR_NUMBER(), [Error_Severity] = ERROR_SEVERITY(),[Error_State] = ERROR_STATE(), [Error_Message] = ERROR_MESSAGE(),GETDATE() END CATCH set @minrow =@minrow +1 end ---------------------------------------------------------------- --Send an email to DBA team ----------------------------------------------------------------- DECLARE @servername varchar(100) DECLARE @Replica_servername varchar(100) DECLARE @group_name varchar(100) DECLARE @health_Status varchar(100) DECLARE @Role varchar(100) --SELECT * FROM dbadata.dbo.tbl_alwayson_monitoring IF EXISTS ( SELECT 1 FROM dbadata.dbo.tbl_alwayson_monitoring where synchronization_health_desc<>'HEALTHY' ) begin --DECLARE @Replica_servername varchar(100) SELECT @Replica_servername=replica_server_name FROM DBAdata_Archive.dbo.tbl_alwayson_monitoring where synchronization_health_desc<>'HEALTHY' set @Replica_servername=@Replica_servername --select @Replica_servername exec usp_SpServerDiagnostics_new @Replica_servername DECLARE HADR_CuR CURSOR FOR SELECT [Group_name],replica_server_name,synchronization_health_desc,role_desc FROM dbadata.dbo.tbl_alwayson_monitoring where synchronization_health_desc<>'HEALTHY' OPEN HADR_CuR FETCH NEXT FROM HADR_CuR INTO @group_name,@servername,@health_Status, @Role DECLARE @BODY1 VARCHAR(max) SET @BODY1= '<font size=2 color=#C35817 face=''verdana''><B>Followings are AlwaysON Status:</b> </font> <P> <font size=1 color=#FF00FF face=''verdana''> <Table border=5 width=1000 bgcolor=#ECE5B6 cellpadding=1 style="color:#7E2217;font-face:verdana;font-size:12px;"> <b> <tr bgcolor=#8A4117 align=center style="color:#FFFFFF;font-weight:bold"> <td width=600 color=white>Group Name</td> <td width=600 color=white>Server Name</td> <td width=600 color=white>Health State</td> <td width=600 color=white>Server Role</td> </b> </tr>' WHILE @@FETCH_STATUS=0 BEGIN SET @BODY1= @BODY1 +'<tr> <td>'+ISNULL(@group_name,' ')+'</td>'+ '<td align=center>'+ISNULL(@servername,' ')+'</td>'+ '<td align=center>'+ISNULL(@health_Status,' ')+'</td>'+ '<td align=center>'+ISNULL(@Role,' ')+'</td>' FETCH NEXT FROM HADR_CuR INTO @group_name,@servername,@health_Status, @Role END SET @BODY1=@BODY1+'</Table> </p> <p> <font style="color:#7E2217;font-face:verdana;font-size:9px;"> Generated on ' +convert(varchar(30),getdate(),100)+'. </BR> This is an auto generated mail by DBA Team. If you receive this email by mistake please contact us. </br> © Property of DBA Team. </font>' CLOSE HADR_CuR DEALLOCATE HADR_CuR DECLARE @EMAILIDS VARCHAR(500) SELECT @EMAILIDS= COALESCE(@EMAILIDS+';','')+EMAIL_ADDRESS FROM DBADATA.dbo.DBA_ALL_OPERATORS WHERE name ='muthu' and STATUS =1 DECLARE @EMAILIDS1 VARCHAR(500) SELECT @EMAILIDS1= 'dba@abcd.com' EXEC MSDB.DBO.SP_SEND_DBMAIL @RECIPIENTS=@EMAILIDS, @SUBJECT = 'DBA: AlwaysOn Staus', @BODY = @BODY1, @copy_recipients=@EMAILIDS1, @BODY_FORMAT = 'HTML' ,@PROFILE_NAME='muthu'; --select @BODY1 ------------------------------------------------------- end insert into DBAdata_Archive.dbo.tbl_alwayson_monitoring select * from tbl_alwayson_monitoring END --select * from DBAdata_Archive.dbo.tbl_alwayson_monitoring
Image: