Olá comunidade!
Eu trago aqui uma dica para poupar algumas horas do seu dia. A documentação InterSystems especifica muito bem como criar um script de freeze para as instâncias, mas não traz exemplos em instâncias espelhadas, onde queremos deixar o script automático, mas só rodar efetivamente na instância primária.
Primeiro, vamos criar uma classe abstrata no namespace %SYS com métodos que verificam se a instância é primária e, caso positivo, executam o freeze.
Class User.custom.FreezeThaw.Script [ Abstract ]
{
ClassMethod FreezeIfPrimary() As %Status
{
Set tSC = $$$OK
Try
{
If ##class(%SYSTEM.Mirror).IsPrimary()
{
Set tSC = ##class(Backup.General).ExternalFreeze()
}
}
Catch Exception
{
Set tSC = Exception.AsStatus()
}
Quit tSC
}
}
ObjectScriptObjectScript
Agora, escrevemos em um arquivo o script para congelar se for primária. Vou deixar esse arquivo no caminho /opt/script/, onde será criado um log:
#!/bin/bash
# variables used for returning the status
success=0
error=1
warning=2
status=$success
log_path="/opt/script/freezescript.log"
echo "`date` Logs:\n" >> $log_path
instance="IRISDB02"
# IRIS
iris session $instance -U%SYS "##Class(User.custom.FreezeThaw.Script).FreezeIfPrimary()"
status=$?
if [ $status -eq 0 ]; then
echo "$instance IS FROZEN"
printf "$instance IS FROZEN\n" >> $log_path
else
echo "$instance FREEZE FAILED"
printf "$instance FREEZE FAILED\n" >> $log_path
status=$error
iris session $instance -U%SYS "##Class(User.custom.FreezeThaw.Script).ThawIfPrimary()" >> $log_path
fi
BashBash
Finalmente, podemos escrever o método de descongelamento
ClassMethod ThawIfPrimary() As %Status
{
Set tSC = $$$OK
Try
{
If ##class(%SYSTEM.Mirror).IsPrimary()
{
Set tSC = ##class(Backup.General).ExternalThaw()
}
}
Catch Exception
{
Set tSC = Exception.AsStatus()
}
Quit tSC
}
ObjectScriptObjectScript
E é claro, no mesmo caminho, criamos um script para o descongelamento:
#!/bin/bash
# variables used for returning the status
success=0
error=1
warning=2
status=$success
log_path="/opt/script/freezescript.log"
instance="IRISDB02"
# IRIS
iris session $instance -U%SYS "##Class(User.custom.FreezeThaw.Script).ThawIfPrimary()" >> $log_path
status=$?
if [ $status -eq 0 ]; then
echo "SYSTEM IS UNFROZEN"
printf "`date` SYSTEM IS UNFROZEN\n" >> $log_path
else
echo "SYSTEM UNFREEZE FAILED"
printf "SYSTEM UNFREEZE FAILED\n" >> $log_path
status=$error
fi
BashBash
É isto! Estão prontos seus scripts para executar snapshot sem problemas.
Obrigada por ler e sinta-se à vontade para compartilhar ideias e dúvidas nos comentários.