Solution de contournement SQL Server Frozen Ghost Cleanup requise

15

J'ai plusieurs tables avec une quantité de lignes entre 5M et 1,5G

Chaque table a son champ BLOB, dont la taille varie de 100 octets à 30 Mo et qui est stocké en tant que «types de grande valeur hors ligne» = ON

Les tables sont stockées dans différents groupes de fichiers avec 3-4 fichiers chacun sur un disque différent @ différents LUN @ SAN très rapide

Chaque jour, ces tables grandissent pour une taille de 5 à 100 Go et avec des rangées de 600 000 à 1,5 million de lignes

Après un certain laps de temps , qui varie de 2 semaines à 6 mois, certaines des lignes sont supprimées ou déplacées vers la base de données d'archivage, donc - il n'y a aucune ligne dans les tables de travail datant de plus de 6 mois.

Configuration actuelle du serveur:

  • Le moteur du serveur SQL est 2008 R2 SP1 Enterprise @ 24 cœurs, @ 64 Go de RAM
  • SQL Server s'exécute avec des indicateurs de démarrage supplémentaires:

-T 3640; (Élimine l'envoi de messages DONE_IN_PROC au client pour chaque instruction dans la procédure stockée. Ceci est similaire au paramètre de session de SET NOCOUNT ON, mais lorsqu'il est défini comme indicateur de trace, chaque session client est traitée de cette façon)

-T 1118; (Commute les allocations dans tempDB de 1pg à la fois (pour les 8 premières pages) dans une certaine mesure.)

-T 2301; (permet des optimisations avancées spécifiques aux requêtes d'aide à la décision. Cette option s'applique au traitement d'aide à la décision de grands ensembles de données)

-T 1117; (agrandit tous les fichiers de données à la fois, sinon cela se passe à tour de rôle.)

-E; (Augmente le nombre d'extensions allouées à chaque fichier d'un groupe de fichiers. Cette option peut être utile pour les applications d'entrepôt de données qui ont un nombre limité d'utilisateurs exécutant des analyses d'index ou de données)

-T 834; (Oblige SQL Server à utiliser des allocations Windows pour les pages volumineuses pour la mémoire allouée au pool de mémoire tampon, http://msdn2.microsoft.com/en-us/library/aa366720.aspx , http://support.microsoft. com / kb / 920093 )

  • SQL Server utilise de grandes extensions de page
  • SQL Server utilise l' option d' initialisation rapide des fichiers
  • AUTOSHRINK est désactivé pour toutes les bases de données

Le problème est que, à partir d'un certain point de disponibilité du serveur (de quelques jours à plusieurs mois), le GHOST CLEANUPprocessus refuse d'effectuer des nettoyages forcés et de simplement faire son travail habituel - nettoie plusieurs pages en quelques secondes ( which is seen thru Extended Events), ce qui n'est pas approprié , car il n'est pas en mesure de nettoyer toutes les lignes supprimées

Le problème persiste depuis l'époque de SQL Server 2005 RTM Enterprise

Comment j'ai essayé de résoudre le problème:

  • J'ai essayé de forcer les opérations de numérisation sur les index cluster des tables
  • J'ai essayé de forcer les opérations de numérisation, ce qui implique tout le contenu de la colonne BLOB sur les index cluster des tables
  • système sp_clean_db_free_space & sp_clean_db_file_free_space
  • dbcc cleanpage manuellement (@dbid, @fileid, @page) pour tous les fichiers et pages de la base de données
  • reconstructions d'index cluster et réorganisation
  • recréer la base de données
  • DBCC FORCEGHOSTCLEANUP

  • Lorsque j'exécute la requête:

    select * 
    from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')

    Je vois des millions et des dizaines de millions d'enregistrements fantômes, mais uniquement pour le type d'unité d'allocation de LOB_DATA

Les seules choses qui aident:

  • arrêter le serveur avec la commande SHUTDOWN ou redémarrer l'hôte entier - cela aide, après le redémarrage, le processus GHOST CLEANUP s'exécute quelques heures et nettoie en fait tous les enregistrements fantômes
  • DBCC SHRINKFILE avec l'option EMPTYFILE - le déplacement de toutes les données d'un fichier vers un autre fichier ou des fichiers nouvellement créés nettoie les enregistrements fantômes dans ce fichier uniquement - le problème est que je déteste vraiment les opérations de réduction. Et cela prend 3-4 jours pour UN fichier

la question - existe-t-il un moyen de programmation (préférable) ou de maintenance pour forcer GHOST CLEANUP sans interruption du serveur, car le temps d'arrêt du serveur coûte trop cher, voire inacceptable - c'est de milliers à des dizaines de milliers de dollars par heure

Des problèmes ont été remarqués comme les miens:

Et c'est pareil ici:

Oleg Dok
la source

Réponses:

12

Enfin, MS a reconnu le problème comme un bogue: http://support.microsoft.com/kb/2622823

En bref: il est fixé dans

  • Sql Server 2008 SP3 CU4
  • Sql Server 2008 R2 CU10
  • Sql Server 2008 R2 SP1 CU4

Dans Sql Server 2012 SP1, je ne rencontre pas le problème pendant plus d'un an d'exécution.

Oleg Dok
la source
3

C'est le genre de question qui devrait être adressée aux CSS afin qu'ils puissent résoudre le problème avec vous. Vous avez probablement une assurance logicielle et un contrat de support. Si vous n'avez pas quelques centaines de dollars, cela ne devrait pas être si grave si le redémarrage de l'instance vous coûte des milliers de dollars par heure.

Avez-vous essayé de permettre à la base de données de se fermer puis d'être mise en ligne? Cela entraînera l'exécution de la récupération après incident et pourrait déclencher le nettoyage des fantômes.

Ecrivez-vous souvent à la table? Par fréquemment, je veux dire tout le temps?

En ce qui concerne MSKB 932115, voyez-vous que les enregistrements fantômes ne sont laissés que dans tous les fichiers, ou nettoie-t-il le premier fichier du groupe de fichiers?

Pourquoi utiliser -T1117 et init de fichier instantané?

mrdenny
la source
1. Je vais certainement aller au support MS. 2. Si je ferme la base de données, elle soulève environ 10 à 30 minutes en roulant d'avant en arrière, ce qui est inacceptable. 3. Le GC est en cours d'exécution, mais il ne traite pas les entrées de LOB hors ligne supprimées. 4. Écriture sur des tables fonctionnant constamment en fonction de l'heure de la journée, de 20 à 600 écritures par seconde et tout le temps. 5. Le premier fichier de DB n'est pas utilisé - il n'a pas de grandes tables et n'est utilisé que comme stockage système, donc - il n'y a tout simplement aucun enregistrement fantôme.
Oleg Dok
avec -T1117, je veux juste répartir toute la charge entre plusieurs fichiers, à la place quand il ne reste qu'un seul fichier du groupe de fichiers, où il y a encore de l'espace libre - il commence à ralentir sur les LATCH de PFS, l'initialisation instantanée du fichier minimise le temps de croissance du fichier, car un incrément est réglé sur 10-50 Go par tour. Je ne peux pas simplement définir des fichiers aussi gros que possible, car c'est complètement imprévisible - quels fichiers obtiendront leurs données aujourd'hui et dans quel volume. Il est plus simple de demander aux administrateurs SAN d'ajouter plus d'espace que de prédire à qui je devrais ajouter l'espace.
Oleg Dok