Cómo mantener dos esquemas de bases de datos SQL en sincronización

Desafío

Cuando se trabaja en el desarrollo de una base de datos, hay a veces un requerimiento para mantener las dos bases de datos en sincronización. Por ejemplo, usted tiene un ambiente de desarrollo y quiere sincronizar automáticamente los cambios con una base de datos de Control de Calidad frecuentemente, de modo que las pruebas puedan siempre correr en la versión más reciente. El mecanismo implementado debería manejar esto detectando un cambio específico en el esquema en la base de datos de Desarrollo (DEV) y sincronizando automáticamente con la base de datos de Control de Calidad (QA), sin supervisión y con un programa. El proceso completo debería correr sin supervisión y estar completamente automatizado, y las bases de datos serán actualizadas casi en tiempo real, dado que programaremos el proceso para que corra cada 15 minutos.

Solución

En este artículo, describiremos cómo un sistema, incluyendo una herramienta de comparación de esquemas de bases de datos SQL Server, junto con algo de PowerShell y un programador, puede mantener la base de datos QA en sincronía y actualizada y correr automáticamente y sin supervisión.

En este sistema, consultaremos las dos bases de datos cada 15 minutos. Dado que estamos usando una herramienta de comparación de esquemas de bases de datos SQL Server, podemos asegurar que sólo los objetos cambiados y actualizados están en sincronización y, si nada es cambiado, el trabajo volverá al estado “sleep” sin hacer nada, sólo para volver a activarse en 15 minutos.

Para nuestra herramienta de comparación de SQL Server, usaremos ApexSQL Diff. ApexSQL Diff es una herramienta de terceros para comparar y sincronizar esquemas entre bases de datos SQL Server, copias de seguridad, instantáneas de ApexSQL, carpetas de scripts y proyectos de control de versiones. El proceso de comparación y sincronización de fuentes de datos puede ser programado y correr en el tiempo/fecha deseados, de modo que las bases de datos se mantengan en sincronización, casi en tiempo real. En el siguiente ejemplo, programemos la herramienta de comparación para que corra cada 15 minutos, y la sincronización será realizada si hay cualquier cambio entre las bases de datos comparadas.

Configuración

Para configurar el proceso completo, siga estos pasos:

  1. 1Ejecute ApexSQL Diff

  2. Debajo de la pestaña Data sources de la ventana New Project, configure las bases de datos fuente y destino:

  3. Cámbiese a la pestaña Options, si opciones específicas de comparación/sincronización necesitan configurarse para asegurar una sincronización libre de errores, sin problemas de dependencia, elija las opciones de sincronización marcadas:

  4. Si todo está establecido, haga clic en el botón Compare desde la esquina inferior derecha, y el proceso de comparación comenzará.

  5. Después de que el proceso de comparación es finalizado, todos los cambios de esquema serán mostrado en la cuadrícula Results, y los cambios de esquema para cada objeto pueden ser revisados en el panel Script difference view:

  6. Una vez que todos los cambios son revisados, seleccione todos los objetos para el proceso de sincronización y haga clic en el botón Save de la pestaña Home:

    De esta manera, el archivo del proyecto es grabado y contiene todos los objetos y opciones seleccionados, y será usado después para programar la sincronización del esquema.

  7. Dado que todo está grabado, haga clic en el botón Synchronize desde la pestaña Home.

  8. En el paso Dependencies del asistente de Sincronización, los objetos dependientes pueden ser revisados:

  9. Seleccione la acción Synchronize now en el paso Output options del asistente de Sincronización, y todos los cambios de esquema serán ejecutados directamente en la base de datos destino:

  10. En el último paso del asistente de Sincronización, las acciones que serán realizadas en el proceso de sincronización son mostradas:

  11. Haga clic en el botón Synchronize en la esquina inferior derecha para iniciar el proceso de sincronización.

  12. Cuando el proceso de sincronización finalice, la ventana Results será mostrada con toda la información:

Automatizando el proceso

Ya que la primera sincronización de esquema fue exitosamente procesada y el archivo del proyecto con toda la información fue grabado, podemos continuar automatizando este proceso configurando un script PowerShell.

Nuestro ejemplo de automatización asumirá que usted está usando la seguridad Integrada, pero usted puede usar también fácilmente credenciales almacenadas y encriptadas de la base de datos y el repositorio desde el archivo del proyecto. Para aprender acerca de las opciones para manejar credenciales en el contexto de trabajos sin supervisión, por favor vea este artículo.

Las siguiente son sólo algunos vistazos del script PowerShell usado para automatizar este proceso, que puede que usted encuentre interesantes. De otra manera, usted puede saltar directamente a descargar el script (ver abajo) y probarlo en su ambiente.

Creemos una función que verificará la existencia de la carpeta Outputs, en la cual se grabarán los resúmenes de envíos con marca de tiempo:

#check for the existence of the Outputs folder
function CheckAndCreateFolder($rootFolder, [switch]$Outputs)
{
    $location = $rootFolder

    #setting up location 
    if($Outputs -eq $true)
    {
        $location += "\Outputs"
    }
   
    #if the folder doesn't exist it will be created
    if(-not (Test-Path $location))
    { mkdir $location -Force:$true -Confirm:$false | Out-Null }

    return $location
}

El siguiente paso será definir una carpeta raíz junto con la localización de los resúmenes de salidas de esquema con marca de tiempo:

#root folder for the schema sync process
$rootFolder = "SchemaSync"

#schema output summaries location 
$outsLoc = CheckAndCreateFolder $rootFolder -Outputs

Después de establecer todos los prerrequisitos, definamos la localización de ApexSQL Diff, la variable de marca de tiempo, los parámetros de la aplicación, y la variable de código de retorno:

#ApexSQL Diff location, date stamp variable is defined, along with tool’s parameters 
$diffLoc   = "ApexSQLDiff"
$stamp = (Get-Date -Format "MMddyyyy_HHMMss") 
$Params = "/pr:""MyProject.axds"" /out:""$outsLoc\SchemaOutput_$stamp.txt"" /sync /v /f" 
$returnCode = $LASTEXITCODE

La siguiente parte del script PowerShell es llamar a ApexSQL Diff y ejecutar sus parámetros:

#initiate the schema comparison and synchronization process
(Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params))

La última parte del script PowerShell es definir todos los resultados potenciales:

  1. Cambios de esquema son detectados, se puede usar el código 0 – Success

  2. No hay cambios de esquema, se puede usar el código 102 – No differences detected

  3. Un error es encontrado y el resumen de salida será abierto. La lista completa de errores potenciales puede ser revisada aqui

    #write output to file
    "$outsLoc\SchemaOutput_$dateStamp.txt"
    
    #schema changes are detected
    if($returnCode -eq 0)
    {
    "`r`n $returnCode - Schema changes were successfully synchronized" >> 
    
    }
    else
    {
        #there are no schema changes
        if($returnCode -eq 102)
        {
        "`r`n $returnCode - There are no schema changes. Job aborted" >> 
        }
        #an error is encountered
        else
        {
        "`r`n $returnCode - An error is encountered" >> 
    	
        #output file is opened when an error is encountered
        Invoke-Item "$outsLoc\SchemaOutput_$stamp.txt"
        }
    
    }
    

Programación

Una vez que el script PowerShell es creado y todo el proceso es automatizado, se puede programar en diferentes maneras. Encuentre más información acerca de las diferentes formas de programar herramientas ApexSQL.

Viendo los resultados

Después de que todo esté configurado y el trabajo haya sido ejecutado por un tiempo, los resúmenes de salidas de esquema pueden ser vistos en cualquier momento. En nuestro ejemplo, los resúmenes de salida de esquema fueron definidos con la variable $outsLoc que fue definida aquí, y cada resumen de salida de esquema será grabado en $rootFolder\$outsLoc, en este caso SchemaSync\Outputs:

Si un error es encontrado, por ejemplo, si el archivo del proyecto no es ingresado con la extensión apropiada (falta la letra “s” al final de la extensión del archivo del proyecto), el resumen de salida de esquema será abierto y lo siguiente será mostrado:

Connecting:
  Loading project

Specified project file “MyProject.axd” is not a valid project file for ApexSQL Diff

An error is encountered – ApexSQL Diff return error code: 10

Revisando la lista de códigos de error en este enlace por el código de error de retorno 10, obtenemos la información de que el archivo del proyecto no es válido debido a una extensión incorrecta/incompleta.

El script PowerShell completo puede ser descargado desde aqui.

Si usted tiene preguntas o problemas configurándolo o usándolo, por favor contáctenos a través de support@apexsql.com

julio 22, 2017