Dans le cadre d’un portage de règle de supervision, les trois scripts ci-dessous ont été crées pour remonter l’état de:
– Un Availability Group
– Un Availability Replica
– Un Database Replica
En pratique ils utilisent a peu près la même requête SQL. Ils contiennent des éléments propre a l’api scom mais peuvent bien sur être adapté pour être utilisé indépendamment.
Ci-dessous les 3 scripts et l’exemple du code du premier, Check_SQL_AO_AvailabilityGroupStatus_Query_Version.ps1.
#
#
# Script: SQLAlwaysOnAvailGroupStatus.ps1
# Purpose: Shows AlwaysOn Availability Group Status
#
# Parameters:
# $DBServer: ShortName of DB Server
# $InstanceFullName: Name of SQL Instance
# $AvailGroupName: Availability Group Name
#
#
######################################################################################## param (
$Arguments,
[string]$DBServer,
[string]$InstanceFullName,
[string]$AvailGroupName
) # Create local variables from override value
.([Scriptblock]::Create($Arguments)) $Scriptname = « SQLAlwaysOnAvailabilityReplicaStatus.ps1 » # Name of Instance
$ServerInstance = $InstanceFullName.Split(‘\’)[1]
    #Determine TcpPort Used for Instance
    try
    {
    $TcpPort = Get-ItemProperty « HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11.$ServerInstance\MSSQLServer\SuperSocketNetLib\Tcp\IpAll » | select TcpPort -exp tcpport
    }
    catch
    {
    $Message = « Error during Retrieve of TCP Port Used – Check the execution of the script »
    write-host -f Yellow $Message
    $PropertyBag.AddValue(« State », »WARNING »)
    $PropertyBag.AddValue(« Message »,$Message)
    $PropertyBag.AddValue(« ReplicaName »,$AvailabilityReplicaName)
    $PropertyBag
    Exit 1
    }
# Scom Object and Property Bag
$api = New-Object -comObject “MOM.ScriptAPI”  
$PropertyBag = $api.CreatePropertyBag() 
# Function  GetAODBRepStatus
Function GetAOAvailGroupStatus
                        {
                        param(
                                    [string]$TargetComputer=$DBServer,
                                    $global:Source = « $DBServer\$ServerInstance »,
                                    [string]$sqlCommand = 
                                            $(« 
                                            SELECT 
                                            
                                            AO_AG.name as AvailGroupName
                                            ,HADR_AO_AGS.synchronization_health as AvailGroup_SyncHealth
                                            ,HADR_AO_AGS.synchronization_health_desc as AvailGroup_SyncHealth_Desc
                                            –,SYSDB.name as DBName
                                            
                                            –,AO_AVREP.replica_server_name
                                            –,HADR_AVAIL_REP_STATE.synchronization_health as AvailReplica_SyncHealth
                                            
                                            –,HADR_AVAIL_REP_STATE.synchronization_health_desc as AvailReplica_SyncHealth_Desc
                                            –,HADR_DB_REP_STATE.synchronization_state as DBReplica_SyncState
                                            –,HADR_DB_REP_STATE.synchronization_state_desc as DBReplica_SyncState_Desc
                                            –,HADR_DB_REP_STATE.synchronization_health_desc as DBReplica_SyncHealth_Desc
                                            
                                            FROM
                                            [sys].[availability_databases_cluster] AO_DB_CLUS
                                            –INNER JOIN sys.databases SYSDB on CAST(SYSDB.group_database_id AS VARCHAR(50)) =  CAST(AO_DB_CLUS.group_database_id AS VARCHAR(50))
                                            INNER JOIN sys.dm_hadr_database_replica_states HADR_DB_REP_STATE on CAST(HADR_DB_REP_STATE.group_database_id AS VARCHAR(50)) = CAST(AO_DB_CLUS.group_database_id AS VARCHAR(50))
                                            –INNER JOIN sys.dm_hadr_availability_replica_states HADR_AVAIL_REP_STATE on HADR_AVAIL_REP_STATE.group_id = HADR_DB_REP_STATE.group_id
                                            INNER JOIN sys.availability_groups AO_AG on AO_AG.group_id = HADR_DB_REP_STATE.group_id
                                            INNER JOIN sys.dm_hadr_availability_group_states HADR_AO_AGS on HADR_AO_AGS.group_id = AO_AG.group_id
                                            –INNER JOIN [sys].[availability_replicas] AO_AVREP on AO_AVREP.replica_id = HADR_DB_REP_STATE.replica_id
                                            WHERE AO_AG.name = ‘
GROUP BY
AO_AG.name
,HADR_AO_AGS.synchronization_health
,HADR_AO_AGS.synchronization_health_desc
«
)
)
                               Try
                               {
                                                                                            
                                                
                                            $global:connectionString = « Data Source=$Source,$TcpPort; » +
                                            « Integrated Security=SSPI;  » +
                                            « Initial Catalog=master »
                                            
                                            $connection = new-object system.data.SqlClient.SQLConnection($connectionString)
                                            
                                
                                                                
                                            $connection.Open()
                                                                                  
                                                                               
$command = new-object system.data.sqlclient.sqlcommand($sqlCommand,$connection)
                                }
                                catch
                                {
                                write-host -F Red $(« Error during sql connection – check the credentials used »).ToUpper()
                                #exit 1
                                }
                                $adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command
                                $set = New-Object System.Data.DataSet
                                $adapter.Fill($Set) | Out-Null
                                $connection.Close()
                                $Set.Tables
}
# Execute function and get data
try
{
[array]$AvailGroup = GetAOAvailGroupStatus
}
catch
{
$Message = « WARNING – Error during Connection to master database or execution of sql query »
write-host -F Yellow $Message
$PropertyBag.AddValue(« State », »WARNING »)
$PropertyBag.AddValue(« Message »,$Message)
$PropertyBag.AddValue(« DBServer »,$DBServer)
$PropertyBag.AddValue(« connectstring »,$connectionString)
$PropertyBag.AddValue(« AvailGroupName »,$AvailGroupName)
$PropertyBag.AddValue(« AvailGroupStatus », »no_data »)
$PropertyBag
exit 1
}
if (!($AvailGroup))
{
$Message = « WARNING – Error – No Availability Group have been found »
write-host -F Yellow $Message
$PropertyBag.AddValue(« State », »WARNING »)
$PropertyBag.AddValue(« Message »,$Message)
$PropertyBag.AddValue(« DBServer »,$DBServer)
$PropertyBag.AddValue(« AvailGroupName », »no_data »)
$PropertyBag.AddValue(« AvailGroupStatus », »no_data »)
$PropertyBag
exit 1
}
try
{
$AvailGroupState = $AvailGroup  | select AvailGroup_SyncHealth_Desc -ExpandProperty AvailGroup_SyncHealth_Desc
}
catch
{
$Message = « Error during Retrieve of Availability Group State »
Write-Host -ForegroundColor Yellow $Message
$PropertyBag.AddValue(« State », »WARNING »)
$PropertyBag.AddValue(« Message »,$Message)
$PropertyBag.AddValue(« DBServer »,$DBServer) 
$PropertyBag.AddValue(« AvailGroupName »,$AvailGroupName)
$PropertyBag.AddValue(« AvailGroupStatus », »no_data »)
$PropertyBag
exit 1
}
« AVAILABILITY GROUP: $AvailGroupName »
If ($AvailGroupState -eq « Healthy »)
        {
        $Message = « OK – Status of $AvailGroupName Availability Group is Healthy »
        write-host -f Green $Message
        $PropertyBag.AddValue(« State », »OK »)
        $PropertyBag.AddValue(« Message »,$Message)
        $PropertyBag.AddValue(« DBServer »,$DBServer) 
        $PropertyBag.AddValue(« AvailGroupName »,$AvailGroupName)
        $PropertyBag.AddValue(« AvailGroupStatus », »Healthy »)
        $PropertyBag
        Exit 0
        }
        
ElseIf ($AvailGroupState -eq « Error »)
    
        {
        $Message = « CRITICAL – Status of $AvailGroupName Availability Group is Error »
        write-host -f Red $Message
        $PropertyBag.AddValue(« State », »CRITICAL »)
        $PropertyBag.AddValue(« Message »,$Message)
      $PropertyBag.AddValue(« DBServer »,$DBServer) 
        $PropertyBag.AddValue(« AvailGroupName »,$AvailGroupName)
        $PropertyBag.AddValue(« AvailGroupStatus », »Error »)
        $PropertyBag
        Exit 0
        }
        
 Else   {
        $Message = « WARNING – Status of $AvailGroupName Availability Group cannot be determined »
        write-host -f yellow $Message
        $PropertyBag.AddValue(« State », »WARNING »)
        $PropertyBag.AddValue(« Message »,$Message)
      $PropertyBag.AddValue(« DBServer »,$DBServer) 
        $PropertyBag.AddValue(« AvailGroupName »,$AvailGroupName)
        $PropertyBag.AddValue(« AvailGroupStatus », »no_data »)
        $PropertyBag
        Exit 1
        }
 
 

0 commentaires