Compartir a través de


Solucionador de problemas: buscar errores con la replicación transaccional de SQL Server

Se aplica a:SQL ServerAzure SQL Managed Instance

La solución de problemas de errores de replicación puede resultar frustrante sin un conocimiento básico de cómo funciona la replicación transaccional. El primer paso para crear una publicación es hacer que el Agente de instantáneas cree la instantánea y la guarde en la carpeta de instantáneas. Después, el Agente de distribución aplica la instantánea al suscriptor.

Este proceso crea la publicación y la coloca en el estado de sincronización. La sincronización funciona en tres fases:

  1. Las transacciones se producen en los objetos que se replican y se marcan como "para replicación" en el registro de transacciones.

  2. El Agente de registro del LOG examina el registro de transacciones y busca las transacciones marcadas "para replicación". Estas transacciones se guardan en la base de datos distribuida.

  3. El Agente de distribución examina la base de datos de distribución mediante el subproceso de lectura. Después, con el subproceso de escritura, este agente se conecta al suscriptor para aplicar los cambios en él.

En cualquier paso de este proceso se pueden producir errores. La búsqueda de esos errores puede ser el aspecto más complejo de la solución de problemas de sincronización. Afortunadamente, el uso del Monitor de replicación facilita este proceso.

Nota:

El propósito de esta guía de solución de problemas es enseñar la metodología de solución de problemas. No se ha diseñado para resolver errores específicos, sino para ofrecer instrucciones generales para buscar errores con la replicación. Se proporcionan algunos ejemplos específicos, pero su resolución puede variar en función del entorno. Los errores de ejemplo se basan en el tutorial: Configuración de la replicación entre dos servidores totalmente conectados (transaccional).

Metodología de solución de problemas

Preguntas que debe formularse

  1. ¿En qué parte del proceso de sincronización se produce un error en la replicación?
  2. ¿Qué agente está experimentando un error?
  3. ¿Cuándo fue la última vez que la replicación funcionó correctamente? ¿Qué ha cambiado desde entonces?

Pasos a seguir

  1. Use el Monitor de replicación para identificar en qué momento se produce el error (¿qué agente?):

    • Si los errores se producen en la sección Publicador a distribuidor, el problema está relacionado con el Agente de registro del LOG.
    • Si los errores se producen en la sección Distribuidor a publicador, el problema está relacionado con el Agente de distribución.
  2. Examine el historial de trabajos de ese agente en el Monitor de actividad de trabajo para identificar los detalles del error. Si en el historial de trabajos no se muestran detalles suficientes, puede habilitar el registro detallado en ese agente específico.

  3. Intente determinar una solución para el error.

Buscar errores con el Agente de instantáneas

El Agente de instantáneas genera la instantánea y la escribe en la carpeta de instantáneas especificada.

  1. Vea el estado del Agente de instantáneas:

    1. En el Explorador de objetos, expanda el nodo Publicación local bajo Replicación.

    2. Haga clic con el botón derecho en la publicación AdvWorksProductTrans>Ver estado del Agente de instantáneas.

    Captura de pantalla del comando Ver estado del agente de instantáneas en el menú contextual.

  2. Si se notifica un error en el estado del Agente de instantáneas, puede encontrar más detalles en el historial de trabajos del Agente de instantáneas:

    1. Expanda Agente SQL Server en el Explorador de objetos y abra el Monitor de actividad de trabajo.

    2. Ordene por Categoría e identifique el Agente de instantáneas por la categoría REPL-Instantánea.

    3. Haga clic con el botón derecho en el Agente de instantáneas y después seleccione Ver historial.

    Captura de pantalla de las selecciones para abrir el historial del Agente de instantáneas.

  3. En el historial del Agente de instantáneas, seleccione la entrada de registro correspondiente. Suele ser una línea o dos antes de la entrada en la que se informa del error. Una X de color rojo indica errores. Revise el texto del mensaje en el cuadro situado debajo de los registros:

    Captura de pantalla del error del Agente de instantáneas para acceso denegado.

    The replication agent had encountered an exception.
    Exception Message: Access to path '\\node1\repldata.....' is denied.
    

Si los permisos de Windows no están configurados correctamente para la carpeta de instantáneas, verá un error de "acceso denegado" para el Agente de instantáneas. Debe comprobar los permisos en la carpeta donde se almacena la instantánea y asegurarse de que la cuenta usada para ejecutar el Agente de instantáneas tiene permisos para acceder al recurso compartido.

Buscar errores con el Agente de registro del LOG

El Agente de registro del LOG se conecta a la base de datos del publicador y examina el registro de transacciones para las transacciones marcadas como "para replicación". Después, añade esas transacciones a labase de datos distribuida.

  1. Conéctese al servidor en SQL Server Management Studio. Expanda el nodo del servidor, haga clic con el botón derecho en la carpeta Replicación y luego seleccione Iniciar Monitor de replicación:

    Captura de pantalla del comando

    Se abre el monitor de replicación:

    Captura de pantalla del Monitor de replicación.

  2. La X roja indica que la publicación no se está sincronizando. Expanda Mis publicadores en el lado izquierdo y, después, expanda el servidor del publicador relevante.

  3. Seleccione la publicación AdvWorksProductTrans de la izquierda y, después, busque la X de color rojo en una de las pestañas para identificar dónde está el problema. En este caso, la X de color rojo se encuentra en la pestaña Agentes, por lo que uno de los agentes ha encontrado un error:

    Captura de pantalla de Red X en la pestaña

  4. Haga clic en la pestaña Agentes para identificar el agente que tiene el error:

    Captura de pantalla de Red X en el Agente de registro del LOG con errores en el Monitor de replicación.

  5. En esta vista se muestran dos agentes, el Agente de instantáneas y el Agente de registro del LOG. En el que se produce el error tiene la X de color rojo. En este caso, es el Agente de registro del LOG.

    Haga doble clic en la línea en la que se informa del error, para abrir el historial del Agente de registro del LOG. En este historial se proporciona información más detallada sobre el error:

    Captura de pantalla de los detalles del error para el Agente de registro del LOG.

    Status: 0, code: 20011, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.
    The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.
    Status: 0, code: 15517, text: 'Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.'.
    Status: 0, code: 22037, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.
    
  6. El error suele producirse cuando el propietario de la base de datos del publicador no está configurado correctamente. Esto puede ocurrir cuando se restaura una base de datos. Para comprobarlo:

    1. Expanda Bases de datos en el Explorador de objetos.

    2. Haga clic con el botón derecho en AdventureWorks2022>Propiedades.

    3. Compruebe la existencia de un propietario en la página Archivos. Si este cuadro está en blanco, esta es la causa probable del problema.

    Captura de pantalla de la página

  7. Si el propietario está en blanco en la página Archivos, abra una Nueva ventana de consulta dentro del contexto de la base de datos AdventureWorks2022. Ejecute el código de T-SQL siguiente:

    -- set the owner of the database to 'sa' or a specific user account, without the brackets.
    EXECUTE sp_changedbowner '<useraccount>';
    -- example for sa: exec sp_changedbowner 'sa'
    -- example for user account: exec sp_changedbowner 'sqlrepro\administrator'
    
  8. Es posible que tenga que reiniciar el Agente de registro del LOG:

    1. Expanda el nodo Agente SQL Server en el Explorador de objetos y abra el Monitor de actividad de trabajo.

    2. Ordene por Categoría e identifique el Agente de registro del LOG por la categoría REPL-Lector del registro.

    3. Haga clic con el botón derecho en el trabajo del Agente de registro del LOG y seleccione Iniciar trabajo en el paso.

    Captura de pantalla de las selecciones para reiniciar el Agente lector del registro.

  9. Vuelva a abrir el Monitor de replicación para comprobar que ahora la publicación se está sincronizando. Si no está abierto, puede encontrarlo si hace clic con el botón derecho en Replicación en el Explorador de objetos.

  10. Seleccione la publicación AdvWorksProductTrans, haga clic en la pestaña Agentes y haga doble clic en el Agente de registro del LOG para abrir el historial del agente. Ahora debería ver que el Agente de registro del LOG se está ejecutando y, o bien está replicando comandos, o muestra "No hay transacciones replicadas":

    Captura de pantalla del Log Reader Agent ejecutándose sin transacciones replicadas.

Buscar errores con el Agente de distribución

El Agente de distribución busca los datos en la base de datos de distribución y después los aplica al suscriptor.

  1. Conéctese al servidor en SQL Server Management Studio. Expanda el nodo del servidor, haga clic con el botón derecho en la carpeta Replicación y luego seleccione Iniciar Monitor de replicación.

  2. En Monitor de replicación, seleccione la publicación AdvWorksProductTrans y seleccione la pestaña Todas las suscripciones. Haga clic con el botón derecho en la suscripción y seleccione Ver detalles:

    Captura de pantalla del comando

  3. Se abre el cuadro de diálogo Historial de Distribuidor a suscriptor y aclara qué tipo de error está detectando el agente:

    Captura de pantalla de detalles del error para el Agente de distribución.

    Error messages:
    Agent 'NODE1\SQL2016-AdventureWorks2022-AdvWorksProductTrans-NODE2\SQL2016-7' is retrying after an error. 89 retries attempted. See agent job history in the Jobs folder for more details.
    
  4. El error indica que el Agente de distribución está volviendo a intentarlo. Para buscar más información, compruebe el historial de trabajos del Agente de distribución:

    1. Expanda Agente SQL Server en el Explorador de objetos >Monitor de actividad de trabajo.

    2. Ordene los trabajos por Categoría.

    3. Identifique el Agente de distribución por la categoría REPL-Distribución. Haga clic con el botón derecho en el agente y seleccione Ver historial.

    Captura de pantalla de selecciones para ver el historial del Agente de distribución.

  5. Seleccione una de las entradas de error y vea el texto del error en la parte inferior de la ventana:

    Captura de pantalla del texto de error que indica una contraseña incorrecta para el agente de distribución.

    Message:
    Unable to start execution of step 2 (reason: Error authenticating proxy NODE1\repl_distribution, system error: The user name or password is incorrect.)
    
  6. Este error indica que la contraseña usada por el Agente de distribución es incorrecta. Para resolverlo:

    1. Expanda el nodo Replicación en el Explorador de objetos.

    2. Haga clic con el botón derecho en la suscripción >Propiedades.

    3. Haga clic en el botón de puntos suspensivos (...) situado junto a Cuenta de proceso del agente y modifique la contraseña.

    Captura de pantalla de selecciones para modificar la contraseña del Agente de distribución.

  7. Vuelva a comprobar el Monitor de replicación haciendo clic con el botón derecho en Replicación en el Explorador de objetos. Una X de color rojo debajo de Todas las suscripciones indica que el Agente de distribución todavía detecta un error.

    Abra el historial de Distribución al suscriptor haciendo clic con el botón derecho en la suscripción en Monitor de replicación>Ver detalles. En este caso, el error ahora es diferente:

    Captura de pantalla del error que indica que el Agente de distribución no se puede conectar.

    Connecting to Subscriber 'NODE2\SQL2016'
    Agent message code 20084. The process could not connect to Subscriber 'NODE2\SQL2016'.
    Number:  18456
    Message: Login failed for user 'NODE2\repl_distribution'.
    
  8. Este error indica que el Agente de distribución no pudo conectarse al suscriptor, porque se produjo un error de inicio de sesión para el usuario NODE2\repl_distribution. Para investigar en profundidad, conéctese al suscriptor y abra el registro de errores de SQL Server actual en el nodo Administración del Explorador de objetos:

    Captura de pantalla del error que indica el error de inicio de sesión del suscriptor.

    Si está viendo este error, falta el inicio de sesión en el suscriptor. Para resolver este error, consulte Requisitos de rol de seguridad para la replicación.

  9. Una vez resuelto el error de inicio de sesión, vuelva a comprobar el Monitor de replicación. Si se han solucionado todos los problemas, debería ver una flecha de color verde junto al Nombre de la publicación y un estado de En ejecución en Todas las suscripciones.

    Haga clic con el botón derecho en la suscripción para volver a abrir el historial de Distribuidor a suscriptor para comprobar que se realizó correctamente. Si es la primera vez que ejecuta el Agente de distribución, verá que la instantánea se ha copiado de forma masiva en el suscriptor:

    Captura de pantalla del Agente de distribución con el estado

Buscar errores con el Agente de mezcla

El agente de mezcla puede tardar mucho tiempo en replicar los cambios. Para determinar qué paso del proceso de sincronización de la replicación de mezcla tarda más tiempo, use la marca de seguimiento 101 junto con el registro del Agente de mezcla. Con tal fin, use los parámetros siguientes para los parámetros del Agente de mezcla y, después, reinícielo:

-T 101
-output
-outputverboselevel

Nota:

Si tiene que escribir estadísticas en la tabla <distribution-server>..msmerge_history, use la marca de seguimiento 102.

Una salida de ejemplo del agente de mezcla después de que finalice la sincronización de replicación de mezcla es la siguiente:

**************************************************************
CONNECTION TIMES --> time took to establish the connection to the servers. Publisher (all connections) 156 msec   Subscriber (all connections) 32 msec Distributor 93 msec
**************************************************************
UPLOAD COUNTERS  --> upload phase (changes from the Sub to the Pub) stats MakeGeneration Time = 343 msec. InsertGenHistory Time = 31 msec. UpdateGenHistory Time = 0 msec. ProxiedMetadata Time = 0 msec.
**************************************************************
DOWNLOAD COUNTERS  --> download phase (changes from the Pub to the Sub) stats MakeGeneration Time = 219 msec. InsertGenHistory Time = 0 msec. UpdateGenHistory Time = 0 msec.
**************************************************************
RETENTION-BASED CLEANUP STATISTICS --> sp_mergemetadataretentioncleanup proc stats Publisher: Cleanup Time 281 msec MSmerge_genhistory rows cleaned up 0 MSmerge_contents rows cleaned up 0 MSmerge_tombstone rows cleaned up 0 Subscriber: Cleanup Time 187 msec MSmerge_genhistory rows cleaned up 0 MSmerge_contents rows cleaned up 0 MSmerge_rowtrack rows cleaned up 0 MSmerge_tombstone rows cleaned up 0
**************************************************************
RETRY STATISTICS Retry Time (Upload) 0 msec. Retry Time (Download) 0 msec. Total changes retried 0 Number of Iterations through rows needing retry 0 Total number of changes that failed despite retry 0
**************************************************************
PROXY METADATA QUEUE COUNTERS Queue Full: Number of Waits: 0, Total Wait Time: 0 msec
**************************************************************
Distributor-side History Logging Time = 219 msec. Number of Distributor-side History Messages Logged = 11 Subscriber-side History Logging Time = 295 msec. Number of Subscriber-side History Messages Logged = 11
**************************************************************
2013-05-28 17:24:11.820 OLE DB Subscriber '<SQL Server name>\sql2008r2': DBCC SQLPERF (NETSTATS)  2013-05-28 17:24:11.822 OLE DB Publisher '<SQL Server name>\SQL2008R2':  DBCC SQLPERF (NETSTATS)  2013-05-28 17:24:11.824 OLE DB Distributor '<SQL Server name>\SQL2008R2':  DBCC SQLPERF (NETSTATS)  NETWORK STATISTICS Server  Reads  Writes  Bytes Read Bytes Written Publisher 74  74  19112  37526 Subscriber 73  73  19032  36931 Distributor 75  75  19192  38121
**************************************************************
NETWORK STATUS Network Connection: The computer has one or more LAN cards that are active. Network link speed: Destination Incoming  Outgoing Publisher Unreachable  Unreachable Subscriber Unreachable  Unreachable Distributor Unreachable  Unreachable
**************************************************************

Habilitar el registro detallado en todos los agentes

Puede usar el registro detallado para ver información más detallada sobre los errores que se produzcan en cualquier agente en la topología de replicación. Los pasos son los mismos para cada agente. Asegúrese de seleccionar el agente correcto en el Monitor de actividad de trabajo.

Nota:

Los agentes pueden estar en el publicador o el suscriptor, en función de si se trata de una suscripción de inserción o de extracción. Si el agente no está disponible en el servidor que está investigando, compruebe el otro servidor.

  1. Decida dónde quiere guardar el registro detallado y asegúrese de que la carpeta exista. En este ejemplo se usa c:\temp.

  2. Expanda el nodo Agente SQL Server en el Explorador de objetos y abra el Monitor de actividad de trabajo.

    Captura de pantalla del comando

  3. Ordene por Categoría e identifique el agente que le interese. Este ejemplo se usa el Agente de registro del LOG. Haga clic con el botón derecho en el agente que le interese >Propiedades.

    Captura de pantalla de Selecciones para abrir las propiedades del agente.

  4. Seleccione la página Pasos y, después, resalte el paso Ejecutar agente. Seleccione Editar.

    Captura de pantalla de Selecciones para editar el paso

  5. En el cuadro Comando, inicie una línea nueva, escriba el texto siguiente y haga clic en Aceptar:

    -Output C:\Temp\OUTPUTFILE.txt -Outputverboselevel 3
    

    Puede modificar la ubicación y el nivel de detalle según sus preferencias.

    Captura de pantalla de la salida detallada en las propiedades del paso del trabajo.

    Al agregar el parámetro de salida detallado, los siguientes problemas pueden provocar un error en el agente o que falte el archivo outfile:

    • Hay un problema de formato en el que un guión largo se convierte en un guión.

    • La ubicación no existe en el disco, o bien la cuenta que está ejecutando al agente no tiene permiso para escribir en la ubicación especificada.

    • Falta un espacio entre el último parámetro y el parámetro -Output.

    • Cada agente admite diferentes niveles de detalle. Si habilita el registro detallado, pero no se puede iniciar el agente, pruebe a reducir el nivel de detalle especificado en 1.

  6. Reinicie el Agente de registro del LOG haciendo clic con el botón derecho en el agente >Detener trabajo en el paso. Para actualizar, haga clic en el icono Actualizar de la barra de herramientas. Haga clic con el botón derecho en el agente >Iniciar trabajo en el paso.

  7. Revise la salida en el disco.

    Captura de pantalla del archivo de texto de salida.

  8. Para deshabilitar el registro detallado, siga los mismos pasos anteriores para quitar toda la línea -Output que agregó anteriormente.

Obtener ayuda

Contribuya a la documentación de SQL

¿Sabía que puede editar el contenido de SQL usted mismo? Si lo hace, no solo contribuirá a mejorar la documentación, sino que también se le reconocerá como colaborador de la página.

Para obtener más información, consulte Editar documentación de Microsoft Learn.