sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo automatizar el proceso de sincronización de esquemas de bases de datos de SQL Server

La meta

Mantener dos bases de datos sincronizadas es una tarea que a menudo encontramos cuando trabajamos en el desarrollo y mantenimiento de bases de datos SQL. Un caso particular es este:las versiones de una base de datos presente en los entornos de prueba y desarrollo deben sincronizarse constantemente para asegurarse de que las pruebas se ejecuten en la versión más reciente. Esto debe hacerse detectando los cambios de esquema en la versión de desarrollo de una base de datos y luego sincronizándolos automáticamente con la versión del entorno de prueba de forma programada.

Cómo lograrlo

Veremos cómo se puede lograr la sincronización automatizada de dos bases de datos SQL al combinar una herramienta de comparación de esquemas con secuencias de comandos y programación de PowerShell.

En el ejemplo que vamos a ver, las bases de datos se sincronizarán cada 15 minutos. Como estamos usando una herramienta de comparación de esquemas, podemos estar seguros de que la base de datos solo se actualizará si hay algunos cambios reales entre las versiones de desarrollo y prueba de la base de datos; esto evita la ejecución de operaciones innecesarias con muchos recursos.

Usaremos Devart Schema Compare como la utilidad preferida para diferenciar y sincronizar las bases de datos de SQL Server. Es una herramienta que le permite comparar y sincronizar bases de datos, instantáneas y copias de seguridad de SQL Server en vivo. Veamos cómo podemos implementar nuestro proyecto a continuación.

Configuración

En primer lugar, tendremos que configurar algunas cosas:

  1. Ejecutar comparación de esquemas
  2. Haga clic en Nueva comparación de esquemas en la barra de herramientas o, alternativamente, en la parte superior derecha de la página de inicio:
  3. En el Origen y Destino pestaña de la Comparación de nuevos esquemas ventana, elija las bases de datos de origen y de destino deseadas:
  4. En las Opciones , Asignación de esquemasAsignación de tablas pestañas, puede configurar las opciones de comparación y sincronización necesarias:
  5. Cuando todo esté configurado, puede presionar el botón Comparar en la esquina inferior derecha para iniciar el proceso de comparación.
  6. Cuando finaliza la comparación, puede ver todos los objetos que se compararon y su respectivo estado de diferencia en la parte superior de la ventana, mientras que el script detallado para cada uno de esos objetos se ubicará en la parte inferior:
  7. Marque todos los objetos para incluirlos en el proceso de sincronización y haga clic en Guardar o presione Archivo> Guardar :Esto guardará el proyecto con toda la información que necesitamos para iniciar el proceso de sincronización.
  8. Una vez guardado el proyecto, haga clic en 'Sincronizar objetos ' botón:
  9. Asistente de sincronización de esquemas será abierto. Primero, seleccione 'Ejecutar el script directamente contra la base de datos de destino ' en la Salida pestaña:
  10. Puede elegir la configuración necesaria en las Opciones pestaña:
  11. Puede consultar todos los objetos que se van a sincronizar en el Resumen pestaña:
  12. Haga clic en Sincronizar en la esquina inferior derecha para probar el proceso de sincronización.
  13. Verá los resultados que se muestran en el panel inferior de la ventana:

Automatización del proceso

Como la sincronización del esquema fue exitosa y ahora que tenemos un archivo de proyecto con toda la información necesaria, automaticemos el proceso de sincronización usando un script de PowerShell.

En el siguiente ejemplo, se supone que utiliza la seguridad integrada, pero aún se puede acceder fácilmente a la base de datos almacenada y cifrada desde el archivo del proyecto, junto con las credenciales del repositorio.

Veremos algunas partes del proceso de creación de secuencias de comandos que pueden ser particularmente interesantes, pero siéntase libre de omitir esta sección para descargar y probar la secuencia de comandos terminada de inmediato.

Crear un guión

Primero, necesitaremos crear una función que verifique si existe la carpeta Salidas. El propósito de esta carpeta es almacenar resúmenes de confirmación con sello de datos. La función debería verse así:

#check if the Outputs folder exists
function CheckAndCreateFolder($rootFolder, [switch]$Outputs)
{
$location = $rootFolder

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

return $location
}

A continuación, definiremos la carpeta raíz y la ubicación de los resúmenes de salida del esquema:

#defining the root folder for the synchronization process
$rootFolder = "d:\temp\SchemaSync"

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

Ahora, necesitaremos definir la ubicación de Schema Compare, la variable del sello de fecha y los parámetros de la aplicación:

#Schema Compare location and the date stamp variable are defined, as well as  the tool’s parameters 
$diffLoc   = "C:\Program Files\Devart\dbForge Studio for SQL Server\dbforgesql.com"
$stamp = (Get-Date -Format "Mmddyyyy_HHMMss")

Con esto en su lugar, podemos establecer la ruta al archivo de registro de salida:

#output log file path
$logPath = "$outsLoc\SchemaOutput_$stamp.txt"
$Params = "/schemacompare /compfile:""D:\temp\SchemaSync\Project\AdventureWorksLTDvsAdventureWorksDW.scomp"" /log:""$logPath"""
$sync = " /sync"

A continuación, llamaremos a Schema Compare y dejaremos que ejecute sus parámetros de sincronización:

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

$message = ""

La parte final del guión servirá para definir todos los posibles resultados:

  1. Se detectan cambios en el esquema, código de retorno 0 – Correcto
  2. No se detectaron cambios de esquema, código de retorno 100– No se detectaron cambios de esquema
  3. Se encontró un error y se abrirá el resumen de salida.
if ($returnCode -notin (100, 101))
{ #an error is encountered
$logPath = "$outsLoc\SchemaOutput_error.txt"
       
$message >> $logPath
clear-content $logPath
$message = "`r`n $returnCode - An error is encountered"
       
#output file is opened when an error is encountered
Invoke-Item "$logPath"
}
else{
if ($returnCode -eq 101)
{
clear-content $logPath
(Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params+$sync))
$returnCode = $LASTEXITCODE
       
#schema changes are detected
}
if($returnCode -eq 0)
{
 $message = "`r`n $returnCode - Schema changes were successfully synchronized"
}
else
{
 #there are no schema changes
 if($returnCode -eq 100)
{
$message = "`r`n $returnCode - There are no schema changes. Job aborted"
}
}
}
$message >> $logPath

Programación

Con el script de PowerShell listo y el proceso automatizado, podemos programar esto de diferentes maneras, p. a través del Programador de Windows.

Ver resultados

Ahora que el trabajo programado está en funcionamiento, puede ver los resúmenes de salida del esquema en cualquier momento que lo necesite. En el ejemplo que acabamos de ver, la variable $outsLoc definió la ubicación de los resúmenes de salida del esquema. Como resultado, dichos resúmenes se guardarán en $rootFolder\$outsLoc; en este caso particular, SchemaSync\Outputs:

Si se encuentra algún error, p. la extensión de un archivo de proyecto se ingresa incorrectamente, el mensaje de error correspondiente se mostrará en el resumen de salida.

La lista de códigos de error devueltos nos ayudará a comprender mejor el error específico que encontramos.

[título expandido =”GUIÓN COMPLETO “]

#check if the Outputs folder exists
function CheckAndCreateFolder($rootFolder, [switch]$Outputs)
{
$location = $rootFolder

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

return $location
}

#defining the root folder for the synchronization process
$rootFolder = "d:\temp\SchemaSync"

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

#Schema Compare location and the date stamp variable are defined, as well as  the tool’s parameters 
$diffLoc = "C:\Program Files\Devart\dbForge Studio for SQL Server\dbforgesql.com"
$stamp = (Get-Date -Format "Mmddyyyy_HHMMss")

#output log file path
$logPath = "$outsLoc\SchemaOutput_$stamp.txt"
$Params = "/schemacompare /compfile:""D:\temp\SchemaSync\Project\AdventureWorksLTDvsAdventureWorksDW.scomp"" /log:""$logPath"""
$sync = " /sync"

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

$message = ""

if ($returnCode -notin (100, 101))
{ #an error is encountered
$logPath = "$outsLoc\SchemaOutput_error.txt"

$message >> $logPath
clear-content $logPath
$message = "`r`n $returnCode - An error is encountered"
       
#output file is opened when an error is encountered
Invoke-Item "$logPath"
}
else{
if ($returnCode -eq 101)
{
clear-content $logPath
(Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params+$sync))
$returnCode = $LASTEXITCODE
       
#schema changes are detected
}
if($returnCode -eq 0)
{
$message = "`r`n $returnCode - Schema changes were successfully synchronized"
}
else
{
#there are no schema changes
if($returnCode -eq 100)
{
$message = "`r`n $returnCode - There are no schema changes. Job aborted"
}
}
}
$message >> $logPath

[/expandir]

Si surge alguna pregunta o problema durante el proceso de configuración, no dude en contactarnos en cualquier momento en [email protected]