Principais linhas duplicadas da tabela syscommittab no SQL Server

IMPORTANTE: Este artigo foi traduzido pelo software de tradução automática da Microsoft e eventualmente pode ter sido editado pela Microsoft Community através da tecnologia Community Translation Framework (CTF) ou por um tradutor profissional. A Microsoft oferece artigos traduzidos automaticamente por software, por tradutores profissionais e editados pela comunidade para que você tenha acesso a todos os artigos de nossa Base de Conhecimento em diversos idiomas. No entanto, um artigo traduzido pode conter erros de vocabulário, sintaxe e/ou gramática. A Microsoft não é responsável por qualquer inexatidão, erro ou dano causado por qualquer tradução imprecisa do conteúdo ou por seu uso pelos nossos clientes.

Clique aqui para ver a versão em Inglês deste artigo: 3083381
Sintomas
Quando você comparar o SYSCOMMITTABLE na memória e o arquivo em disco syscommittab no Microsoft SQL Server, você poderá ver linhas de chave duplicadas. Esses valores duplicados podem causar operações de backup e verificação falha.

Causa
Esse problema ocorre devido a um problema conhecido no controle de alterações do SQL Server.
Resolução
Para resolver os fatores que causam as chaves duplicadas, aplique uma das seguintes correções, conforme apropriado para sua situação:

CORREÇÃO: Uma operação de backup em um banco de dados do SQL Server 2008 ou SQL Server 2008 R2 falhará se você ativar este banco de dados de controle de alterações
http://support.microsoft.com/kb/2522893

CORREÇÃO: Falha de Backup no SQL Server 2008, SQL Server 2008 R2 ou no SQL Server 2012 se você ativar o controle de alterações no banco de dados
http://support.microsoft.com/kb/2603910

CORREÇÃO: Operação de Backup falhar em um banco de dados do SQL Server 2008, SQL Server 2008 R2 ou SQL Server 2012 depois que você ativar o controle de alterações
http://support.microsoft.com/kb/2682488

Embora essas correções impedem que linhas de chave duplicadas continuar a aparecer, eles não removem automaticamente linhas duplicadas. Sem remover linhas duplicadas, o banco de dados afetado não é possível concluir a pontos de verificação do banco de dados e backups podem falhar.

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

Método 1: Desativar e ativar o controle de alterações

  1. Desative o controle de alterações no banco de dados e tabelas afetadas.
  2. Execute um verificação de banco de dados manual.
  3. Habilite o controle de alterações no banco de dados afetado e tabelas.

Para obter mais informações sobre como controlar alterações, consulteHabilitar e desabilitar o controle de alterações.

Para obter informações sobre como executar uma verificação manual, consulte Ponto de verificação (Transact-SQL)

Método 2: Excluir manualmente as linhas duplicadas

  1. Copie o script do Transact-SQL no final da seção "Resolução" para um editor de texto.
  2. Localize o <AFFECTED_DB>espaço reservado no script e substituí-lo com o nome do banco de dados afetado.</AFFECTED_DB>
  3. Salve o script modificado para o disco rígido como um arquivo. SQL. Por exemplo:
    C:\temp\remove_duplicates.SQL
Se você estiver executando o SQL Server 2014, você deve conceder o controle total do SID por serviço para os arquivos mssqlsystemresource.ldf e mssqlsystemresource.mdf. Fazer isso, execute as seguintes etapas:
  1. Navegue até o diretório Binn que corresponde à sua ID de instância. Por exemplo:

    C:\Program Files\Microsoft SQL servidor \<Instance id="">\MSSQL\Binn</Instance>
  2. Abra as propriedades mssqlsystemresource.ldf e mssqlsystemresource.mdf e, em seguida, clique na guia segurança .
  3. Localize o SID de cada serviço de serviço do SQL Server e observe as permissões padrão:

    * Leia & executar
    * Leitura
  4. Conceder o serviço SQL Server controle total do SID por serviço e feche as caixas de diálogo de permissões.
  5. Inicie o SQL Server no modo de usuário único. Para obter mais informações, consulteInicie o SQL Server no modo de usuário único.
  6. Usea Sqlcmdlinha de comando para se conectar ao SQL Server em conexão de administrador dedicada (DAC). Por exemplo:

    Sqlcmd -S PRODSERV1\MSSQLSERVER - A -E -i c:\temp\remove_duplicates.sql
    Em seguida, execute o script modificado do Transact-SQL.
  7. Inicie o SQL Server no modo de vários usuário e verificar que operações de backup e ponto de verificação no banco de dados afetado concluem com êxito. Se a etapa 4 foi usada, reverta as permissões para os valores padrão.

Script do 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