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.
- Replicación incluso si dijiste que no la usarías. Es la solución más fácil y mejor que puede usar para esto. La replicación es fácil de configurar, se replica rápidamente y no tiene que inventar la rueda nuevamente. Si simplemente te gusta bloquear, puedes intentar configurarlo
ISOLATION LEVEL
en READ_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:
ALTER DATABASE yourDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE yourDatabase SET READ_COMMITTED_SNAPSHOT ON
- CDC (Change Data Capture) también puede ser una solución. Pero de esta manera necesita construir casi todo por su cuenta. Y he hecho la experiencia 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). Después obtendrá el valor antes y el valor después de un INSERT
, UPDATE
o DELETE
. CDC
retendrá esa información por un período de tiempo (puede especificarla usted mismo). El enfoque podría ser usar CDC
en ciertas tablas que necesita ver y replicar manualmente esos cambios en la otra base de datos. Por cierto, también CDC
utiliza la replicación de SQL Server debajo del capó. ;-) Puedes leer más sobre esto aquí .
Advertencia: CDC
no se dará cuenta de los DDL
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 registra NULL
como valor antes y valor después. DDL
Debe reiniciarlo después de -Cambios a una tabla observada.
- La forma en que describió anteriormente es algo así como capturar una carga de trabajo utilizando 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é hacer si captura una llamada de procedimiento en su cliente? ¿Luego ejecuta 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 manejas múltiples clientes con un principio? Creo que esto es demasiado complicado. En el peor de los casos, probablemente destruyas tu integridad.
- Otra idea podría ser la aplicación o el uso de un disparador. Dependiendo de cuántas tablas desea sincronizar. Puede escribir todos los cambios en una tabla de etapas separada y ejecutar un trabajo del Agente SQL Server todo x Minutos para sincronizar esas filas en la tabla de etapas con su maestro. Pero esto puede ser un poco pesado si intenta sincronizar (por ejemplo) 150 tablas. Tendrías una gran sobrecarga.
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.