Saltar al contenido

Diario de un DBA

Problemas y soluciones para SQL Server

Menú
  • Inicio
  • Consultoria gratuita
  • tempdb
  • Curso Azure DP-300
  • Rendimiento
  • Seguridad
  • Sobre Mi
Menú

Error de Replicación «Violation of PRIMARY KEY constraint» en SQL Server.

Publicada el junio 14, 2024junio 14, 2024 por solracamo

Contenido del post:

Toggle
  • Error «Violation of PRIMARY KEY constraint» en Replicación
  • Investigación y solución

No soy un experto en replicación, pero azar del destino, últimamente me ha tocado investigar e intentar resolver algunos problemas con esta función de SQL Server. En una de estas ocasiones, me di cuenta de que uno de los errores era bastante común, pero no había gran cantidad de información en internet sobre ello (al menos en inglés), por lo que aquí os traigo cómo investigarlo y solucionarlo.

Error «Violation of PRIMARY KEY constraint» en Replicación

El problema empieza al recibir una alerta en nuestro monitor indicando que las publicaciones de nuestro cliente no están funcionando correctamente. Al conectarme a la instancia y abrir el monitor de la replicación configurada, pude ver el siguiente error generándose a la hora de pasar los datos del distribuidor al suscriptor.

El error que podíamos ver era el siguiente:

Violation of PRIMARY KEY constraint ‘PK__Jobs__0DAF0CB0’. Cannot insert duplicate key in object ‘dbo.Jobs’. The duplicate key value is (47ee8dc2-6b00-4df1-a229-a3e64bbbf031). (Source: MSSQLServer, Error number: 2627)

Básicamente, se está intentando insertar una fila en la base de datos de destino con una clave primaria que ya existe.

Investigación y solución

Lo primero que habrá que hacer es identificar qué es lo que se está ejecutando y qué sentencia de esta replicación está generando este error. Para esto, ejecutaremos el siguiente script:

/* Copiar el numero de secuencia que vemos en el monitor de replicación  */
-- 0x00325D3900055A58001500000000
 
SELECT  art.publisher_id ,
        art.publisher_db ,
        art.publication_id ,
        art.article ,
        art.article_id  ,
        art.destination_object  ,
        art.source_owner  ,
        art.source_object 
FROM    distribution.dbo.MSarticles AS art
        JOIN distribution.dbo.MSrepl_commands AS com 
        ON art.Article_id = com.Article_id
WHERE   com.xact_seqno = 0x00325D3900055A58001500000000

Esto nos arrojará la información que está intentando enviar y replicar en la secuencia que se muestra en el error. A partir de esta información, ya podremos obtener el resto.

Usando la información del script anterior, ejecutamos el siguiente script.

EXEC distribution.dbo.sp_browsereplcmds 
     @xact_seqno_start = '0x00325D3900055A58001500000000' ,
     @xact_seqno_end = '0x00325D3900055A58001500000000' , 
     @publisher_database_id = 1 , 
     @article_id = 85 , 
     @command_id = 32 

El resultado será algo similar a esto:

Si scrolleamos hacia la derecha en el resultado de esta query (lo siento no lo capturé porque soy bobo) , encontramos las sentencias que se están ejecutando y, por lo tanto, la información sobre el insert que se está intentando ejecutar en la base de datos.

A partir de aquí, solo tenéis que comprobar esta información y decidir si queréis eliminar esta sentencia de insert o si queréis eliminar la fila ya existente en la base de datos para que pueda insertarse la nueva.

Espero que esta información haya sido útil.

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Consultoria Gratis

¿Tienes un problema o una consulta sobre tu servidor SQL Server? ¿Necesitas hacer algún tipo de mantenimiento o tarea en tu instancia, pero no tienes claro cómo hacerlo?

Envíame un email con tu caso y te contestaré lo antes posible de forma totalmente gratuita.

Puedes utilizar el formulario que encontrarás haciendo click aquí.

Sobre mi

Efectivamente, soy un muñeco de slack con la camiseta de Fernando Alonso en Renault, pero también soy una DBA mid level que vive y trabaja en inglaterra como consultor SQL Server.

El objetivo de este blog es escribir los problemas con los que me he ido encontrando y cómo los solucioné. Si estas soluciones han servido para mí, es posible que también lo hagan para ti, ¿no?

Otras soluciones

  • Recuperar la password de la cuenta SA en SQL Serveroctubre 5, 2024
  • Always On en SQL Server. Todo lo que necesitas saberagosto 24, 2024
  • Recuperar una tabla borrada en SQL Serveragosto 18, 2024
  • Mover bases de datos a otro disco en SQL Serveragosto 11, 2024
  • Comprobar los últimos backups tomados en una instancia SQL Serverjunio 29, 2024
  • Comprobar fragmentación en SQL Serverjunio 23, 2024

Curso Azure DP-300 Gratis

  • Azure DP-300 curso en Español – Parte 1noviembre 17, 2022
  • Crear una máquina virtual con SQL server en Azurenoviembre 17, 2022
  • Crear un servidor SQL Server en Azure.noviembre 22, 2022
  • Azure DP-300 curso en Español – Parte 2noviembre 24, 2022
  • Azure DP-300 curso en Español – Parte 3diciembre 1, 2022
  • Azure DP-300 curso en Español – Parte 4diciembre 14, 2022

Consulta las páginas que nadie consulta:
Privacidad
Cookies

Escríbeme!
Contacto

© 2025 Diario de un DBA
x