Je rencontre des messages d'erreur étranges sur SQL Server 2017 CU3. Je migre des bases de données et réorganise des groupes de fichiers. Par "réorganiser", je veux dire que j'utilise une procédure stockée qui crée une fonction de partition et un schéma de partition sur le nouveau groupe de fichiers pour un objet, reconstruit les index pendant le partitionnement puis supprime le partitionnement.
À la fin, j'ai des groupes de fichiers vides. Leurs fichiers sont supprimés . Les groupes de fichiers eux-mêmes sont également supprimés. Cela fonctionne bien dans la plupart des cas. Cependant, pour deux bases de données, j'ai supprimé les fichiers ... il me reste un groupe de fichiers sans fichier associé mais
ALTER DATABASE REMOVE FILEGROUP
renvoie une erreur 5042:
Le groupe de fichiers 'xyz' ne peut pas être supprimé car il n'est pas vide.
Question
Comment puis-je me débarrasser de ce groupe de fichiers vide ... quel pourrait être le problème?
J'ai déjà lu certains problèmes courants, mais ils ne sont pas présents dans mon système:
Vérifié:
SELECT * FROM sys.partition_schemes; SELECT * FROM sys.partition_functions;
0 lignes ... aucun objet de partitionnement laissé dans la base de données
UPDATE STATISTICS
pour tous les objets de la base de donnéesaucun effet
Vérifie les index sur le groupe de fichiers:
SELECT * FROM sys.data_spaces ds INNER JOIN sys.indexes i ON ds.data_space_id = i.data_space_id WHERE ds.name = 'xyz'
0 lignes
Recherche les objets dans le groupe de fichiers:
SELECT au.*, ds.name AS [data_space_name], ds.type AS [data_space_type], p.rows, o.name AS [object_name] FROM sys.allocation_units au INNER JOIN sys.data_spaces ds ON au.data_space_id = ds.data_space_id INNER JOIN sys.partitions p ON au.container_id = p.partition_id INNER JOIN sys.objects o ON p.object_id = o.object_id WHERE au.type_desc = 'LOB_DATA' AND ds.name ='xyz'
0 lignes
J'ai également essayé le DBCC SHRINKFILE
paramètre EMPTYFILE
avant de supprimer le fichier du groupe de fichiers. Cela n'a pas vraiment de sens pour moi, mais j'ai lu des solutions pour décrire cela comme un correctif. N'a eu aucun effet de toute façon.
J'ai eu un peu d'espoir en lisant cette question sur la défaillance du serveur et j'ai essayé ce qui suit:
- Mettre à jour toutes les statistiques
- Supprimer toutes les statistiques qui ne sont pas liées aux index
Mais cela n'a eu aucun effet. J'ai toujours un groupe de fichiers sans fichier associé et le groupe de fichiers ne peut pas être supprimé. Je suis totalement perplexe car cela se produit dans certaines bases de données et pas dans d'autres (avec la même structure). Lorsque j'exécute DBCC CHECK FILEGROUP
sur ce groupe de fichiers vide, je reçois un tas de messages d'erreur comme celui-ci:
Impossible de traiter l'ID de jeu de lignes 72057594712162304 de l'objet "STORY_TRANSLATIONSCCC" (ID 120387498), index "Ref90159CCC" (ID 2), car il réside dans le groupe de fichiers "CCC_APPLICATION_new" (ID 8), qui n'a pas été vérifié.
Résultats DBCC pour 'STORY_TRANSLATIONSCCC'. Il y a 0 lignes dans 0 pages pour l'objet "STORY_TRANSLATIONSCCC".
Est-ce normal ou indique-t-il quelque chose d'inhabituel?
Cette question peut être un doublon, mais je ne trouve pas de correctif pour moi dans d'autres questions sur dba.stackexchange. Veuillez consulter la liste de ce que j'ai déjà essayé. Ceci est identique aux solutions décrites dans Impossible de supprimer les groupes de fichiers inutilisés .
Plus de détails
Peut-être que cela aide à comprendre ce que je fais avant que l'erreur ne se produise. Je prévois une migration vers un nouveau serveur. Je teste actuellement cela sur une instance de test. Les bases de données sont restaurées à partir du serveur prod et le modèle de récupération est passé à simple. Mon objectif est de restructurer les groupes de fichiers et de passer d'un modèle avec un fichier par groupe de fichiers à un modèle avec deux fichiers par groupe de fichiers. Pour y parvenir, je crée de nouveaux groupes de fichiers vides avec deux fichiers chacun et je déplace les données. Malheureusement, la plupart des objets ont des données LOB (XML et binaires) ... j'utilise donc le partitionnement comme une aide pour déplacer les données lob également. À la fin, toutes les données résident dans les nouveaux groupes de fichiers et les anciens groupes de fichiers sont vides. Ensuite, je supprime tous les fichiers et supprime également le groupe de fichiers respectif. Le groupe de fichiers principal reste et obtient juste un autre fichier ajouté.ma question . Ce processus fonctionne bien mais dans deux bases de données, les fichiers peuvent être supprimés mais pas le groupe de fichiers. Étonnamment, la structure de ces bases de données devrait être la même que celle des autres bases de données où aucun problème n'a été rencontré lors du déplacement des données et de la suppression des anciens groupes de fichiers.
Voici donc une liste des groupes de fichiers et des fichiers des deux bases de données où le problème se produit:
- CCC_GENTE
avant
+-----------------+------------+
| Filegroup | Filename |
+-----------------+------------+
| CCC_APPLICATION | CCC_APP |
+-----------------+------------+
| CCC_ARCHIVE | CCC_ARCHIV |
+-----------------+------------+
| CCC_AXN | CCC_AXN |
+-----------------+------------+
| CCC_GDV | CCC_GDV |
+-----------------+------------+
| PRIMARY | CCC |
+-----------------+------------+
après
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| Filegroup name | Filegroup temporary name | Filename (logical) | Status |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_APPLICATION | - | CCC_APP | file removed, filegroup cannot be removed (error) |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_ARCHIVE | - | CCC_ARCHIV | file and filegroup removed |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_AXN | - | CCC_AXN | file and filegroup removed |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_GDV | - | CCC_GDV | file and filegroup removed |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| PRIMARY | - | CCC | file renamed to PRIMARY_1 |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| PRIMARY | - | PRIMARY_2 | new file added |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_APPLICATION | CCC_APPLICATION_new | CCC_APPLICATION_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_APPLICATION | CCC_APPLICATION_new | CCC_APPLICATION_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_ARCHIVE | CCC_ARCHIVE_new | CCC_ARCHIVE_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_ARCHIVE | CCC_ARCHIVE_new | CCC_ARCHIVE_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_AXN | CCC_AXN_new | CCC_AXN_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_AXN | CCC_AXN_new | CCC_AXN_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_GDV | CCC_GDV_new | CCC_GDV_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_GDV | CCC_GDV_new | CCC_GDV_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
J'espère que ça aide un peu. Il y a aussi une deuxième base de données où les noms de groupes de fichiers sont différents, mais je laisse cela pour plus de brièveté.
la source
Réponses:
Vérification des groupes de fichiers dans la base de données
Vérifiez que le groupe de fichiers ne contient aucun fichier attaché en exécutant la commande suivante:
Cela produira une liste de groupes de fichiers:
... puis pour chaque groupe de fichiers répertorié, exécutez
La sortie pourrait ressembler à ceci:
.... et la deuxième sortie pourrait être:
Suppression du groupe de fichiers
Si vous avez toujours un fichier associé à l'un de vos groupes de fichiers, la commande complète pour supprimer le fichier logique du groupe de fichiers et le groupe de fichiers lui-même serait:
Le groupe de fichiers 'xyz' est par défaut
Si vous recevez un message d'erreur lorsque vous essayez de supprimer le fichier logique du groupe de fichiers qui ressemble à ceci:
... alors vous devrez définir le groupe de
PRIMARY
fichiers comme groupe deDEFAULT
fichiers:Le groupe de fichiers 'xyz' est en lecture seule
Cependant, si le message d'erreur est le suivant:
... alors vous devrez supprimer la propriété READ_ONLY du groupe de
xyz
fichiers:Vous devriez maintenant pouvoir supprimer le fichier logique du groupe de fichiers et le groupe de fichiers lui-même.
Transactions ouvertes
Si vous n'avez vraiment pas de fichier (nom_logique / nom_fichier_pyhsique) associé au groupe de fichiers que
xyz
vous essayez de supprimer, alors effectuer une sauvegarde du journal des transactions peut libérer toutes les transactions empêchant la suppression ultérieure du groupe de fichiers.Composez le 911
Si tout le reste échoue, vous voudrez peut-être envisager d'ouvrir un appel avec Microsoft.
Inadéquation des métadonnées
Ajouté après de nouvelles recherches
Apparemment, il existe des cas où les métadonnées de la base de données ne reflètent pas l'emplacement réel des objets.
Référence:
- CORRECTIF: Erreur d'incohérence des métadonnées après avoir changé de partition de table et supprimé les fichiers et groupes de fichiers correspondants (Support Microsoft)
- CORRECTIF: Une erreur se produit lorsque vous essayez de supprimer ou de supprimer des groupes de fichiers ou des schémas de partition et des fonctions dans SQL Server (Support Microsoft)
Ces deux cas semblent avoir été résolus avec la mise à jour cumulative 3 pour SQL Server 2014 SP1 et la mise à jour cumulative 1 pour SQL Server 2016 respectivement. Ils ne s'appliquent pas à votre situation, mais ils montrent que parfois les métadonnées peuvent être erronées.
L'élément qui semble bloquer la suppression de votre groupe de fichiers est l'index, qui peut être stocké avec des métadonnées incorrectes.
Solution possible
Envisagez de reconstruire l'index
Ref90159CCC
référencé dans le message d'erreur.L'article suivant décrit une situation similaire et montre comment l'auteur a détecté le coupable et a résolu la situation.
Référence: SQL Server: changement de partition et problème d'incohérence des métadonnées (Blog dbi-services.com)
Rechercher des objets liés à un groupe de fichiers obsolètes
J'ai truqué ce script pour vérifier autant de cachettes possibles pour les tables / index / partitions / etc. qui pourrait toujours être lié au fichier de groupe de fichiers supprimé:
Veuillez remplacer
DEFAULTRO
par le nom de votre groupe de fichiers obsolète (par exempleCCC_APPLICATION
)Référence: Mon script personnel
Exécutez-le et voyez si des objets sont affichés contenant votre groupe de fichiers obsolète. Allez avec le
data_space_id
plutôt qu'avec le nom. Les jointures visent intentionnellementFULL
à attraper toutes les références "orphelines".Vous pouvez également utiliser ce petit script pour vérifier rapidement les éléments du groupe de fichiers obsolètes:
Référence: SQL SERVER - Liste de tous les objets créés sur tous les groupes de fichiers de la base de données (SQLAuthority.com)
la source
...CCC_APPLICATION_new...
; est-ce le groupe de fichiers temporaire?) Quelques réflexions supplémentaires et essayer de reproduire dans mon environnement.Après quatre mois, le support Microsoft a trouvé une solution. Il y avait en effet un tableau faisant référence à ce groupe de fichiers vraisemblablement vide.
Le tableau a été identifié par la déclaration suivante:
Après avoir déplacé les données vers une nouvelle table et supprimé la table problématique, le groupe de fichiers a été supprimé avec succès. Le processus de déplacement des données était le suivant: créer une nouvelle table avec la même structure et les mêmes index, copier les données via SELECT INTO, supprimer l'ancienne table, renommer la nouvelle table (et bien sûr, prendre soin des clés étrangères s'il y en a dans tout le processus) )
la source