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

IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.

Haga clic aquí para ver el artículo original (en inglés): 3083381
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.

Causa
Este problema se produce debido a un problema conocido en el seguimiento de cambios de SQL Server.
Solución
Para resolver los factores que causan las claves duplicadas, aplique una de las revisiones siguientes, según corresponda a su situación:

REVISIÓN: 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 datos
http://support.Microsoft.com/kb/2522893

REVISIÓ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/2603910

REVISIÓN: La operación de copia de seguridad se produce un error en una base de datos de SQL Server 2008, SQL Server 2008 R2 o SQL Server 2012 después de habilitar el seguimiento de cambios
http://support.Microsoft.com/kb/2682488

Aunque estas revisiones impide que continúen aparecen filas de clave duplicadas, no quita automáticamente las filas duplicadas. 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, veaHabilitar y deshabilitar el seguimiento de cambios.

Para obtener información acerca de cómo emitir una instrucción CHECKPOINT manual, consulte 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 la <AFFECTED_DB>marcador de posición en la secuencia de comandos y reemplazarlo por el nombre de la base de datos.</AFFECTED_DB>
  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. Todo esto, siga estos pasos:
  1. Desplácese al directorio Binn correspondiente a la instancia. Por ejemplo:

    C:\Program Files\Microsoft SQL Server\<Instance id="">\MSSQL\Binn</Instance>
  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 & ejecutar
    * Lectura
  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, veaIniciar SQL Server en modo de usuario único.
  6. Uso de ejemploUn Sqlcmdlínea de comandos 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.sql
    A 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

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 3083381 - Última revisión: 09/25/2015 15:28:00 - Revisión: 2.0

Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Workgroup, Microsoft SQL Server 2008 R2 Standard, Microsoft SQL Server 2008 R2 Developer, Microsoft SQL Server 2008 R2 Enterprise, Microsoft SQL Server 2008 R2 Workgroup, Microsoft SQL Server 2012 Standard, Microsoft SQL Server 2012 Developer, Microsoft SQL Server 2012 Enterprise, Microsoft SQL Server 2012 Web, Microsoft SQL Server 2014 Standard, Microsoft SQL Server 2014 Developer, Microsoft SQL Server 2014 Enterprise, Microsoft SQL Server 2014 Web

  • kbmt KB3083381 KbMtes
Comentarios