Sicherungskomprimierung, die Beschädigung in SQL 2017 TDE-Datenbank verursacht

13

In SQL Server 2017 (CU3) beschädigt der Sicherungsvorgang immer eine bestimmte Seite in der Datenbank, wenn ich die Sicherungskomprimierung für eine meiner TDE-Datenbanken aktiviere. Wenn ich das Backup ohne Komprimierung starte, wird es nicht beschädigt. Hier sind die Schritte, die ich unternommen habe, um dieses Problem zu überprüfen und zu reproduzieren:

  1. Führen Sie DBCC CheckDB in der Datenbank "TDE_DB1" aus. alles ist gut, keine Fehler;
  2. Sichern Sie die Datenbank erfolgreich ohne Komprimierung. RESTORE VERIFYONLY sagt, dass alles gut ist;
  3. Datenbank erfolgreich als "TDE_DB2" wiederherstellen; alles ist gut, DBCC CheckDB zeigt keine Fehler an;
  4. Sichern Sie erfolgreich die Datenbank "TDE_DB1" mit Komprimierung. RESTORE VERIFYONLY-Fehler mit der Meldung "Es wurde ein Schaden am Sicherungssatz festgestellt";
  5. Versuch, die Datenbank als "TDE_DB2" wiederherzustellen; Fehler mit der Meldung "RESTORE hat einen Fehler auf Seite (1: 92454) in der Datenbank festgestellt"
  6. Wiederholen Sie die Schritte 1-3. alles ist gut;
  7. DROP "TDE_DB1" und "TDE_DB2"; Stellen Sie "TDE_DB1" von der Sicherung wieder her; alles ist gut;
  8. Wiederholen Sie die Schritte 1-5. gleiche Ergebnisse erzielen;

Zusammenfassend lässt sich sagen, dass die Datenbank und regelmäßige Sicherungen in Ordnung sind. Wenn Sie CHECKDB für die Datenbank und VERIFYONLY für die Sicherungen ausführen, werden keine Fehler gemeldet. Das Sichern der Datenbank mit Komprimierung scheint die Beschädigung zu verursachen.

Unten finden Sie die Codebeispiele mit Fehlern. (Hinweis: Für die Komprimierung mit einer TDE-Datenbank ist MAXTRANSFERSIZE erforderlich. )

-- Good, completes with no corruption;
BACKUP DATABASE [TDE_DB1] TO DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM;
RESTORE VERIFYONLY FROM DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM;

RESTORE DATABASE [TDE_DB2]
FROM DISK = 'E:\MSSQL\Backup\TDE_DB1a.bak'
WITH MOVE 'DataFileName' to 'E:\MSSQL\Data\TDE_DB2.mdf'
,MOVE 'LogFileName' to 'F:\MSSQL\Log\TDE_DB2_log.ldf';


-- Bad, I haz corruption;
BACKUP DATABASE [TDE_DB1] TO DISK = N'E:\MSSQL\Backup\TDE_DB1b.bak' WITH CHECKSUM, COMPRESSION, MAXTRANSFERSIZE = 131072;
RESTORE VERIFYONLY FROM DISK = N'E:\MSSQL\Backup\TDE_DB1b.bak' WITH CHECKSUM;
-- ERROR
--Msg 3189, Level 16, State 1, Line 1
--Damage to the backup set was detected.
--Msg 3013, Level 16, State 1, Line 1
--VERIFY DATABASE is terminating abnormally.

RESTORE DATABASE [TDE_DB2]
FROM DISK = 'E:\MSSQL\Backup\TDE_DB1b.bak'
WITH MOVE 'DataFileName' to 'E:\MSSQL\Data\TDE_DB2.mdf'
,MOVE 'LogFileName' to 'F:\MSSQL\Log\TDE_DB2_log.ldf';
-- ERROR
--Msg 3183, Level 16, State 1, Line 7
--RESTORE detected an error on page (1:92454) in database "TDE_DB2" as read from the backup set.
--Msg 3013, Level 16, State 1, Line 7
--RESTORE DATABASE is terminating abnormally.

Ich habe dann versucht, die als fehlerhaft gemeldete Seite zu überprüfen (es ist immer dieselbe Seite.), Aber DBCC PAGE meldet, dass die ObjectId 0 ist. Laut diesem Artikel von Paul Randal wurden also keine Metadaten gefunden Einer der Gründe könnte sein, dass die Seite selbst beschädigt ist und falsche Werte verwendet wurden, um die Metadaten nachzuschlagen. Sein Rat ist, CHECKDB auszuführen, was ich nicht tun kann, weil das beschädigte Backup nicht wiederhergestellt werden kann.

Ich habe versucht, die Vorschläge aus diesem SO-Post (Hinzufügen von INIT und FORMAT zum Befehl BACKUP) zum Zurücksetzen der Metadaten zu verwenden, aber das schien nichts zu ändern. Die komprimierte Sicherung ist immer noch beschädigt.

Dies passiert nur mit einer meiner TDE-Datenbanken. Ich habe 4 andere TDE-Datenbanken auf dem gleichen Server, und sie haben dieses Problem nicht. Das sagt mir, dass es möglicherweise ein zugrunde liegendes Problem mit dieser bestimmten Datenbank gibt. Mir ist klar, dass die einfache Lösung darin besteht, keine Komprimierung zu verwenden, aber ich bin der Meinung, dass dies tatsächlich eine frühe Warnung für ein größeres Problem sein kann, das die Straße hinunterkommt.

Hat jemand dies jemals zuvor gesehen oder hat er eine Idee, warum die Komprimierung diese Seite beschädigen würde? An diesem Punkt bin ich ein bisschen ratlos, was als nächstes zu tun ist. Ich habe überlegt, die Seite von einem früheren Backup wiederherzustellen, aber ich denke nicht, dass das wichtig wäre, da die Seite in der regulären Datenbank in Ordnung zu sein scheint.

UPDATE 1: Nachfolgend sind die Ergebnisse von DBCC PAGE mit Option 0 aufgeführt:

DBCC-Ausführung abgeschlossen. Wenn DBCC Fehlermeldungen ausgibt, wenden Sie sich an Ihren Systemadministrator.

SEITE: (1: 92454)

PUFFER:

BUF @ 0x000002187AE55640

bpage = 0x000002184865E000 bhash = 0x0000000000000000
bpageno = (1: 92454) bdbid = 8 breferences = 0 bcputicks = 563 bsampleCount = 1
bUse1 = 51429 bstat = 0x809 blog
= 0x15a bnext = 0x00000000000000 bnext = 0x00

KOPFZEILE:

Seite @ 0x000002184865E000

m_pageId = (1: 92454) m_headerVersion = 111
m_type = 189 m_typeFlagBits = 0x2d m_level = 197
m_flagBits = 0x525e m_objId (AllocUnitId.idObj) = 788.815.194
m_indexId (AllocUnitId.idInd) = 515 Metadaten: AllocUnitId = 145011308798541824 Metadaten: PartitionID = 0 Metadata: IndexId = -1 Metadaten: ObjectId = 0 m_prevPage = (32842: 1881351155) m_nextPage = (13086: -560562340)
pminlen = 36067 m_slotCnt = 8149 m_freeCnt = 51871 m_freeData = 7295 m_reservedCnt = 4819: 720 14755
m_xdesId = (12811: 1559482793) m_ghostRecCnt = 12339
m_tornBits = -1381699202 DB Frag ID = 1

Zuordnungsstatus

GAM (1: 2) = ALLOCATED SGAM (1: 3) = NOT ALLOCATED
PFS (1: 88968) = 0x0 0_PCT_FULL DIFF (1: 6) = NOT CHANGED
ML (1: 7) = NOT MIN_LOGGED

Wenn ich versuche, DBCC PAGE mit anderen Optionen auszuführen, erhalte ich die folgenden Fehlermeldungen:

DBCC-SEITE mit Option 1: Meldung 0, Ebene 11, Status 0, Zeile 0 Beim aktuellen Befehl ist ein schwerwiegender Fehler aufgetreten. Die Ergebnisse sollten, falls vorhanden, verworfen werden.

DBCC PAGE mit Option 3: Meldung 2514, Ebene 16, Status 5, Zeile 3 Ein DBCC PAGE-Fehler ist aufgetreten: Ungültiger Seitentyp - Dump-Stil 3 nicht möglich.

UPDATE 2: Hier sind einige Ergebnisse aus dem DMO sys.dm_db_database_page_allocations:

object_id = 75 index_id = 1 rowset_id = 281474981625856 281474981625856 allocation_unit_id =
allocation_unit_type = 1 allocation_unit_type_desc = IN_ROW_DATA extent_file_id = 1 extent_page_id = 92448
allocated_page_iam_file_id = 1 allocated_page_iam_page_id = 104
allocated_page_file_id = 1 allocated_page_page_id = 92454
is_allocated = 0 = 0 is_iam_page is_mixed_page_allocation = 0

Eric Cobb
quelle

Antworten:

8

Dieses Problem betrifft anscheinend Datenbanken, auf denen SHRINK-Vorgänge ausgeführt wurden. In meinem Fall habe ich eine Kopie einer unserer Produktionsdatenbanken auf SQL Server 2014 (die bereits mit TDE verschlüsselt ist) erstellt, DBCC SHRINKFILE für die Daten- und Protokolldateien ausgeführt, dann eine Sicherung erstellt und diese in meinem neuen SQL wiederhergestellt 2017 Server. (Der Grund für die Verkleinerung war, die Größe zu reduzieren, um die Übertragung des Backups zu beschleunigen.)

Als Test habe ich eine Kopie der Datenbank wiederhergestellt, auf der ich DBCC SHRINKFILE nicht ausgeführt habe, und es gab keine Probleme mit der Beschädigung beim Komprimieren von Sicherungen.

Zusammenfassend sind die Ergebnisse meiner Tests wie folgt:

  • Normale Sicherungs- / Wiederherstellungsvorgänge für diese "verkleinerte" TDE-Datenbank funktionieren in SQL 2017 ordnungsgemäß
  • Das Komprimieren von Sicherungen der "verkleinerten" TDE-Datenbank scheint zu Beschädigungen in der Tabelle "sys.sysmultiobjrefs" zu führen
  • Das Komprimieren von Sicherungen der regulären TDE-Datenbank (ohne DBCC SHRINKFILE) funktioniert ordnungsgemäß und meldet keine Beschädigung

Ich weiß nicht, ob dies ein bestätigter Fehler in SQL Server 2017 ist, aber ich habe meine Ergebnisse an Microsoft gesendet, damit sie überprüft werden können.

Die Moral dieser Geschichte lautet also: SCHRINKEN SIE NICHT IN IHRE DATENBANKEN! JE! :)

Eric Cobb
quelle