Script de Freeze em servidores espelhados
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 = $$$OKTry
{
If##class(%SYSTEM.Mirror).IsPrimary()
{
Set tSC = ##class(Backup.General).ExternalFreeze()
}
}
Catch Exception
{
Set tSC = Exception.AsStatus()
}
Quit tSC
}
}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 ]; thenecho"$instance IS FROZEN"printf"$instance IS FROZEN\n" >> $log_pathelseecho"$instance FREEZE FAILED"printf"$instance FREEZE FAILED\n" >> $log_path
status=$error
iris session $instance -U%SYS "##Class(User.custom.FreezeThaw.Script).ThawIfPrimary()" >> $log_pathfiFinalmente, podemos escrever o método de descongelamento
ClassMethod ThawIfPrimary() As%Status
{
Set tSC = $$$OKTry
{
If##class(%SYSTEM.Mirror).IsPrimary()
{
Set tSC = ##class(Backup.General).ExternalThaw()
}
}
Catch Exception
{
Set tSC = Exception.AsStatus()
}
Quit tSC
}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 ]; thenecho"SYSTEM IS UNFROZEN"printf"`date` SYSTEM IS UNFROZEN\n" >> $log_pathelseecho"SYSTEM UNFREEZE FAILED"printf"SYSTEM UNFREEZE FAILED\n" >> $log_path
status=$errorfiÉ 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.