TDE-fähige Datenbank kann nicht wiederhergestellt werden, wenn MAXTRANSFERSIZE und CHECKSUM verwendet werden

10

Update : @AmitBanerjee - Senior Program Manager für die Microsoft SQL Server-Produktgruppe hat bestätigt, dass MS das Problem untersuchen wird, da es sich um einen Defekt handelt.

Hat jemand Probleme beim Wiederherstellen von Sicherungen festgestellt, die auf SQL Server 2016 mit aktiviertem TDE und unter Verwendung von MAXTRANSFERSIZE> 65536 erstellt wurden (in meinem Fall habe ich 65537 ausgewählt, damit ich die TDE-Datenbank komprimieren kann ) und CHECKSUM?

Unten ist ein Repro:

--- create database 
create database test_restore
go
-- create table
create table test_kin (fname char(10))
go
-- Enable TDE 

use master
GO
CREATE CERTIFICATE test_restore WITH SUBJECT = 'test_restore_cert'
GO
SELECT name, pvt_key_encryption_type_desc, * FROM sys.certificates WHERE name = 'test_restore'
GO
use test_restore
go
CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_128 ENCRYPTION BY SERVER CERTIFICATE test_restore
GO 
alter database test_restore set encryption ON

Nehmen Sie nur eine vollständige Sicherungskopie. Machen Sie es zweimal.

backup database test_restore 
to disk = 'D:\temporary-short-term\test_restore_KIN_test_restore_1.bak' -- change as per your location !!
with init, stats =10  -- overwrite ..using INIT !!
, maxtransfersize = 65537
, compression
,CHECKSUM

Jetzt mach ein verifyonly...

restore verifyonly from disk = 'D:\temporary-short-term\test_restore_KIN_test_restore_1.bak'

Fehlermeldung :

Meldung 3241, Ebene 16, Status 40, Zeile 11 Die Medienfamilie auf Gerät 'D: \ temporär-kurzfristig \ test_restore_KIN_test_restore_1.bak' ist falsch gebildet. SQL Server kann diese Medienfamilie nicht verarbeiten. Meldung 3013, Ebene 16, Status 1, Zeile 11 VERIFY DATABASE wird abnormal beendet.

Ergebnisse (1 = EIN, 0 = AUS) mit verschiedenen Kombinationen:

+-------------------------+-------------+----------+--------+
| MAXTRANSFERSIZE (65537) | COMPRESSION | CHECKSUM | RESULT |
+-------------------------+-------------+----------+--------+
|                       1 |           1 |        1 | FAIL   |
|                       1 |           1 |        0 | PASS   |
|                       1 |           0 |        1 | FAIL   |
|                       0 |           0 |        0 | PASS   |
|                       0 |           1 |        1 | PASS   |
|                       0 |           1 |        0 | PASS   |
+-------------------------+-------------+----------+--------+

Das Problem tritt auf:

Microsoft SQL Server 2016 (RTM-CU1) (KB3164674) - 13.0.2149.0 (X64) 11. Juli 2016 22:05:22 Copyright (c) Microsoft Corporation Enterprise Edition (64-Bit) unter Windows Server 2012 R2 Standard 6.3 (Build 9600) :)

Kin Shah
quelle

Antworten:

6

Ich konnte Ihr Problem reproduzieren.

Das Hinzufügen FORMATzum BACKUPBefehl hat es für mich gelöst.

Ich kann zwar keine konkrete Dokumentation finden, aber meiner Meinung nach hängt dies damit zusammen, dass INITder vorhandene Medienheader im Sicherungssatz beibehalten wird, während FORMATein neuer Medienheader erstellt wird.

Ich recherchiere noch an diesem Problem und wenn ich zusätzliche Informationen finde, werde ich diese Antwort aktualisieren.

Scott Hodgin
quelle
Ja, der FORMATHeader wird auch überschrieben und es passiert nicht, wenn er verwendet wird FORMAT. Dies ist jedoch ein Rätsel, warum der Backup-Header (oder das Backup als Ganzes) bei der Verwendung von MAXTRANSFERSIZEund CHECKSUMzusammen mit INIT beschädigt wird . Dies geschah nie bei niedrigeren Versionen, aber bei diesen gab es keine MAXTRANSFERSIZE. Danke für deine Antwort. Wird dies offen halten, wenn jemand mehr Informationen hat.
Kin Shah
3

Anscheinend wurde dies mit KB 4032200 behoben:

Aus diesem Eintrag:

Symptome

Angenommen, Sie aktivieren TDE (Transparent Data Encryption) für eine Datenbank in Microsoft SQL Server 2016. Sie versuchen, die Datenbank mithilfe der BACKUP DATABASET-SQL-Anweisung zu sichern , für die sowohl COMPRESSIONals auch die INITOption angegeben sind. In diesem Szenario stellen Sie möglicherweise fest, dass die vorhandene Sicherungsdatei durch die neue Sicherungsdatei überschrieben wird und die neue Sicherungsdatei nicht komprimiert wird.

Auflösung

Dieses Problem wurde in den folgenden kumulativen Updates für SQL Server behoben:

Paul White 9
quelle
1

Dies scheint möglicherweise dasselbe Problem zu sein, auf das der Blog-Beitrag, auf den Sie in Ihrer Frage verwiesen haben, später aktualisiert wurde, um auf Folgendes zu verweisen:

Update 6. April 2017

Wir haben kürzlich einige Probleme im Zusammenhang mit der Verwendung von TDE und der Sicherungskomprimierung in SQL Server 2016 entdeckt. Während wir sie beheben, finden Sie hier einige Tipps, mit denen Sie vermeiden können, auf diese bekannten Probleme zu stoßen:

  • Derzeit ist es nicht ratsam, gestreifte Backups mit TDE und Backup-Komprimierung zu verwenden

  • Wenn Ihre Datenbank über virtuelle Protokolldateien (VLFs) verfügt, die größer als 4 GB sind, verwenden Sie für Ihre Protokollsicherungen keine Sicherungskomprimierung mit TDE. Wenn Sie nicht wissen, was ein VLF ist, beginnen Sie hier .

  • Vermeiden Sie vorerst die Verwendung von WITH INIT, wenn Sie mit TDE und Backup-Komprimierung arbeiten. Stattdessen können Sie jetzt WITH FORMAT verwenden.

SQL Engineering arbeitet an Korrekturen für diese Probleme in SQL Server 2016. Wir werden diesen Blog-Beitrag erneut aktualisieren, sobald wir weitere Informationen zum Teilen haben.

Trotz dieses Hinweises wurde der Blog-Beitrag seitdem nicht mehr mit weiteren Informationen aktualisiert.

Allerdings KB 4019893 können auch diese Adresse:

Obwohl sich die in diesem KB-Artikel gemeldete Fehlermeldung von der von Ihnen gemeldeten unterscheidet, klingen die beitragenden Faktoren sehr ähnlich. SQL Server 2016 SP1 CU3 enthielt zuerst den Fix, wie in seiner Hotfix-Liste zu sehen . Allerdings gibt es Berichte, dass es nicht das Problem in allen Situationen zu lösen hat.

SQL Server 2016 SP1 CU4 enthält auch einen (vermutlich aktualisierten) Fix dafür , und KB 4019893 wurde seitdem aktualisiert, um SP1 CU4 als die Version anzuzeigen, in der das Problem behoben wurde.

Leider kann ich aus eigener Erfahrung bestätigen, dass selbst das Update in SP1 CU4 dieses Problem nicht vollständig behebt. Ich habe derzeit eine TDE-fähige Datenbank, die auch unter SP1 CU4 bei Verwendung COMPRESSION(über MAXTRANSFERSIZE> 64 KB) und immer noch konsistent beschädigte Backups erstellt CHECKSUM. Ich habe auch mehrere Dutzend andere TDE-fähige Datenbanken in dieser Umgebung, die unter diesen Einstellungen durchweg keine beschädigten Sicherungen erstellen, einschließlich einer, die eine Variation derjenigen ist, die dies tut, mit einem nahezu identischen Schema, aber einem kleineren Datensatz. Dies scheint darauf hinzudeuten, dass Microsoft zwar die Szenarien, die dies verursachen können, abschneidet, aber noch nicht alle gelöst hat.

Ich habe noch nicht versucht, FORMATdieses Problem zu umgehen, wie in einer anderen Antwort und im SQLCAT- Blogbeitrag erwähnt , aber ich werde hier ein Update bereitstellen, wenn ich das versuchen kann, und es behebt das Problem. Die eine Datenbank, die ich habe, die dies reproduziert, ist leider ziemlich groß (~ 1 TB) und befindet sich in einem Entwicklungs- / QS-Cluster, in dem nicht viel zusätzlicher Speicherplatz verfügbar ist (zumindest in dieser Größenordnung) hat sich als logistisch herausfordernd und zeitaufwändig erwiesen.

Kevin M. Owen
quelle