Al usar la replicación transaccional SQL 2008 R2 con suscriptores de extracción, cuando agregamos un artículo, me gustaría evitar tener que crear una instantánea completa (la base de datos es de ~ 80 GB, por lo que esto lleva horas).
De este artículo , he visto cómo hacer esto con una instantánea parcial al desactivar la sincronización inmediata, pero eso no funcionó para nosotros.
Idealmente, me gustaría ejecutar esto como parte de nuestro script db para crear la tabla, por lo que si queremos que se replique lo hacemos:
Create Table ...
sp_addArticle ...
sp_PushThisToOurSubscribersNow
fuente
fuente
Tenía la misma pregunta, y aunque he sido DBA por un tiempo, realmente no he lidiado con la replicación lo suficientemente profundo como para estar completamente cómodo con ella, así que pensé que los siguientes recursos y guías fueron útiles:
Este blog , que proporcionó un buen resumen del proceso. También nos recuerda que, si tiene una gran publicación existente, y su opción está configurada en "sincronización_inmediata", hará que se prepare una instantánea completamente nueva cada vez que agregue o cambie un artículo. Entonces tiene un consejo útil para cambiar esa opción, usando
sp_changePublication @publication='MyPub', @property='immediate_sync', @value='false';
Publicación de blog de MSDN en "repltalk" (¡suena como un buen recurso en general!) - no está "directamente directamente" relacionado pero sigue siendo útil
Esta pregunta, donde @ Brandon-Williams señaló que, si se trata de una suscripción Pull , también debe actualizarla, utilizando
sp_refreshSubscriptions @publication = 'MyPub'
Monitor de replicación SSMS: forma conveniente de detener e iniciar los agentes (instantánea, lector de registro) al seguir la guía.
Estos son los pasos reales que seguí, que funcionaron bien y obtuvieron la aprobación de mi DBA supervisor:
sp_changePublication
- sí, como señala @cody_konior, esto no está documentado, pero funcionó bien en mi caso. YMMVsp_addArticle
sp_articleColumn
(publicación y artículo especificados, NO especificó columnas -> implica TODAS las columnas)sp_refreshSubscriptions
para esa publicación para actualizar el pull-erY aunque sí, podría hacer la mayoría de los cambios con la GUI de SSMS, me parece útil escribir todo para que pueda estar A) bajo control de fuente (control de cambio) y B) implementado repetidamente o en varias instancias . Desafortunadamente, no dediqué tiempo a programar las paradas / inicios del Agente, pero eso no debería ser demasiado difícil dado que solo son Trabajos del Agente SQL. Solo tiene que hacer todo el truco de "encontrar el JobID usando el nombre del trabajo" (consulta
sysjobs
, ¿en serio, MS?) ...Espero que ayude a los futuros lectores!
fuente
Como se señaló en Agregar artículos y eliminar artículos de publicaciones existentes , debe * crear una nueva instantánea para la publicación.
Para evitar generar una instantánea para todos los artículos al agregar un nuevo artículo, la propiedad de publicación
immediate_sync
debe establecerse en 0. Llamesp_addarticle
, entoncessp_addsubscription
. Si las suscripciones son pull, también debe llamarsp_refreshsubscriptions
. Luego genere una instantánea y solo se generará una instantánea para el artículo recién agregado.* Este es el enfoque recomendado en los Libros en pantalla de SQL Server. El problema con su enfoque es que es propenso a errores.
fuente
Edición principal Esta es una reescritura completa de esta respuesta (teniendo en cuenta las críticas válidas de que la versión anterior era propensa a errores y causaría problemas)
También publicó una demostración de cómo aplicar esto a: Youtube - Replicación de SQL Server: cómo agregar un artículo sin tomar una instantánea .
IMPORTANTE: este NO es un enfoque recomendado por Microsoft, por lo que estará solo con respecto a que funcione, ¡ NO aplique directamente a su entorno de producción sin pruebas aisladas significativas y se sienta cómodo con los pasos!
Pasos a seguir:
Para verificar:
EJEMPLO Proceso
A) Cree una tabla en su editor:
B) Cree usted mismo un trabajo / proc / script para hacer algunas inserciones / actualizaciones / eliminaciones en [TableNotUsingSnap] (luego puede usar esto para validar cómo el suscriptor se sincroniza correctamente usando este método.
Pre-pasos:
1. Crea tu tabla en el suscriptor
2. Cree sus procedimientos almacenados de replicación (actualizar / insertar / eliminar) - en el suscriptor
Puede crear los procedimientos de respuesta:
El cambio que deberá aplicar:
IF NOT EXISTS (SELECT 'row already exists' FROM [Schema].[TableName] dest WITH (NOLOCK) WHERE dest.Id = @c1)
para no insertar si ya está allíIF @@rowcount = 0 ... exec sp_MSreplraiserror ...
para ignorar una actualización que no se aplica (ya que el registro puede haberse eliminado en el editor antes de sincronizar los datos)IF @@rowcount = 0 ... exec sp_MSreplraiserror ...
para ignorar una eliminación que no se aplica (ya que el registro puede haberse eliminado en el editor antes de sincronizar los datos)sp_MSins_dboTableNotUsingSnap:
sp_MSupd_dboTableNotUsingSnap:
sp_MSdel_dboTableNotUsingSnap:
PASOS DE DESPLIEGUE
3. Detenga el agente de distribución: en el Distribuidor (Push) o Suscriptor (Pull)
4. Ahora agregue el artículo a la publicación - En el editor
Parámetros clave:
sp_addarticle
- se@pre_creation_cmd = N'none'
usa para decirle al agente de distribución que no deje caer y genere sus propios objetossp_addsubscription
-@sync_type = N'none'
solía decirle a Distributer que no necesita crear una nueva instantánea, solo puede poner en cola los comandos del DIUsp_addarticle:
5. Sincroniza tus datos
Ahora necesita copiar sus datos a su suscriptor, podría:
El método exacto que utilice lo dejo al lector, también dependerá de cuánto tiempo esté dispuesto a detener su Agente de distribución.
EXTRA: Como un paso adicional en sus pruebas, aquí hay un buen lugar para ejecutar su script (desde el Paso (B)) para crear acciones del DIU en [TableNotUsingSnap] para que pueda ganar confianza en este método.
6. Reinicie el agente de distribución: en el Distribuidor (Push) o Suscriptor (Pull)
fuente