Artículo
Mario Sanchez Macias · Sep 3 Lectura de 3 min

Errores en el script de freeze/thaw para copias de seguridad de VMWare (y similares)

Hola a todos.

Me encontré con algunos problemas cuando configuré los scripts por lotes de freeze/thaw para usarlos con VMWare en un ecosistema de Windows, y quería compartir lo que encontré por si pudiera ayudar a otros. Esto se llevó a cabo en un entorno que utiliza HealthConnect 2019.1.x.

IRIS no se ejecutó (2)

Parece que el script de ejemplo de la documentación, en mi caso, me indicaba que el entorno no se estaba ejecutando (a pesar de que se estaba ejecutando). Para corregir esto, proporcioné la ruta de acceso a la ubicación de Mgr, de la siguiente forma:

c:\InterSystems\HealthConnect\bin\irisdb -s"C:\InterSystems\HealthConnect\Mgr" -U%%SYS ##Class(Backup.General).ExternalFreeze() <C:\InterSystems\BackupScripts\login.scr

Esto podría deberse a que tenía más de un equipo de HealthConnect en este entorno, sin embargo, persistió después de que se desinstaló la otra instancia y se reinició.

Script en ejecución

El segundo problema al que me enfrenté fue el de conseguir que los scripts se ejecutaran cuando se realizaba la copia de seguridad. Después de investigar un poco, descubrí que VMWare ejecutará todos los scripts en la carpeta "C:\Program Files\VMware\VMware Tools\backupScripts.d" en orden alfabético usando el comando "freeze", y después ejecutará cada script en orden inverso usando el comando "thaw". En mi caso, necesitaba crear esta carpeta dentro del directorio "VMWare Tools".

Para evitar gestionar varios archivos y restringir qué comando se puede ejecutar contra ellos, combiné freeze y thaw en un solo script, y añadí una sentencia "if" al inicio del único archivo batch para dirigirlo a freeze y thaw:

if "%1" == "freeze" goto doFreeze
if "%1" == "thaw" goto doThaw

Niveles de error en el Script

Si el freeze acaba con éxtio, irisdb.exe devolverá el nivel de error como 5. Sin embargo, VMWare (y algunos otros) leerán una respuesta distinta de cero como un error. Por lo tanto, necesitaba sobrescribir el código de salida dependiendo de la respuesta en el nivel de error, ya que de lo contrario se detiene la ejecución de la copia de seguridad inactiva:

:FreezeOK
echo SYSTEM IS FROZEN
rem Error levels from freeze do not match standard convention, so we return 0 when successful.
EXIT /b 0

:FreezeFAIL
echo SYSTEM FREEZE FAILED
EXIT /b 1

Nota: utilicé 1 para el error simplemente porque era distinto de cero.

Resultado final

Al juntar todo esto, obtuve lo siguiente:

@echo off
rem VMTools should pass in either freeze or thaw.
if "%1" == "freeze" goto doFreeze
if "%1" == "thaw" goto doThaw

echo Nothing Matched. Exiting...
EXIT /b

:doFreeze
rem Call external freeze and provide credential file stored in separate folder.
c:\InterSystems\HealthConnect\bin\irisdb -s"C:\InterSystems\HealthConnect\Mgr" -U%%SYS ##Class(Backup.General).ExternalFreeze() <C:\InterSystems\BackupScripts\login.scr
rem note that we need to check errorlevel from highest to lowest here....
if errorlevel 5 goto FreezeOK
if errorlevel 3 goto FreezeFAIL
rem If here, errorlevel did not match an expected output.
rem Assume Failure.
echo errorlevel returned unexpected value
goto FreezeFAIL

:FreezeOK
echo SYSTEM IS FROZEN
rem Error levels from freeze do not match standard convention, so we return 0 when successful.
EXIT /b 0

:FreezeFAIL
echo SYSTEM FREEZE FAILED
EXIT /b 1

:doThaw
c:\InterSystems\HealthConnect\bin\irisdb -s"C:\InterSystems\HealthConnect\Mgr" -U%%SYS ##Class(Backup.General).ExternalThaw()
EXIT /b 0

Mejoras/Siguientes pasos

El bloque doThaw es bastante débil ya que asume el éxito, y esto podría ser una buena oportunidad para escribir a un log de registro y anotar cualquier fallo. Además, añadiría una llamada a ##Class(Backup.General).ExternalSetHistory() para asegurar que el entorno registra correctamente cuándo se realizaron las copias de seguridad y se activaron las purgas de journal.

00
2 0 0 23
Log in or sign up to continue