Linhas de chaves duplicadas da tabela sys.syscommittab no SQL Server

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 3083381
Sintomas
Quando comparar o SYSCOMMITTABLE de memória e o ficheiro de disco sys.syscommittab no Microsoft SQL Server, poderá ver linhas de chaves duplicadas. Estes valores duplicados podem causar operações de cópia de segurança e o ponto de verificação a falha.

Causa
Este problema ocorre devido a um problema conhecido no registo de alterações do SQL Server.
Resolução
Para resolver os factores que provocam as chaves duplicadas, aplicam-se uma das seguintes correcções, conforme adequado à sua situação:

CORRECÇÃO: Uma operação de cópia de segurança numa base de dados SQL Server 2008 ou SQL Server 2008 R2 falha se activar esta base de dados de registo de alterações
http://support.microsoft.com/KB/2522893

CORRECÇÃO: Cópia de segurança falha no SQL Server 2008, SQL Server 2008 R2 ou SQL Server 2012 se activar as alterações na base de dados
http://support.microsoft.com/KB/2603910

CORRECÇÃO: Operação de cópia de segurança falhar numa base de dados SQL Server 2008, SQL Server 2008 R2 ou SQL Server 2012 depois de activar o registo de alterações
http://support.microsoft.com/KB/2682488

Apesar destas correcções impedir a continuar a aparecer linhas duplicadas de chaves, eles remove automaticamente as linhas duplicadas. Sem remover as linhas duplicadas, a base de dados afectado não é possível concluir a pontos de verificação de base de dados e as cópias de segurança poderão falhar.

Para remover as linhas duplicadas, utilize um dos seguintes métodos.

Método 1: Desactivar e activar o registo de alterações

  1. Desactive alterações na base de dados e tabelas afectadas.
  2. Emita um ponto de verificação de base de dados manual.
  3. Active o registo da base de dados afectada e tabelas de alterações.

Para mais informações sobre o registo de alterações, consulteActivar e desactivar o registo de alterações.

Para obter informações sobre como a emissão de um ponto de verificação manual, consulte Ponto de verificação (o Transact-SQL)

Método 2: Eliminar manualmente as linhas duplicadas

  1. Copie o script Transact-SQL no fim da secção "Resolução" para um editor de texto.
  2. Localize o <AFFECTED_DB>marcador de posição do script e substituí-la com o nome da base de dados afectado.</AFFECTED_DB>
  3. Guarde o script modificado para o disco rígido como um ficheiro .sql. Por exemplo:
    C:\temp\remove_duplicates.SQL
Se estiver a executar o SQL Server 2014, tem de conceder o controlo total por serviço SID para os ficheiros mssqlsystemresource.ldf e mssqlsystemresource.mdf. Todo, siga estes passos:
  1. Navegue para o directório Binn que corresponde ao seu ID de instância. Por exemplo:

    C:\Program Files\Microsoft SQL Server \<Instance id="">\MSSQL\Binn</Instance>
  2. Abra as propriedades de mssqlsystemresource.ldf e mssqlsystemresource.mdf e, em seguida, clique no separador segurança .
  3. Localize o SID de por serviço de serviço do SQL Server e tenha em atenção as permissões predefinidas:

    * Leia & executar
    * Leitura
  4. Conceder o serviço SQL Server por serviço controlo total do SID e, em seguida, feche as caixas de diálogo de permissões.
  5. Inicie o SQL Server no modo de utilizador único. Para mais informações, consulteIniciar o SQL Server no modo de utilizador único.
  6. Usea SQLCMDlinha de comandos para ligar ao SQL Server na ligação de administrador dedicada (DAC). Por exemplo:

    SQLCMD -S PRODSERV1\MSSQLSERVER - A -E -i c:\temp\remove_duplicates.sql
    Em seguida, execute o script Transact-SQL modificado.
  7. Iniciar o SQL Server no modo de multi-utilizadores e, em seguida, certifique-se de que as operações de ponto de verificação na base de dados afectados e de cópia de segurança concluídas com êxito. Se tiver sido utilizado o passo 4, reverta as permissões para os valores predefinidos.

Script 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

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 3083381 - Última Revisão: 09/25/2015 15:32:00 - Revisão: 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 KbMtpt
Comentários