Failover manuale

Microsoft.SQLServer.2012.AlwaysOn.ManualFailoverForAvailabilityReplica (ConsoleTask)

Aprire la console SQLPS ed eseguire il failover nella replica di disponibilità di destinazione in modo che quest'ultima diventi la nuova replica primaria del gruppo di disponibilità.

Element properties:

TargetMicrosoft.SQLServer.2012.AlwaysOn.AvailabilityReplica
Applicationpowershell.exe
WorkingDirectory
isRequireOutputFalse
AccessibilityInternal
EnabledTrue

Source Code:

<ConsoleTask ID="Microsoft.SQLServer.2012.AlwaysOn.ManualFailoverForAvailabilityReplica" Accessibility="Internal" Target="AlwaysOnDisc!Microsoft.SQLServer.2012.AlwaysOn.AvailabilityReplica" RequireOutput="false" Category="MonitoringObject">
<Application>powershell.exe</Application>
<Parameters>
<Parameter>-Version 2 -NoExit -NoLogo -NoProfile -Command Invoke-Command {$l = 0;$ag='$Target/Property[Type="AlwaysOnDisc!Microsoft.SQLServer.2012.AlwaysOn.AvailabilityReplica"]/AvailabilityGroupName$';
$l = 0;$serverName = '$Target/Property[Type="System!System.Entity"]/DisplayName$';
$l = 0;$dbReplicaName = ([regex]::Replace('$Target/Property[Type="System!System.Entity"]/DisplayName$', '\\', '%5C'));
#AlwaysOnCommon.ps1

#Extracts computer address from Sql Mirroring endpoint Uri
#Uri format: TCP://&lt;system-address&gt;:&lt;port&gt;
function GetAddressFromUri{
param(
[string] $uri
)
$match = [regex]::Match($uri, '^TCP://(?:(?&lt;address&gt;[^:/]+)|(?:\[(?&lt;address&gt;[^/\]]+\]))):\d{1,5}$', 'IgnoreCase')
if(!$match.Success){
throw 'Provided URI is in incorrect format'
}
return $match.Groups['address'].Value
}

#Get FQDN of machine
#We have to use WMI instead of using DNS
#because we often deal with NetBios host names and Sql Server mirroring endpoint Urls
#and in these cases DNS may fail or returned name may be not FQDN
function GetFQDN{
param(
[Parameter(Mandatory=$true)]
[string] $computerName
)
$comp = Get-WmiObject -ComputerName $computerName -Class 'Win32_ComputerSystem' -ErrorAction Stop | Select -First 1

if($comp.Domain -eq ''){
return $comp.DNSHostName
}
return $comp.DNSHostName + '.' + $comp.Domain
}

function GetFQDNEx{
param(
[Parameter(Mandatory=$true)]
[string] $compAddress
)
$statePath = 'SQLMPSP1\SqlHostNames'
$fqdnValueName = (EscapeCacheValueName $compAddress) + '_fqdn'
$cacheExpirationTime = 7200

$fqdn = TryGetValueFromCache $statePath $hostValueName $cacheExpirationTime

if(![string]::IsNullOrEmpty($fqdn)){
return $fqdn
}

$fqdn = GetFQDN $compAddress

PutValueToCache $statePath $fqdnValueName $fqdn | Out-Null

return $fqdn
}

function GetEmptyNonSnapshotData($api, $mE, $tID) {
$discoveryData = $api.CreateDiscoveryData(0, $mE, $tID)
$discoveryData.IsSnapshot = $false
return $discoveryData
}

function ImportModuleActionSqlModules($arAssemblies){
$paths = @(
(get-itemproperty -path 'hklm:\Software\Microsoft\Microsoft SQL Server\110\Tools\ClientSetup\' | Select SQLPath).SQLPath ,
(get-itemproperty -path 'hklm:\Software\Wow6432Node\Microsoft\Microsoft SQL Server\110\Tools\ClientSetup\' | Select SQLPath).SQLPath )

if (!(ImportSQLModules $arAssemblies $paths '110\Tools')) {
Import-Module SQLPS -ErrorAction SilentlyContinue -WarningAction SilentlyContinue | Out-Null
if(!(IsModuleLoaded 'SQLPS'))
{
throw 'Unable to load SQLPS modules'
}
}
}

function IsModuleLoaded([string]$include) {
$modules = Get-Module
foreach($module in $modules){
if($module.Name.Contains($include)) {
return $true
}
}
return $false
}

function ImportSQLModules {
param (
$arAssemblies,
$paths,
[string]$include)

$flRet = $false
foreach($path in $paths){
if($path.Contains($include)){
foreach($assemblyName in $arAssemblies){
$filename = $path + $assemblyName
if(Test-Path $filename){
Import-Module $filename -ErrorAction SilentlyContinue -WarningAction SilentlyContinue | Out-Null
$flRet = $true;
}
}
}
}
return $flRet
}

#AlwaysOnTaskCommon.ps1

#Depends on:
# AlwaysOnCommon.ps1

$arAssemblies = @(,'\PowerShell\Modules\SQLPS\SQLPS.psd1');
ImportModuleActionSqlModules $arAssemblies

function p{
param($v)
if ($v -ilike '*\*') { return $v } else { return '{0}\DEFAULT' -f $v }
}


$rp = ('{0}' -f (p($serverName)));
cd ('sqlserver:\SQL\{0}\AvailabilityGroups\{1}\AvailabilityReplicas\{2}\' -f $rp, $ag, $dbReplicaName);
$avg = (Get-Item ('..\..\..\{0}' -f $ag));
try{ Switch-SqlAvailabilityGroup -InputObject $avg -Confirm; }
catch { Write-Host -ForegroundColor Red $_.Exception.Message; }
Write-Host "Press any key to exit...";
$key=[Console]::ReadKey($true);}</Parameter>
</Parameters>
<WorkingDirectory/>
</ConsoleTask>