Lignes de clé en double dans la table sys.syscommittab de SQL Server

IMPORTANT : Cet article est issu d'une traduction automatique réalisée par un logiciel Microsoft et non par un traducteur professionnel. Cette traduction automatique a pu aussi être révisée par la communauté Microsoft grâce à la technologie Community Translation Framework (CTF). Pour en savoir plus sur cette technologie, veuillez consulter la page http://support.microsoft.com/gp/machine-translation-corrections/fr. Microsoft vous propose en effet des articles traduits par des professionnels, des articles issus de traductions automatiques et des articles issus de traductions automatiques révisées par la communauté Microsoft, de manière à ce que vous ayez accès à tous les articles de notre Base de connaissances dans votre langue. Il est important de noter que les articles issus de la traduction automatique, y compris ceux révisés par la communauté Microsoft, peuvent contenir des erreurs de vocabulaire, de syntaxe ou de grammaire. Microsoft ne pourra être tenu responsable des imprécisions, erreurs, ainsi que de tout dommage résultant d’une traduction incorrecte du contenu ou de son utilisation par les clients.

La version anglaise de cet article est la suivante: 3083381
Symptômes
Lorsque vous comparez le SYSCOMMITTABLE en mémoire et le fichier sur disque sys.syscommittab dans Microsoft SQL Server, vous pouvez voir les lignes de clé en double. Ces valeurs en double peuvent entraîner l'échec des opérations de sauvegarde et de point de contrôle.

Cause
Ce problème se produit en raison d'un problème connu dans le suivi des modifications SQL Server.
Résolution
Pour résoudre les facteurs qui provoquent les clés en double, appliquer l'un des correctifs suivants, selon votre situation :

CORRECTIF : Une opération de sauvegarde sur une base de données SQL Server 2008 ou SQL Server 2008 R2 échoue si vous activez le suivi des modifications dans cette base de données
http://support.Microsoft.com/kb/2522893

CORRECTIF : Sauvegarde échoue dans SQL Server 2008 R2, SQL Server 2008 ou dans SQL Server 2012 si vous activez le suivi des modifications de la base de données
http://support.Microsoft.com/kb/2603910

CORRECTIF : Opération de sauvegarde ne fonctionne pas dans une base de données SQL Server 2008, SQL Server 2008 R2 ou SQL Server 2012 après avoir activé le suivi des modifications
http://support.Microsoft.com/kb/2682488

Bien que ces correctifs empêchent les lignes de clé en double de continuer à s'afficher, ils ne suppriment pas automatiquement les lignes en double. Sans supprimer les lignes en double, la base de données concernée ne peut pas effectuer des points de contrôle de base de données et sauvegardes peuvent échouer.

Pour supprimer les lignes en double, utilisez une des méthodes suivantes.

Méthode 1: Désactiver et activer le suivi des modifications

  1. Désactiver le suivi des modifications sur les tables concernées et de la base de données.
  2. Émettre un point de contrôle de la base de données manuelle.
  3. Activer le suivi des modifications sur les tables et la base de données concernée.

Pour plus d'informations sur le suivi des modifications, reportez-vous à la section.Activer et désactiver le suivi des modifications.

Pour plus d'informations sur la sortie d'un point de contrôle manuel, reportez-vous à la section. Point de contrôle (Transact-SQL)

Méthode 2: Supprimez manuellement les lignes en double

  1. Copiez le script Transact-SQL à la fin de la section « Résolution » dans un éditeur de texte.
  2. Recherchez la <AFFECTED_DB>espace réservé dans le script et le remplacer par le nom de la base de données affectée.</AFFECTED_DB>
  3. Enregistrer le script modifié sur votre disque dur sous la forme d'un fichier .sql. Par exemple :
    C:\temp\remove_duplicates.SQL
Si vous exécutez SQL Server 2014, vous devez accorder le contrôle total du SID par Service dans les fichiers mssqlsystemresource.ldf et mssqlsystemresource.mdf. TODO, procédez comme suit :
  1. Accédez au répertoire bin qui correspond à votre ID d'Instance. Par exemple :

    C:\Program Files\Microsoft SQL Server\<Instance id="">\MSSQL\Binn</Instance>
  2. Ouvrez les propriétés mssqlsystemresource.ldf et mssqlsystemresource.mdf, puis cliquez sur l'onglet sécurité .
  3. Recherchez l'identificateur de sécurité de SQL Server service par Service et notez les autorisations par défaut :

    * Lecture & d'exécution
    * Lecture
  4. Accordez le service SQL Server contrôle total de SID par Service et fermez les boîtes de dialogue d'autorisations.
  5. Démarrer SQL Server en mode mono-utilisateur. Pour plus d'informations, reportez-vous à la section.Démarrez SQL Server en mode mono-utilisateur.
  6. Procédure Sqlcmdligne de commande pour se connecter à SQL Server sous la connexion d'administrateur dédiée (DAC). Par exemple :

    Sqlcmd -S PRODSERV1\MSSQLSERVER - A -E -i c:\temp\remove_duplicates.sql
    Ensuite, exécutez le script Transact-SQL modifié.
  7. Démarrez SQL Server en mode multi-utilisateur et vérifiez que les opérations de sauvegarde et du point de contrôle sur la base de données affecté terminent avec succès. Si l'étape 4 a été utilisé, rétablissez les autorisations pour les valeurs par défaut.

Script 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

Avertissement : cet article a été traduit automatiquement

Propriétés

ID d'article : 3083381 - Dernière mise à jour : 09/25/2015 15:29:00 - Révision : 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 KbMtfr
Commentaires