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.