Filas de clave duplicadas en la tabla sys.syscommittab de SQL Server

Síntomas

Cuando se comparan el SYSCOMMITTABLE en la memoria y el archivo sys.syscommittab en el disco de Microsoft SQL Server, puede ver filas de clave duplicadas. Estos valores duplicados pueden producir operaciones de backup y de punto de comprobación falle.

"No se puede insertar una fila de clave duplicada en el objeto 'sys.syscommittab' con índice único 'si_xdes_id'. El valor de la clave duplicada es (KeyValue).

Error: 3999, gravedad: 17, estado: 1.

No se pudo vaciar la tabla confirmación al disco en dbid DatabaseID debido a un error 2601. Compruebe el registro de errores para obtener más información".

Causa

Este problema se produce debido a un problema conocido en el seguimiento de cambios de SQL Server.

Resolución

Para resolver los factores que causan las claves duplicadas, aplique una de las revisiones siguientes, según corresponda a su situación: corregir: se produce un error en una operación de copia de seguridad en una base de datos de SQL Server 2008 o SQL Server 2008 R2 Si habilita el seguimiento de cambios en esta base de datoshttp://support.microsoft.com/kb/2522893revisión: copia de seguridad se produce un error en SQL Server 2008, SQL Server 2008 R2 o SQL Server 2012 Si habilita el seguimiento de cambios en la base de datos http://support.microsoft.com/kb/2603910revisión: se produce un error en la operación de copia de seguridad en SQL Server 2008 , SQL Server 2008 R2 o base de datos de SQL Server 2012 después de habilitar el seguimiento http://support.microsoft.com/kb/2682488aunque estas revisiones impiden que las filas duplicadas de clave continuar aparezca, no quita automáticamente las filas duplicadas de los cambios. Sin quitar las filas duplicadas, la base de datos no puede completar los puntos de comprobación de la base de datos y copias de seguridad pueden fallar. Para quitar las filas duplicadas, utilice uno de los métodos siguientes.

Método 1: Deshabilitar y habilitar el seguimiento de cambios

  1. Deshabilitar seguimiento de cambios en las tablas afectadas y la base de datos.

  2. Emitir un punto de comprobación de la base de datos manualmente.

  3. Habilitar el seguimiento de cambios en la base de datos y tablas.

Para obtener más información acerca del seguimiento de cambios, vea Habilitar y deshabilitar el seguimiento de cambios. Para obtener información acerca de cómo emitir una instrucción CHECKPOINT manual, vea CHECKPOINT (Transact-SQL)

Método 2: Eliminar manualmente las filas duplicadas

  1. Copie la secuencia de comandos de Transact-SQL al final de la sección "Resolución" en un editor de texto.

  2. Busque el marcador de posición < AFFECTED_DB > en la secuencia de comandos y reemplazarlo por el nombre de la base de datos.

  3. Guarde el script modificado en el disco duro como un archivo .sql. Por ejemplo:

    C:\temp\remove_duplicates.sql

Si está ejecutando SQL Server 2014, debe conceder el control total de SID por servicio a los archivos mssqlsystemresource.ldf y mssqlsystemresource.mdf. Para ello, siga estos pasos:

  1. Desplácese al directorio Binn correspondiente a la instancia. Por ejemplo:

    C:\Program Files\Microsoft SQL Server\ \MSSQL\Binn < Id. de instancia >

  2. Abra las propiedades de mssqlsystemresource.ldf y mssqlsystemresource.mdf y, a continuación, haga clic en la ficha seguridad .

  3. Busque al SID de cada servicio de servicio de SQL Server y compruebe los permisos predeterminados:

    * Leer y ejecutar

    *Read

  4. Conceder el servicio SQL Server Control total SID por servicio y, a continuación, cierre los cuadros de diálogo de permisos.

  5. Iniciar SQL Server en modo de usuario único. Para obtener más información, consulte Iniciar SQL Server en modo de usuario único.

  6. Utilice una línea de comandos sqlcmd para conectarse a SQL Server en la conexión de administrador dedicada (DAC). Por ejemplo:

    Sqlcmd -S PRODSERV1\MSSQLSERVER - A -E -i c:\temp\remove_duplicates.sqlA continuación, ejecute la secuencia de comandos de Transact-SQL modificado.

  7. Iniciar SQL Server en modo multiusuario y, a continuación, compruebe que copia de seguridad y operaciones de punto de comprobación contra la base de datos finalizan correctamente. Si ha seguido el paso 4, revierta los permisos a los valores predeterminados.

Secuencia de comandos de Transact-SQL

--Create a temporary database to store the necessary rows required to remove the duplicate dataif exists(select 1 from sys.databases where name = 'dbChangeTrackingMetadata')begindrop database dbChangeTrackingMetadataendgocreate database dbChangeTrackingMetadatago --Table to store the contents of the SYSCOMMITTABLEuse dbChangeTrackingMetadatagocreate table dbo.t_SYSCOMMITTABLE (commit_ts bigint,xdes_id bigint,commit_lbn bigint,commit_csn bigint,commit_time datetime)go --Table to store the duplicate rows to be removed from the sys.syscommittab tablecreate table dbo.t_syscommittab (commit_ts bigint,xdes_id bigint,commit_lbn bigint,commit_csn bigint,commit_time datetime,dbfragid int)go --Enable the usage of OPENROWSETexec sys.sp_setbuildresource 1go --Change <AFFECTED_DB> to the database that contains the duplicate valuesUSE <AFFECTED DB>godeclare @rowcount bigintSET @rowcount = 0 --Copy all rows from the SYSCOMMITTABLE into the temporary databaseinsert into dbChangeTrackingMetadata.dbo.t_SYSCOMMITTABLESELECT commit_ts, xdes_id, commit_lbn, commit_csn, commit_timeFROM OpenRowset (table SYSCOMMITTABLE, db_id (), 0, 0) --Save the duplicate values into the temporary databaseinsert into dbChangeTrackingMetadata.dbo.t_syscommittabselect ondisk_ct.* from sys.syscommittab as ondisk_ctjoin dbChangeTrackingMetadata.dbo.t_SYSCOMMITTABLE as inmem_cton ondisk_ct.xdes_id = inmem_ct.xdes_id --Delete the duplicate valuesdelete from sys.syscommittabwhere xdes_id in ( select xdes_id from dbChangeTrackingMetadata.dbo.t_syscommittab )set @rowcount = @@rowcountif (@rowcount > 0)beginprint ''print 'DELETED '+CAST(@rowcount as NVARCHAR(10))+' rows from sys.syscommittab that were also stored in SYSCOMMITTABLE'print ''endelsebeginprint ''print 'Failed to DELETE DUP rows from sys.syscommittab'print ''endexec sys.sp_setbuildresource 0go 

¿Necesita más ayuda?

Ampliar sus conocimientos
Explorar los cursos
Obtener nuevas características primero
Unirse a Microsoft Insider

¿Le ha sido útil esta información?

¡Gracias por sus comentarios!

Gracias por sus comentarios. Quizá le interese ponerse en contacto con uno de nuestros agentes de soporte de Office.

×