Tengo dos bases de datos de SQL Server. Uno es el cliente (aplicación de Windows) y el segundo está en el servidor. Quiero sincronizar estas dos bases de datos de vez en cuando (por ejemplo, ¡cada 2 minutos!).
He leído acerca de las diferentes formas de sincronización, como la replicación, la marca de tiempo, las tablas de registro que utilizan desencadenantes, Microsoft Sync Framework, etc.
En realidad, no me gusta usar un método de sincronización que podría ser un cuadro negro (como la replicación) porque no quiero que se bloqueen las tablas específicas de SQL Server mientras las estoy actualizando y sincronizando con el servidor.
¿Qué método crees que debería usar en tales circunstancias? Recuerde que cada varios minutos debo enviar varios cambios de tabla del cliente al servidor y buscar también dos cambios de tabla del servidor.
He encontrado un método extraño pero nuevo. ¿Es posible que registre todos los procedimientos almacenados ejecutados (para los preferidos específicos) en el cliente y los envíe con sus parámetros en un
.sql
archivo al servidor y los ejecute allí? Lo mismo sucederá en el servidor y se enviará al cliente. ¿Crees que este es un método simple pero útil o no?sugiérame algún enfoque útil si puede. Muchas gracias.
EDITAR: recuerde que esta es una sincronización en tiempo real y esto la hace especial. Significa que cuando el usuario del cliente está usando la tabla, el proceso de sincronización con el servidor debe ocurrir cada varios minutos, por lo que ninguna de las tablas debe estar bloqueada.
fuente
Respuestas:
Bueno, puede que no lo entienda, pero trato de responderlo.
Dijiste que necesitas una solución de alto rendimiento que se ejecute a menudo (mínimo los 2 minutos) y necesitas un buen enfoque que debería ser rápido sin bloqueo. Pero no quieres un sistema de caja negra.
En lugar de un sistema de caja negra, que se utiliza en millones de instalaciones con buenos resultados, ¿intenta inventar la rueda nuevamente y construir su propia solución? Hm, suena un poco raro.
De hecho, estas son mis sugerencias.
ISOLATION LEVEL
enREAD_COMMITTED_SNAPSHOT
. Puedes leer más sobre esto aquí . Esto usará una parte de su tempdb, pero su tabla siempre es de lectura y escritura y la replicación puede funcionar en segundo plano.Vea el siguiente ejemplo:
CDC
puede ser algo frágil en algunas circunstancias.CDC
capturará todos los datos en una tabla observada (debe especificar cada tabla observada manualmente). Después obtendrá el valor antes y el valor después de unINSERT
,UPDATE
oDELETE
.CDC
retendrá esa información por un período de tiempo (puede especificarla usted mismo). El enfoque podría ser usarCDC
en ciertas tablas que necesita ver y replicar manualmente esos cambios en la otra base de datos. Por cierto, tambiénCDC
utiliza la replicación de SQL Server debajo del capó. ;-) Puedes leer más sobre esto aquí .Bueno, estos son mis 2 centavos. Espero que tenga una buena visión general y tal vez haya encontrado una solución que funcione para usted.
fuente
Intentaré enumerar algunas opciones aquí con ventajas y desventajas a medida que las percibo:
Microsoft Sync Framework : me parece más adecuado para bases de datos más pequeñas de aplicaciones móviles. Agrega muchas tablas a su base de datos y no es tan eficiente como la replicación. Como se implementa fuera de SQL Server como componente, será más difícil de configurar. No tengo experiencia con él, solo lo probé y decidí no usarlo.
Seguimiento de cambios en la base de datos . Es una función incorporada de SQL Server que cambia el seguimiento, incluidas las inserciones, actualizaciones y eliminaciones. Todo lo demás, como enviar y aplicar cambios, resolver conflictos, etc., tendrá que codificarse.
CDC como se menciona en la respuesta de Ionic : no tengo experiencia con él, ya que está disponible solo en las ediciones Enterprise o Developer.
El uso de su propio truco con el registro de los procedimientos almacenados ejecutados depende mucho de la naturaleza de su aplicación de base de datos. Pero cuando los procedimientos son un poco diferentes, allí puede obtener un gran lío en los datos. ¿Y cómo lidiarías con los conflictos?
Según su pregunta, parece que necesita sincronizar solo algunas tablas y no todas las grandes bases de datos. Para este propósito, debe analizar sus necesidades con más detalle de lo que ha especificado en la pregunta, como:
Si finalmente descubre que las eliminaciones y los conflictos no son su problema y que su estructura no cambiará mucho, puede considerar escribir su propia lógica, pero puede crecer fácilmente a 1000 filas de código.
fuente
Gracias a todos por sus comentarios.
Resolví con éxito el proceso de sincronización capturando los procedimientos almacenados ejecutados no como un grupo sino uno por uno, lo que funcionó muy bien en mi caso. Dado que la integridad y todo se consideran cuidadosamente, el sistema ha estado funcionando en tiempo real hasta ahora.
fuente
Respuesta tardía, pero podría ser útil enganchar a los visitantes
Tuve un desafío similar al tratar de distribuir datos entre diferentes servidores y lo resolví utilizando herramientas de terceros ( Diff para cambios de esquema y DataDiff para sincronización de cambios de datos) y siguiendo el script de PowerShell requerido para automatizar el proceso:
Este método programa la comparación entre dos bases de datos y sincroniza los cambios encontrados en tiempo real. Aquí hay algunos artículos que ofrecen instrucciones paso a paso:
https://solutioncenter.apexsql.com/automatically-compare-and-synchronize-sql-server-data/ https://solutioncenter.apexsql.com/how-to-automatically-keep-two-sql-server-database- esquemas sincronizados /
fuente