Te recomendamos que pruebes esta resolución en un ambiente controlado antes de enviarlo a producción, un saludo.
Solución:
Bueno, puede que no lo entienda, pero trato de responderlo.
Dijiste que necesitas una solución de alto rendimiento que se ejecute con frecuencia (mínimo 2 minutos) y necesitas un buen enfoque que debería ser rápido sin bloqueos. 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 volver a inventar la rueda y construir su propia solución? Hm, suena un poco raro.
De hecho, estas son mis sugerencias.
- Replicación incluso si dijiste que no lo usarías. Es la mejor y más fácil solución que puede usar para esto. La replicación es fácil de configurar, replica rápida y no tienes que inventar la rueda nuevamente. Si simplemente te extraña el bloqueo, puedes intentar configurar el
ISOLATION LEVEL
paraREAD_COMMITTED_SNAPSHOT
. Puedes leer más sobre esto aquí. Esto consumirá una parte de su tempdb, pero su tabla siempre se puede leer y escribir y la replicación puede funcionar en segundo plano.
Vea el ejemplo a continuación:
ALTER DATABASE yourDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE yourDatabase SET READ_COMMITTED_SNAPSHOT ON
- Centros para el Control y la Prevención de Enfermedades (Captura de datos modificados) también puede ser una solución. Pero de esta manera necesitas construir casi todo por tu cuenta. Y he hecho la experiencia de que
CDC
puede ser algo frágil en algunas circunstancias.CDC
capturará todos los datos en una tabla observada (debe especificar cada tabla observada manualmente). Luego obtendrá el valor antes y el valor después de unINSERT
,UPDATE
oDELETE
.CDC
retendrá esa información durante un período de tiempo (puede especificarlo usted mismo). El enfoque podría ser utilizarCDC
en ciertas tablas, debe observar y replicar manualmente esos cambios en la otra base de datos. Por cierto,CDC
también utiliza la replicación de SQL Server bajo el capó. 😉 Puedes leer más sobre esto aquí.
Advertencia:
CDC
no será consciente deDDL
-cambios. Esto significa que si cambia una tabla y agrega una nueva columna,CDC
observará la tabla pero ignorará todos los cambios en la nueva columna. De hecho solo registraNULL
como valor antes y valor después. Necesitas reinicializarlo despuésDDL
-Cambios a mesa vigilada.
- La forma que describió anteriormente es algo así como capturar una carga de trabajo usando SQL Server Profiler y ejecutarla nuevamente en otra base de datos para algunos puntos de referencia. Bueno, podría funcionar. Pero el hecho de que haya demasiados efectos secundarios es demasiado pesado para mí. ¿Qué hace si captura una llamada de procedimiento en su cliente? ¿Después de ejecutar el mismo comando en su base de datos principal ya que no está sincronizado? El procedimiento puede ejecutarse, pero puede eliminar / actualizar / insertar filas que no estaban presentes en su cliente. O cómo maneja a varios clientes con un principio. Creo que esto es demasiado complicado. En el peor de los casos, probablemente destruyas tu integridad.
- Otra idea podría basarse en una aplicación o utilizar un disparador. Dependiendo de cuántas tablas quieras sincronizar. Puede escribir todos los cambios en una tabla de preparación separada y ejecutar un trabajo del Agente SQL Server todos los minutos para sincronizar esas filas en la tabla de preparación con su maestro. Pero esto puede resultar un poco pesado si intenta sincronizar (por ejemplo) 150 tablas. Tendría una gran sobrecarga.
Bueno, estos son mis 2 centavos. Es de esperar que tenga una buena descripción general y tal vez haya encontrado una solución que funcione para usted.
Intentaré enumerar algunas opciones aquí con ventajas y desventajas a medida que las perciba:
- Replicación de SQL Server – esta es la mejor y más optimizada herramienta nativa de SQL Server para esta tarea. Pero hay varios problemas:
una. para todos sus clientes, independientemente de que sean bases de datos SQL Express o no, necesitará una licencia CAL de SQL Server. Esto se puede evitar utilizando licencias por procesador. B. No puede sincronizar el cliente SQL CE según aquí. C. SQL Express o LocalDB no pueden actuar como editor o distribuidor, por lo que tiene menos control sobre el proceso de replicación del cliente. -
Marco de sincronización de Microsoft – Me parece más adecuado para bases de datos más pequeñas de aplicaciones móviles. Agrega bastantes 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 realiza el seguimiento de cambios, incluidas inserciones, actualizaciones y eliminaciones. Todo lo demás, como enviar y aplicar cambios, resolver conflictos, etc., tendrá que codificarlo usted mismo.
- Columnas de versión de fila (marca de tiempo) Si no permite todas las eliminaciones (sin sincronización de los registros eliminados), puede implementar su propia solución basada solo en la información de la versión de filas. Las columnas de Rowversion también son utilizadas por SQL Server Replication, por lo que deberá agregarlas de todos modos.
-
CDC como se menciona en la respuesta de Ionic – No tengo experiencia con él, ya que solo está disponible en las ediciones Enterprise o Developer.
-
Usar su propio truco con el registro de procedimientos almacenados ejecutados depende mucho de la naturaleza de la aplicación de su base de datos. Pero cuando los procedimientos se vuelven un poco diferentes, puede producirse un gran lío en los datos. ¿Y cómo lidiarías con los conflictos?
De su pregunta, parece que necesita sincronizar solo algunas tablas y no todas las grandes bases de datos. Para ello, debe analizar sus necesidades con más detalle de lo que ha especificado en la pregunta, como por ejemplo:
- ¿Pueden suceder las eliminaciones y qué sucede entonces?
- ¿Pueden ocurrir conflictos, cómo prevenirlos y cómo resolverlos?
- ¿Cómo lidiaré con los cambios en la estructura de la tabla?
- …
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.
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 considera cuidadosamente, el sistema ha estado funcionando en tiempo real hasta ahora.
Aquí tienes las reseñas y puntuaciones
Si te ha sido de utilidad este post, agradeceríamos que lo compartas con más juniors de este modo contrubuyes a extender nuestra información.