Escrito por

Analista Desenvolvedora Jr at Bridger
Artigo Heloisa Paiva · Out. 10, 2024 2m read

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_pathfi

Finalmente, 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.