Cómo sincronizar automáticamente los datos en dos bases de datos SQL Server en un programa

Desafío

Es a menudo necesario tener una manera de sincronizar datos entre bases de datos SQL en tiempo real, por ejemplo, cuando un cierto dato es cambiado/añadido en un lugar (base de datos) a ser sincronizado con otra base de datos. Los cambios necesitan ser detectados automáticamente en un programa, y sincronizados automáticamente con otra base de datos. Este proceso debería ser completamente automatizado y correr sin supervisión.

Solución

ApexSQL Data Diff es una herramienta de terceros para comparar datos entre bases de datos SQL, copias de seguridad y proyectos de control de versiones. Puede ser programado para correr en un tiempo/fecha específicos para mantener las bases de datos en sincronización casi en tiempo real. Por ejemplo, programémoslo para realizar la comparación cada 15 minutos, y si hay algunas diferencias entre las bases de datos, una sincronización será ejecutada. De esta manera, mantendremos las bases de datos en sincronización, casi en tiempo real.

Para configurar este proceso, siga estos pasos:

  1. Ejecute ApexSQL Data Diff

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

  3. Vaya a la pestaña Options si hay la necesidad de establecer una opción específica de comparación o sincronización.

  4. Haga clic en el botón Compare en la esquina inferior derecha para iniciar el proceso de comparación.

  5. Una vez que el proceso de comparación es finalizado, los resultados de la comparación serán mostrados en la cuadrícula de resultados (Results):

  6. Seleccione todos los objetos con las filas correspondientes y haga clic en el botón Save desde la pestaña Home:

    El archivo de proyecto grabado contiene todas las opciones seleccionadas y los objetos/filas que serán usados para programar la sincronización de datos.

  7. Una vez que el proyecto es grabado, haga clic en el botón Synchronize desde la pestaña Home para iniciar el asistente de Sincronización.

  8. Elija la acción Sychronize now, de modo que la sincronización sea realizada directamente en la base de datos destino (Central):

  9. En el último paso del asistente de Sincronización, haga clic en el botón Synchronize en la esquina inferior derecha.

  10. Una vez que el proceso de sincronización es finalizado, la ventana Results será mostrada con información de si la sincronización fue exitosa o no:

Automatizando el proceso

Ahora que la sincronización inicial fue realizada con ApexSQL Data Diff y el archivo del proyecto fue grabado, podemos fácilmente automatizar el proceso creando un script PowerShell.

Configuración y mantenimiento

Lo primero es crear una función que verificará la existencia de la carpeta Output, donde el resumen de los datos con marcas de tiempo será grabado. Queremos asegurarnos de mantener un registro de aplicaciones fácil de buscar y con marcas de tiempo para cada sincronización, en caso de que tengamos que resolver problemas:

#checks the existence of Outputs folder and creates it if it is not created
and returns the path
function CheckAndCreateFolder($rootFolder, [switch]$Outputs) { $location = $rootFolder #set the location based on the used switch if($Outputs -eq $true) { $location += "\Outputs" } #create the folder if it doesn't exist and return its path if(-not (Test-Path $location)) { mkdir $location -Force:$true -Confirm:$false | Out-Null } return $location }

Luego, definamos una carpeta raíz y una localización para el resumen con marca de tiempo:

#root folder for the whole process
$rootFolder = "DataSync"

#location for the output files 
$outputsLocation   = CheckAndCreateFolder $rootFolder -Outputs

Variables e interruptores

En esta sección, la localización de la aplicación es definida junto con la variable de marca de datos y la variable para los parámetros de la aplicación que contienen un archivo de proyecto, grabado, el interruptor /sync (para la sincronización directa en la base de datos destino), el interruptor /rece para retornar 102 – No differences detected (cuando las fuentes de datos son iguales) y un resumen con marca de tiempo:

#provide tool’s location, define date stamp variable, and tool’s parameters 
$toolLocation   = "ApexSQLDataDiff"
$dateStamp = (Get-Date -Format "MMddyyyy_HHMMss") 
$toolParameters = "/pr:""MyProject.axdd"" 
/out:
""$outputsLocation\DataOutput_$dateStamp.txt"" /sync /v /f /rece"

Ejecución

La siguiente parte del script PowerShell llamará a ApexSQL Data Diff desde su localización junto con sus parámetros, y la variable para el código de retorno es definida:

#initiate the comparison of data sources
(Invoke-Expression ("& `"" + $toolLocation +"`" " +$toolParameters))
$returnCode = $LASTEXITCODE

La última parte es para definir los tres resultados potenciales:

  1. Hay diferencias, se retorna un código 0 – Success
  2. No hay diferencias, se retorna un código 102 – No differences detected
  3. Un error ocurrió y el resumen de salida será abierto. Revise la lista de códigos de error retornados aqui
#write output to file
"$outputsLocation\DataOutput_$dateStamp.txt"


#differences detected
if($returnCode -eq 0)
{
"`r`n $LASTEXITCODE - Changes were successfully synchronized" >> 

}
else
{
    #no changes were detected
    if($returnCode -ne 102)
    {
"`r`n $LASTEXITCODE - No changes were detected. Job aborted" >> 
    }
    #an error occurred
    else
    {
    "`r`n $LASTEXITCODE - An error occurred" >> 
	
    #opens output file at the end of application execution on error
    Invoke-Item "$outputsLocation\DataOutput_$stamp.txt"
    }

}

Programación

Ahora que el trabajo ha sido automatizado, puede ser programado en una de cuatro diferentes maneras. Conozca más del artículo acerca de maneras de programar las herramientas de ApexSQL.

Revisando resultados

Una vez que todo está funcionando, el resumen de salida puede ser revisado en cualquier momento. En este ejemplo, los archivos de salida son definidos por la variable $outputsLocation definida aqui y los archivos de salida serán grabados en $rootFolder\$outputsLocation, en este caso DataSync\Outputs:

Si un error ocurre, por ejemplo, si el interruptor /f fue omitido junto con el nombre y la ruta del script de sincronización, lo siguiente será mostrado en el resumen de salida:

Connecting:
        Loading project
        Connecting to [(local)].[Workspace]
        Connection successful
        Connecting to [(local)].[Central]
        Connection successful
The file sync.sql already exists. Use the '/f' switch to overwrite it

ApexSQL Data Diff return error code: 16

Una revisión rápida del artículo en este enlace provee información acerca del código de error 16, que representa un error de IO, y significa que la aplicación intentó escribir a un archivo (el script de sincronización, en este caso), pero este ya existe, y para sobrescribirlo, el interruptor /f necesita ser usado.

Descargue el script PowerShell completo aquí.

julio 22, 2017