web-dev-qa-db-fra.com

La sauvegarde détecte la corruption, mais CheckDB ne fait pas

J'ai une base de données où j'exécute la commande de sauvegarde

BACKUP DATABASE [MyDatabase] TO     
DISK =  'G:\Backup\MyDatabase_01_01_2018.bak'   
WITH    NOFORMAT, NOSKIP, COMPRESSION, INIT, BUFFERCOUNT = 100

Je reçois le message d'erreur

MSG 3043, niveau 16, état 1, ligne 8
[.____] Backup 'MyDatabase' détecta une erreur à la page (1: 745345) dans le fichier 'F:\Data\myDatabase_1.ndf'.
[.____] MSG 3013, niveau 16, état 1, ligne 8
La base de données de sauvegarde se termine anormalement.

J'ai couru un checkdb complet mais cela revient propre. J'ai remarqué que l'option Vérifier la page avait été définie sur Aucun (pas que je le fais), donc je l'ai modifié à la somme de contrôle et reconstruisez tous les index de la DB pour l'obtenir pour écrire à toutes les pages et générer des checksums. Après cela, la sauvegarde échoue et le checkdb montre toujours propre (donc pas de changement).

DBCC CHECKDB('MyDatabase') WITH NO_INFOMSGS, ALL_ERRORMSGS,
DATA_PURITY, EXTENDED_LOGICAL_CHECKS;

du journal SQL:

Dbcc checkdb (mydatabase) avec all_errormsgs, no_infomsgs, data_purity exécuté par XXX trouvé 0 erreurs et réparé 0 erreurs. Temps écoulé: 0 heures 21 minutes 46 secondes. Snapshot de base de données interne a Split Point LSN = 000AB776: 0000112F: 0001 et premier LSN = 000AB776: 0000112D: 0001.

J'ai couru à la page DBCC, mais il est erroné (ne semble même pas retourner la bonne page en premier lieu). Je peux l'exécuter avec l'option d'impression 2 et cela revient mais honnêtement, je ne sais pas ce que je cherche là-bas.

DBCC PAGE ('MyDatabase',1,745345,3)
 Page: (3: 513793) [.____] 
 tampon: 
 [.____] [.____] [.____] buf @ 0x00000003811f8280 
 bpage = 0x00000000f2d70000 bhash = 0x0000000000000000 bpageno = (1: 745345) 
 bdbid = 5 brise = 0 bcpouttics = 0 
 bsamplecount = 0 Buse1 = 44283 bstat = 0x809 
 blog = 0x5adb215a bnext = 0x0000000000000000 
 
 Rubrique de page: 
 [.____] Page @ 0x000000f2d70000 
 M_PAGEID = (3: 513793) M_HeaderVersion = 1 m_type = 2 [.____] M_TYPEFLAGBITS = 0x4 m_level = 0 m_FLAGBITS = 0x0 [.____] M_Objid (allOnitid.idobj) = 1075937538 m_indexid (allocunitid.idind) = 2 
 Metadata: Allocunitid = 633462595911680 Métadonnées: PartitionID = 0 
 Metadata: indexID = -1 Metadata: ObjectId = 0 m_prevpage = (3: 513795) [.____] M_NextPage = (3: 513820) PMInlen = 17 m_slotcnt = 426 [.____] M_FREECNT = 2 M_FREEDATA = 7338 M_RESERVEDCNT = 0 [.____] = (608841: 643611: 411) m_xactreserved = 0 m_xdesid = (0: 0) 
 M_GHOSTRECCNT = 0 M_TORNBITS = 0 dB frag Id = 1 [ ] [.____] gam (1: 511232) = SGAM alloué (1: 511233) = non attribué 
 PFS (1: 744096) = 0x40 alloué 0_pct_full diff (1: 511238) = non changé 
 Ml (1: 511239) = pas min_logged 

MSG 2514, niveau 16, état 8, ligne 20
[.____] une erreur de page DBCC s'est produite: Métadonnées de la page non valide - Style de vidage 3 non possible.

Des idées ce que je pourrais essayer ensuite? La version du serveur est

select @@version
 Microsoft SQL Server 2014 (SP2-CU11) (KB4077063) - 12.0.5579.0 (x64) [.____] Le 21 février 2018 12:19:47 
 Copyright (C) Microsoft Corporation 
 Édition Développeur (64 bits) sur Windows NT 6.3 (Build 9600 :) (Hypervisor)

Le niveau de compatibilité de la DB est de 100 (SQL 2008).

12
Element Zero

Cette réponse est tirée d'une question de la lettre d'information sqlskills.com écrite par Paul Randal, à propos de "une base de données qui échouerait une sauvegarde avec des erreurs de somme de contrôle de page, mais a passé un DBCC CHECKDB".

La seule fois que cela peut arriver est quand une étendue mélangée est une étendue mélangée (où les 8 pages peuvent être attribuées à 8 unités d'allocations différentes - voir ici ) et Certaines pages sont marquées par erreur comme allouées par la page PFS correspondante.

Lorsque cela se produit, DBCC CHECKDB Ne tentera pas de lire ces pages, car elle dérive quelles pages à lire dans les pages IAM d'une unité d'allocation (la première desquelles répertorie les pages attribuées dans une mesure mélangée). Ce cas est un écart dans la logique de détection de corruption DBCC CHECKDB.

[Parce] DBCC CHECKDB Impossible de détecter la corruption, il n'était pas possible de faire les réparations nécessaires pour les réparer. Ainsi, en utilisant DBCC WRITEPAGE , j'ai élaboré les modifications nécessaires dans l'état de l'allocation des pages allouées à tort, directement dans la page PFS, et cela fonctionnait!

C'était un cas extrêmement rare - il est beaucoup plus commun qu'un DBCC CHECKDB Échoue, mais une sauvegarde réussirait.

À mon avis, la résolution de Paul est bien au-delà de l'exportation et de l'importation des données comme vous l'avez fait, alors je pense que vous avez fait la bonne chose.

9
Randolph West