Summary: dans ce billet, nous allons parler de la cause profonde de la corruption au niveau de la page dans le serveur SQL. Nous discuterons également des moyens de réparer la corruption et de restaurer la base de données. De plus, vous découvrirez un logiciel de réparation de base de données SQL qui peut facilement réparer une base de données corrompue et restaurer tous ses objets.
Les bases de données peuvent être corrompues à tout moment et c’est un problème préoccupant pour les administrateurs de bases de données, car cela met en danger toutes les données cruciales du serveur SQL. De plus, les données deviennent inaccessibles, ce qui a un impact sur le flux de travail de l’organisation. Il est donc important de remédier immédiatement à la corruption. Cependant, il est tout aussi important de comprendre les causes de la corruption, sinon elle se reproduira. Ce blog couvre les informations essentielles sur la façon de réparer une corruption de page dans le serveur SQL.
Causes de la corruption au niveau des pages de SQL Server
Voici quelques raisons majeures qui peuvent entraîner une corruption de la base de données du serveur SQL.
-
Bug logiciel dans le programme SQL Server : Dans ce cas, les données sont mal écrites sur le disque. Consultez ces documents Microsoft :
- KB2548593 – CORRECTIF : corruption de la base de données si la compression des données est activée sur une table partitionnée dans SQL Server 2008.
- KB2803994 – CORRECTIF : la corruption des données se produit lorsque les données LOB sont chargées dans une variable Transact-SQL dans SQL Server 2008 R2, SQL Server 2012 ou SQL Server 2008.
On peut éviter ce type de problème en installant la dernière mise à jour cumulative (CU) de la version du serveur SQL.
- Problèmes de mémoire : Il s’agit de problèmes matériels qui peuvent affecter l’ensemble du système et pas seulement le serveur MS SQL. Il existe des programmes permettant de vérifier l’exactitude des données en mémoire.
- Problèmes de sous-système d’E/S : Dans ce cas, il n’est pas facile de comprendre la cause du problème car le système de stockage peut avoir une architecture compliquée. Par exemple, avant d’écrire sur le disque physique, il se peut que nous devions traverser un réseau ou que nous ayons un contrôleur de disque et ses pilotes. Chacun de ces composants peut tomber en panne.
- Arrêt soudain du serveur : Il existe un risque important de corruption de la base de données si, pour une raison quelconque, le serveur s’arrête soudainement. Cela peut se produire en raison d’une défaillance physique du serveur ou d’une panne d’électricité.
Comment détecter une corruption au niveau de la page dans le serveur SQL ?
Les bases de données MS SQL Server sont constituées de pages de données de 8 Ko. Huit pages physiquement contiguës constituent une extension, dont la taille est de 64 Ko. La corruption de page signifie qu’une ou plusieurs pages contiennent des valeurs incorrectes.
Si la base de données est corrompue, nous pouvons le vérifier de trois manières :
1. L’exécution de l’instruction SELECT sur la table corrompue génère une erreur.
Dans ce cas, le message d’erreur s’affiche :
- Le type d’erreur (ici, nous avons une erreur d’E/S basée sur la cohérence logique, causée par une somme de contrôle incorrecte).
- La page où se trouve l’erreur (page 1:368).
- Le décalage où l’erreur est trouvée (0x00000002e0000).
- L’ID de la base de données corrompue (ID=31).
2. Exécutez l’instruction DBCC CHECKDB
Cette commande vérifie l’intégrité physique et logique des objets de la base de données, les relations entre les index et d’autres contrôles structurels. Il suffit de taper DBCC CHECK avec le nom de la base de données entre crochets.
Dans ce cas, l’erreur apparaît :
- Le nombre de pages corrompues (page 1:368).
- Le nom de la table corrompue (personne).
3. Exécutez SELECT sur la table [msdb].[dbo].[suspect_pages].
La commande SELECT renvoie une grille contenant une ligne pour chaque page corrompue. Dans ce cas, nous pouvons voir que sur la base de données avec ID = 31, la page 1:368 est corrompue.
Comment corriger une corruption au niveau de la page dans SQL Server ?
Nous avons mentionné ici deux méthodes différentes pour réparer et récupérer la base de données.
1. Récupération manuelle via des commandes T-SQL
Note : Effectuez une sauvegarde des bases de données et/ou une copie des fichiers physiques avant de procéder. Le processus manuel est risqué.
Pour procéder à la récupération manuelle via les commandes T-SQL afin de corriger la corruption de page dans le serveur SQL, suivez les instructions ci-dessous.
Utilisez la commande DBCC IND non documentée pour vous assurer que la page 368 est une page de données.
DBCC IND('Recovery_test',Person,-1)
Cette commande affiche toutes les pages relatives au tableau indiqué dans le deuxième paramètre, avec les informations relatives au type de page. Dans l’exemple ci-dessous,
- La première ligne a le type de page 10. Il s’agit donc de la page Index Allocation Map (IAM).
- La deuxième ligne a le type de page 1. Elle indique que la page 368 contient des données.
Pour afficher les données contenues dans la page 1:368, nous pouvons ouvrir le fichier recovery_test.mdf à l’aide d’un éditeur hexadécimal et aller jusqu’à l’offset 2e0000.
Le caractère rouge “b” (voir l’image ci-dessous) semble suspect puisque mon nom est “Luca” et non “Lucb”.
2. Utilisez la commande DBCC PAGE :
Pour obtenir le résultat de la commande DBCC PAGE, l’indicateur de trace 3604 doit d’abord être activé.
DBCC TRACEON (3604)
DBCC PAGE('Recovery_test',1,368,2) AVEC TABLERESULTS
Les paramètres requis sont les suivants :
- Nom de la base de données
- Numéro du fichier
- Numéro de la page
- PRINTOPT
Les valeurs du paramètre printopt sont les suivantes :
- 0 – Il imprime l’en-tête de la page.
- 1 – En-tête de la page SQL avec les vidages hexagonaux par ligne.
- 2 – Détails de l’en-tête de la page avec le fichier hexadécimal complet de la page.
- 3 – En-tête de la page avec description de l’interprétation par ligne.
Les données présentées sont les mêmes.
Nous devons changer la valeur du caractère de la valeur hexadécimale 62 (b) à la valeur hexadécimale 61 (a).
Nous pouvons utiliser une autre commande non documentée, à savoir la commande DBCC WRITEPAGE. Il s’agit d’une commande puissante qui permet d’écrire directement sur une page.
Pour utiliser la commande DBCC WRITEPAGE, nous avons besoin des informations suivantes :
- Le premier paramètre est le nom de la base de données.
- Le deuxième et le troisième sont le fileId et le PageId que je dois modifier (1 : 368).
- Le quatrième paramètre est le décalage (hex.74 -> 116 déc.) et le cinquième est le nombre de caractères que nous allons écrire (1).
- Le sixième paramètre est la valeur que je dois écrire. Dans notre cas, il s’agit de 0x000000.
- Le septième paramètre indique s’il faut écrire la valeur par l’intermédiaire du pool de tampons. Nous avons choisi la valeur 1 pour écrire directement dans le fichier physique mdf.
Tout d’abord, mettez la base de données en mode SINGLE_USER :
ALTER DATABASE recovery_test SET SINGLE_USER WITH ROLLBACK IMMEDIATE
Exécutez ensuite la commande WRITEPAGE :
DBCC WRITEPAGE ('recovery_test', 1, 368, 116, 1, 0x61,1)
Exécutez-la à nouveau pour voir si les données ont changé :
DBCC TRACEON (3604)
DBCC PAGE('Recovery_test',1,368,2) AVEC TABLERESULTS
Oui, les données ont changé.
Mettre la base de données en mode MULTI_USER :
ALTER DATABASE recovery_test SET MULTI_USER WITH ROLLBACK IMMEDIATE
Vérifier l’état de santé de la base de données :
DBCC CHECKDB ('recovery_test')
Le journal indique qu’il n’y a pas d’erreur. Cela signifie que la base de données n’est plus corrompue.
Réparer la base de données à l’aide de Stellar Repair for MS SQL
Considérons que le problème que nous avons résolu manuellement est un cas remarquablement simple. Mais la réparation de cas de corruption complexes nécessite des connaissances avancées et implique le risque d’endommager davantage de données. Cependant, une application spécialisée telle que Stellar Repair for MS SQL peut résoudre le même problème de manière sûre et rapide. Quelques étapes simples suffisent pour récupérer une base de données corrompue. Ces étapes sont les suivantes :
- Lancez l’application Stellar Repair for MS SQL.
- Au démarrage, l’application vous demande de sélectionner la base de données à récupérer. Indiquez un fichier avec l’extension .mdf.
- Vous pouvez ensuite choisir de récupérer également les enregistrements supprimés.
- Appuyez sur le bouton Réparer.
- Il existe deux modes de récupération : Standard et Avancé.
La structure de la base de données sera analysée pour réparation. Une barre de progression indique l’état d’avancement du travail.
- Le résultat de cette phase de numérisation est sauvegardé. Vous pouvez donc le réutiliser. L’interface graphique permet de visualiser tous les objets de la base de données.
- La dernière étape consiste à enregistrer les données récupérées. Nous pouvons enregistrer les données dans une nouvelle base de données, dans une base de données existante ou dans un autre format (CSV, XLS ou HTML).
- Lorsque vous sélectionnez l’option Nouvelle base de données, vous êtes invité à indiquer le nom de la base de données à créer. Les données seront copiées dans la base de données générée.
En conclusion
La base de données SQL est corrompue pour diverses raisons. Dans cet article, nous avons discuté des causes de la corruption au niveau des pages dans SQL Server. Nous avons également vu comment détecter la corruption dans la base de données et comment réparer la base de données corrompue manuellement via les commandes T-SQL et en utilisant le logiciel de réparation SQL. Le logiciel peut faire un travail remarquable en résolvant le problème et en remettant la base de données en parfait état de fonctionnement.