Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server 2014:natywne szyfrowanie kopii zapasowych

Nową funkcją SQL Server 2014, o której wielu z Was nie słyszało, dopóki nie została ogłoszona w tym tygodniu na PASS Summit, jest natywne szyfrowanie kopii zapasowych w wersjach Standard, Business Intelligence i Enterprise (przepraszam, Web i Express nie są obsługiwane). Jest to coś, co zewnętrzni dostawcy oferują od dawna i wreszcie trafia do produktu, obsługując cztery algorytmy szyfrowania:AES 128, AES 192, AES 256 i Triple DES (3DES).

Jeśli obecnie używasz przezroczystego szyfrowania danych wyłącznie w celu zaszyfrowania danych w plikach kopii zapasowych, może to być sposób na migrację z tej techniki i tworzenie zaszyfrowanych kopii zapasowych bez uderzenia, które TDE umieszcza w twoim systemie. Jeśli obecnie używasz narzędzia innej firmy do zaszyfrowanych kopii zapasowych, powinieneś porównać to z funkcjonalnością i wydajnością natywnych zaszyfrowanych kopii zapasowych.

PS Możesz pobrać CTP2 już teraz.

Nie chciałem zagłębiać się w porównywanie produktów innych producentów – jestem pewien, że wszystkie wykonują dobrą robotę i prawdopodobnie mają dodatkowe funkcje, o których nawet nie pomyślałem. Chciałem tylko przetestować, jaki rodzaj trafienia przyjmą różne algorytmy w przypadku pełnych kopii zapasowych, zarówno z tradycyjnych dysków typu spinny (RAID 1), jak i dysków półprzewodnikowych oraz z natywną kompresją i bez niej.

Pobrałem więc plik danych AdventureWorks2012, wykonałem dwie kopie i nazwałem je awSSD.mdf i awHDD.mdf , i umieścił jeden na dysku RAID 1 (D:\), a drugi na dysku SSD (E:\). Następnie dołączyłem oba za pomocą FOR ATTACH_REBUILD_LOG , ustaw je na FULL odzyskiwania, zmienił domyślne ustawienia automatycznego wzrostu i ustaw domyślną lokalizację plików dziennika pomiędzy (ponieważ jest to jedyny znany mi sposób na określenie lokalizacji przebudowanego pliku dziennika):

USE [master];GO EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', REG_SZ, N'D:\CTP2_Data';GO CREATE DATABASE awHDD ON (nazwa pliku='D:\CTP2_Data\awHDD.mdf') DLA ATTACH_REBUILD_LOG; ALTER DATABASE awHDD SET RECOVERY FULL;ALTER DATABASE awHDD MODIFY FILE (NAZWA =N'AdventureWorks2012_Data', FILEGROWTH =512000KB);ALTER DATABASE awHDD MODIFY FILE (NAZWA =N'AdventureWorks2012_Log', FILEGROWTH =512000KBinGO'M_HACHreg_pp'); , N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', REG_SZ, N'E:\CTP2_Data';GO CREATE DATABASE awSSD ON (filename='E:\CTP2_Data\awSSD.mdf') FOR ATTACH_REBUILD_LOG; ALTER DATABASE awSSD SET RECOVERY FULL; ALTER DATABASE awSSD MODIFY FILE (NAZWA =N'AdventureWorks2012_Data', FILEGROWTH =512000KB);ALTER DATABASE awSSD MODIFY FILE (NAZWA =N'AdventureWorks2012_Log', FILEGROWTH =512000KB);

Następnie powiększyłem je za pomocą tego skryptu od Jonathana Kehayiasa (tak, aby zarówno baza danych, jak i dziennik były wystarczająco duże, aby miały sens). Zajęło to około 4 minut na bazę danych zarówno na dysku HDD, jak i SSD.

W tym momencie EXEC sp_helpfile; dało następujące dane dla każdej bazy danych:

nazwa identyfikator pliku rozmiar nazwy pliku ----------------------- ------ -------- ------ ----AdventureWorks2012_Data 1 .mdf 1553408 KBAdventureWorks2012_Log 2 .ldf 5605504 KB

Teraz kilka rzeczy na temat tej funkcji, zanim będziemy mogli zacząć wykonywać zaszyfrowane kopie zapasowe. Aby korzystać z szyfrowania, musisz mieć certyfikat (lub klucz asymetryczny), a to z kolei będzie wymagało klucza głównego. Wybrałem certyfikat i utworzyłem je w następujący sposób:

USE master;GOCREATE SZYFROWANIE KLUCZA MASTER HASŁEM ='p@ssw0rd';GOOPEN SZYFROWANIE KLUCZA MASTER PRZEZ HASŁO ='p@ssw0rd';GOCREATE CERTIFICATE TestCert WITH SUBJECT ='EncryptionTesting'>;GO
Otrzymasz również ostrzeżenie, jeśli spróbujesz utworzyć zaszyfrowaną kopię zapasową przy użyciu certyfikatu, który sam nie został zarchiwizowany:

Ostrzeżenie:nie wykonano kopii zapasowej certyfikatu używanego do szyfrowania klucza szyfrowania bazy danych. Należy natychmiast wykonać kopię zapasową certyfikatu i klucza prywatnego skojarzonego z certyfikatem. Jeśli certyfikat kiedykolwiek stanie się niedostępny lub jeśli będziesz musiał przywrócić lub dołączyć bazę danych na innym serwerze, musisz mieć kopie zapasowe zarówno certyfikatu, jak i klucza prywatnego, w przeciwnym razie nie będziesz mógł otworzyć bazy danych.

W moim przypadku mógłbym po prostu wykonać kopię zapasową certyfikatu i klucza głównego w następujący sposób:

 CERTYFIKAT ZAPASOWY TestCert TO FILE ='C:\temp\TestCert.cert' Z KLUCZEM PRYWATNYM ( PLIK ='C:\temp\TestCert.key', SZYFROWANIE HASŁEM ='p@ssw0rd' ); BACKUP MASTER KEY TO FILE ='C:\temp\MasterKey.key' SZYFROWANIE HASŁEM ='p@ssw0rd';

Ściśle mówiąc, tworzenie kopii zapasowej klucza głównego nie jest konieczne do wykonania zaszyfrowanej kopii zapasowej (a nawet do uniknięcia ostrzeżenia), ale i tak należy wykonać kopię zapasową. I prawdopodobnie będziesz chciał użyć silniejszego hasła niż p@ssw0rd , przechowuj go w innym miejscu niż dysk C:na tym samym komputerze itp. Na koniec należy pamiętać, że jeśli zaszyfrujesz swoje kopie zapasowe i nie podejmiesz odpowiednich środków ostrożności, mogą one być bezużyteczne w przypadku awarii . Nie jest to funkcja, którą należy po prostu włączyć bez sporej dozy staranności i testów.

Mając to wszystko na uboczu, mogłem zabrać się za testowanie. Ten system ma tylko jeden dysk oparty na talerzu i jeden dysk SSD, więc nie mogłem przetestować SSD -> inny SSD lub HDD -> inny HDD; tylko tworzenie kopii zapasowych z jednego do drugiego lub do tego samego dysku. Podstawowa składnia tworzenia kopii zapasowych z szyfrowaniem to:

BACKUP BAZY DANYCH... Z SZYFROWANIEM (ALGORYTM =, CERTYFIKAT SERWERA =);

Oraz cztery możliwe wartości dla <algorithm>AES_128 , AES_192 , AES_256 i TRIPLE_DES_3KEY .

Następnie wygenerowałem skrypt do uruchamiania kopii zapasowych, aby porównać wydajność i rozmiar różnych kombinacji – cztery różne algorytmy szyfrowania (bez szyfrowania), z kompresją i bez, skąd pochodzą dane (dysk twardy lub dysk SSD) i skąd dane są archiwizowane na (HDD lub SSD). To 40 różnych kopii zapasowych, a skrypt, którego użyłem do wygenerowania, wygląda tak:

DECLARE @sql NVARCHAR(MAX) =N'';;with s(s) AS (SELECT 1 UNION ALL SELECT 2),m AS (SELECT m FROM (VALUES('AES_128'),('AES_192'),('AES_256'),('TRIPLE_DES_3KEY'),(NULL )) AS m(m)),c AS (WYBIERZ c Z (WARTOŚCI('BEZ_KOMPRESJI'),('KOMPRESJA')) AS c(c)),d AS (WYBIERZ d,t Z (WARTOŚCI('D') ,'HDD'),('E','SSD')) AS d(d,t))SELECT @sql +=N'BACKUP DATABASE aw' + PRZYPADEK s WHEN 1 THEN 'HDD' ELSE 'SSD' END + ' TO DISK =''' + d + ':\backup\' + n + '.bak'' Z INIT, ' + c + ',' + COALESCE(' SZYFROWANIE (ALGORYTM =' + m + ', CERTYFIKAT SERWERA =TestCert), ', '') + ' NAZWA =''' + n + ''';' FROM ( SELECT *, n ='test' + CONVERT(VARCHAR(8000), RIGHT('0' + RTRIM(r),2)) + '-' + COALESCE(m,'NO_ENCRYPTION') + '-' + PRZYPADEK GDY r <11 THEN 'HDD' ELSE 'SSD' END + '-do-' + t + '-' + c FROM ( SELECT *, r =ROW_NUMBER() OVER (PARTITION BY d.d ORDER BY s.s,mm,c.c ) Z s POŁĄCZENIE KRZYŻOWE m POŁĄCZENIE KRZYŻOWE c POŁĄCZENIE KRZYŻOWE d ) AS x) JAK y ZAMÓWIENIE PRZEZ r; --EXEC sp_executesql @sql;--GO 10 SELECT CONVERT(XML, @sql);

Wygląda na bardzo skomplikowane, ale tak naprawdę generuje tylko 40 BACKUP DATABASE smyczki. Wybieram jako XML, aby po kliknięciu wyników w siatce można było wyświetlić cały wynik – zamiast tego, co PRINT lub wybranie wyjścia do siatki/tekstu ograniczy Cię do. Wynik w tym przypadku znajduje się poniżej (kliknij, aby pokazać/ukryć):

 BACKUP DATABASE awHDD TO DISK ='D:\backup\test01-NO_ENCRYPTION-HDD-to-HDD-COMPRESSION.bak' Z INIT, KOMPRESJĄ, NAZWA ='test01-NO_ENCRYPTION-HDD-to-HDD-COMPRESSION'; BACKUP DATABASE awHDD TO DISK ='E:\backup\test01-NO_ENCRYPTION-HDD-to-SSD-COMPRESSION.bak' Z INIT, COMPRESSION, NAME ='test01-NO_ENCRYPTION-HDD-to-SSD-COMPRESSION';BACKUP DATABASE awHDD TO DISK ='E:\backup\test02-NO_ENCRYPTION-HDD-to-SSD-NO_COMPRESSION.bak' WITH INIT, NO_COMPRESSION, NAME ='test02-NO_ENCRYPTION-HDD-to-SSD-NO_COMPRESSION';BACKUP DATABASE awHDD TO DISK ='D:\backup\test02-NO_ENCRYPTION-HDD-to-HDD-NO_COMPRESSION.bak' WITH INIT, NO_COMPRESSION, NAME ='test02-NO_ENCRYPTION-HDD-to-HDD-NO_COMPRESSION';BACKUP BAZY DANYCH na dysk ='D:\backup\test03-AES_128-HDD-to-HDD-COMPRESSION.bak' Z INIT, KOMPRESJĄ, SZYFROWANIEM (ALGORYTM =AES_128, CERTYFIKAT SERWERA =TestCert), NAZWA ='test03-AES_128-HDD-to-HDD-COMPRESSION'; BACKUP BAZY DANYCH awHDD TO DISK ='E:\backup\test03-AES_128-HDD-to-SSD-COMPRESSIO N.bak' Z INIT, KOMPRESJĄ, SZYFROWANIEM (ALGORYTM =AES_128, CERTYFIKAT SERWERA =TestCert), NAZWA ='test03-AES_128-HDD-to-SSD-COMPRESSION';BACKUP DATABASE awHDD TO DISK ='E:\backup\test04 -AES_128-HDD-to-SSD-NO_COMPRESSION.bak' Z INIT, BRAK KOMPRESJI, SZYFROWANIA (ALGORYTM =AES_128, CERTYFIKAT SERWERA =TestCert), NAZWA ='test04-AES_128-HDD-to-SSD-NO_COMPRESSION'; DYSK ='D:\backup\test04-AES_128-HDD-to-HDD-NO_COMPRESSION.bak' Z INIT, NO_COMPRESSION, ENCRYPTION (ALGORYTM =AES_128, CERTYFIKAT SERWERA =TestCert), NAME ='test04-AES_128-HDD-to- HDD-NO_COMPRESSION';BACKUP DATABASE awHDD TO DISK ='D:\backup\test05-AES_192-HDD-to-HDD-COMPRESSION.bak' Z INIT, KOMPRESJĄ, SZYFROWANIEM (ALGORYTM =AES_192, CERTYFIKAT SERWERA =TestCert), NAZWA ='test05-AES_192-HDD-to-HDD-COMPRESSION';BACKUP DATABASE awHDD TO DISK ='E:\backup\test05-AES_192-HDD-to-SSD-COMPRESSION.bak' Z INIT, KOMPRESJĄ, SZYFROWANIEM (ALGORYTM =AES_192 , CERTYFIKAT SERWERA =TestCert) , NAME ='test05-AES_192-HDD-to-SSD-COMPRESSION';BACKUP DATABASE awHDD TO DISK ='E:\backup\test06-AES_192-HDD-to-SSD-NO_COMPRESSION.bak' WITH INIT, NO_COMPRESSION, ENCRYPTION ( ALGORYTM =AES_192, CERTYFIKAT SERWERA =TestCert), NAZWA ='test06-AES_192-HDD-to-SSD-NO_COMPRESSION';BACKUP DATABASE awHDD TO DISK ='D:\backup\test06-AES_192-HDD-to-HDD-NO_COMPRESSION. bak' Z INIT, BEZ KOMPRESJI, SZYFROWANIA (ALGORYTM =AES_192, CERTYFIKAT SERWERA =TestCert), NAZWA ='test06-AES_192-HDD-to-HDD-NO_COMPRESSION';BACKUP DATABASE awHDD TO DISK ='D:\backup\test07-AES_256 -HDD-to-HDD-COMPRESSION.bak' Z INIT, KOMPRESJĄ, SZYFROWANIEM (ALGORYTM =AES_256, CERTYFIKAT SERWERA =TestCert), NAZWA ='test07-AES_256-HDD-to-HDD-COMPRESSION'; ZAPASOWA BAZA DANYCH NA DYSK ='E:\backup\test07-AES_256-HDD-to-SSD-COMPRESSION.bak' Z INIT, KOMPRESJĄ, SZYFROWANIEM (ALGORYTM =AES_256, CERTYFIKAT SERWERA =TestCert), NAZWA ='test07-AES_256-HDD-to-SSD- KOMPRESJA'; BACKUP BAZY DANYCH awHDD NA DYSKU ='E:\backup\te st08-AES_256-HDD-to-SSD-NO_COMPRESSION.bak' Z INIT, BRAK KOMPRESJI, SZYFROWANIA (ALGORYTM =AES_256, CERTYFIKAT SERWERA =TestCert), NAZWA ='test08-AES_256-HDD-to-SSD-NO_COMPRESSION'; TO DISK ='D:\backup\test08-AES_256-HDD-to-HDD-NO_COMPRESSION.bak' WITH INIT, NO_COMPRESSION, ENCRYPTION (ALGORYTM =AES_256, CERTYFIKAT SERWERA =TestCert), NAME ='test08-AES_256-HDD-to -HDD-NO_COMPRESSION';BACKUP DATABASE awHDD TO DISK ='D:\backup\test09-TRIPLE_DES_3KEY-HDD-to-HDD-COMPRESSION.bak' Z INIT, KOMPRESJĄ, SZYFROWANIEM (ALGORYTM =TRIPLE_DES_3KEY, SERVER CERTIFICATE =TestCert) ='test09-TRIPLE_DES_3KEY-HDD-to-HDD-COMPRESSION';BACKUP BAZY DANYCH NA DYSKU ='E:\backup\test09-TRIPLE_DES_3KEY-HDD-to-SSD-COMPRESSION.bak' Z INIT, KOMPRESJI, SZYFROWANIA (ALGORYTM =TRIPLE_DES_3KEY, SERVER CERTIFICATE =TestCert), NAME ='test09-TRIPLE_DES_3KEY-HDD-to-SSD-COMPRESSION';BACKUP DATABASE awHDD TO DISK ='E:\backup\test10-TRIPLE_DES_3KEY-HDD-to-SSD-NO_COMPRESSION .bak' WITH INIT, NO_COMPRESSION, ENCRYPTION (ALGORYTM =TRIPLE_DES_3KEY, SERVER CERTIFICATE =TestCert), NAME ='test10-TRIPLE_DES_3KEY-HDD-to-SSD-NO_COMPRESSION';BACKUP DATABASE awHDD TO DISK =\'D-back:\ TRIPLE_DES_3KEY-HDD-to-HDD-NO_COMPRESSION.bak' Z INIT, NO_COMPRESSION, SZYFROWANIEM (ALGORYTM =TRIPLE_DES_3KEY, CERTYFIKAT SERWERA =TestCert), NAME ='test10-TRIPLE_DES_3KEY-HDD-to- DATABASE'; ='D:\backup\test11-NO_ENCRYPTION-SSD-to-HDD-COMPRESSION.bak' WITH INIT, COMPRESSION, NAME ='test11-NO_ENCRYPTION-SSD-to-HDD-COMPRESSION';BACKUP BAZY DANYCH awSSD TO DISK ='E :\backup\test11-NO_ENCRYPTION-SSD-to-SSD-COMPRESSION.bak' WITH INIT, COMPRESSION, NAME ='test11-NO_ENCRYPTION-SSD-to-SSD-COMPRESSION';BACKUP DATABASE awSSD TO DISK ='E:\backup \test12-NO_ENCRYPTION-SSD-to-SSD-NO_COMPRESSION.bak' WITH INIT, NO_COMPRESSION, NAME ='test12-NO_ENCRYPTION-SSD-to-SSD-NO_COMPRESSION';BACKUP DATABASE awSSD TO DISK ='D:\backup\test12- NO_ENCRYPTION-S SD-to-HDD-NO_COMPRESSION.bak' WITH INIT, NO_COMPRESSION, NAME ='test12-NO_ENCRYPTION-SSD-to-HDD-NO_COMPRESSION';BACKUP DATABASE awSSD TO DISK ='D:\backup\test13-AES_128-SSD-to -HDD-COMPRESSION.bak' Z INIT, KOMPRESJĄ, SZYFROWANIEM (ALGORYTM =AES_128, CERTYFIKAT SERWERA =TestCert), NAZWA ='test13-AES_128-SSD-to-HDD-COMPRESSION'; BACKUP BAZY DANYCH awSSD NA DYSKU ='E:\ backup\test13-AES_128-SSD-to-SSD-COMPRESSION.bak' Z INIT, KOMPRESJĄ, SZYFROWANIEM (ALGORYTM =AES_128, CERTYFIKAT SERWERA =TestCert), NAZWA ='test13-AES_128-SSD-to-SSD-COMPRESSION'; BAZA DANYCH awSSD TO DISK ='E:\backup\test14-AES_128-SSD-to-SSD-NO_COMPRESSION.bak' Z INIT, BEZ_KOMPRESJI, SZYFROWANIA (ALGORYTM =AES_128, CERTYFIKAT SERWERA =TestCert), NAZWA ='test14-AES_128-SSD -to-SSD-NO_COMPRESSION';BACKUP DATABASE awSSD TO DISK ='D:\backup\test14-AES_128-SSD-to-HDD-NO_COMPRESSION.bak' Z INIT, BEZ KOMPRESJI, SZYFROWANIA (ALGORYTM =AES_128, CERTYFIKAT SERWERA =TestCert) , NAME ='test14-AES_128-SSD-to-H DD-NO_COMPRESSION';BACKUP DATABASE awSSD TO DISK ='D:\backup\test15-AES_192-SSD-to-HDD-COMPRESSION.bak' Z INIT, KOMPRESJĄ, SZYFROWANIEM (ALGORYTM =AES_192, CERTYFIKAT SERWERA =TestCert), NAZWA ='test15-AES_192-SSD-to-HDD-COMPRESSION';BACKUP DATABASE awSSD TO DISK ='E:\backup\test15-AES_192-SSD-to-SSD-COMPRESSION.bak' Z INIT, KOMPRESJĄ, SZYFROWANIEM (ALGORYTM =AES_192 , CERTYFIKAT SERWERA =TestCert), NAZWA ='test15-AES_192-SSD-to-SSD-COMPRESSION';BACKUP BAZY DANYCH awSSD NA DYSKU ='E:\backup\test16-AES_192-SSD-to-SSD-NO_COMPRESSION.bak' WITH INIT, BRAK_KOMPRESJI, SZYFROWANIE (ALGORYTM =AES_192, CERTYFIKAT SERWERA =TestCert), NAZWA ='test16-AES_192-SSD-to-SSD-BRAK_KOMPRESJI';BACKUP DATABASE awSSD TO DISK ='D:\backup\test16-AES_192-SSD- to-HDD-NO_COMPRESSION.bak' Z INIT, BEZ KOMPRESJI, SZYFROWANIA (ALGORYTM =AES_192, CERTYFIKAT SERWERA =TestCert), NAZWA ='test16-AES_192-SSD-to-HDD-NO_COMPRESSION'; BACKUP BAZY DANYCH awSSD TO DISK ='D:\backup\test17-AES_256-SSD-to-HDD-COMPRE SSION.bak' Z INIT, KOMPRESJĄ, SZYFROWANIEM (ALGORYTM =AES_256, CERTYFIKAT SERWERA =TestCert), NAZWA ='test17-AES_256-SSD-to-HDD-COMPRESSION';BACKUP DATABASE awSSD TO DISK ='E:\backup\test17 -AES_256-SSD-to-SSD-COMPRESSION.bak' Z INIT, KOMPRESJĄ, SZYFROWANIEM (ALGORYTM =AES_256, CERTYFIKAT SERWERA =TestCert), NAZWA ='test17-AES_256-SSD-to-SSD-COMPRESSION'; BACKUP BAZY DANYCH awSSD TO DYSK ='E:\backup\test18-AES_256-SSD-to-SSD-NO_COMPRESSION.bak' Z INIT, NO_COMPRESSION, SZYFROWANIE (ALGORYTM =AES_256, CERTYFIKAT SERWERA =TestCert), NAME ='test18-AES_256-SSD-to- SSD-NO_COMPRESSION';BACKUP DATABASE awSSD TO DISK ='D:\backup\test18-AES_256-SSD-to-HDD-NO_COMPRESSION.bak' Z INIT, BRAK KOMPRESJI, SZYFROWANIA (ALGORYTM =AES_256, CERTYFIKAT SERWERA =TestCert), NAZWA ='test18-AES_256-SSD-to-HDD-NO_COMPRESSION';BACKUP DATABASE awSSD TO DISK ='D:\backup\test19-TRIPLE_DES_3KEY-SSD-to-HDD-COMPRESSION.bak' Z INIT, KOMPRESJĄ, SZYFROWANIEM (ALGORYTM =TRIPLE_DES_3 , SERWER TIFICATE =TestCert), NAME ='test19-TRIPLE_DES_3KEY-SSD-to-HDD-COMPRESSION';BACKUP DATABASE awSSD TO DISK ='E:\backup\test19-TRIPLE_DES_3KEY-SSD-to-SSD-COMPRESSION.bak' WITH INIT, KOMPRESJA, SZYFROWANIE (ALGORYTM =TRIPLE_DES_3KEY, CERTYFIKAT SERWERA =TestCert), NAZWA ='test19-TRIPLE_DES_3KEY-SSD-to-SSD-COMPRESSION';BACKUP DATABASE awSSD TO DISK ='E:\backup\test20-TRIPLE_DES_3- SSD-NO_COMPRESSION.bak' WITH INIT, NO_COMPRESSION, ENCRYPTION (ALGORYTM =TRIPLE_DES_3KEY, SERVER CERTIFICATE =TestCert), NAZWA ='test20-TRIPLE_DES_3KEY-SSD-to-SSD-NO_COMPRESSION';BACKUP DATABASE awSSD:DISK \test20-TRIPLE_DES_3KEY-SSD-to-HDD-NO_COMPRESSION.bak' Z INIT, NO_COMPRESSION, SZYFROWANIEM (ALGORYTM =TRIPLE_DES_3KEY, CERTYFIKAT SERWERA =TestCert), NAME ='test20-TRIPLE_DES_3KEY-S_3KEY-S_COMPRESSION'; 

Nie musiałem robić nic specjalnego, aby je zmierzyć, ponieważ mogłem pobrać wszystkie istotne statystyki z bazy danych msdb po ich wykonaniu (jedynym minusem jest to, że czas trwania jest mierzony tylko z dokładnością do sekund, chyba że chciałem aby przeanalizować dane wyjściowe ręcznie). Odkomentowałem więc EXEC sp_executesql i GO (chciałem uruchomić każdą kopię zapasową 10 razy, aby uzyskać średnie, wykluczyć anomalie itp.), wcisnąłem F5 i zacząłem pracować nad jedną z moich sesji na PASS Summit.

Kiedy wróciłem, sprawdziłem tabele msdb, aby uzyskać rozmiary / czasy trwania dla każdej kopii zapasowej. To zapytanie jest dość proste:

;WITH x AS( SELECT name, natural_size =backup_size/1024/1024.0, compress_size =skompresowany_backup_size/1024/1024.0, czas trwania =1.0*DATEDIFF(SECOND, backup_start_date, backup_finish_date) FROM msdb.dbo.backupset GDZIE nazwa LIKE 'test %')SELECT nazwa, [naturalny_rozmiar] =MAX(naturalny_rozmiar), [skompresowany_rozmiar] =MAX(skompresowany_rozmiar), [min_duration] =MIN(czas trwania), [max_duration] =MAX(duration), [avg_duration] =AVG(czas trwania) FROM x GROUP BY nameORDER BY name;

To dałoby mi dane, których potrzebowałem do stworzenia ładnych wykresów.

Wpływ na rozmiar

W zależności od ogólnego doświadczenia z szyfrowaniem może Cię to zaskoczyć, ale nie musi, że szyfrowanie kopii zapasowej bazy danych ma bardzo mały wpływ na jej ogólny rozmiar. Jak to działa, na pewno wykracza poza zakres tego postu; prostym wyjaśnieniem byłoby to, że – przynajmniej w przypadku szyfrowania AES – kompresja nie jest zbyt efektywna w przypadku większości danych wyjściowych, ponieważ jest to w zasadzie przypadkowy bełkot.

Wynik końcowy jest taki, że ten wykres nie jest zbyt ekscytujący. Skompresowane i nieskompresowane rozmiary natywnych kopii zapasowych na cztery różne metody szyfrowania:


Rozmiar w MB kopii zapasowych z szyfrowaniem i bez

Jak widać, wpływ na rozmiar bazy danych był prawie zerowy – około 0,03% większy rozmiar w przypadku nieskompresowanej kopii zapasowej i dodatkowe 0,04% w przypadku skompresowanej kopii zapasowej.

Wpływ na wydajność

Chociaż szyfrowanie miało znikomy wpływ na rozmiar, tak wpływają na szybkość tworzenia kopii zapasowej. Ale w niektórych przypadkach nie w sposób, w jaki myślisz. Oto ogólna miara średnich czasów działania dla każdego podejścia:


Średni czas trwania różnych kopii zapasowych w sekundach

Naprawdę spodziewałem się, że szyfrowanie zawsze spowoduje spadek wydajności i powinieneś przetestować w swoim środowisku, czy twoje wyniki różnią się od moich. Wrócę i zaktualizuję to za pomocą nowego wykresu pokazującego konkretne przypadki, które mnie zaskoczyły, i usunę niektóre wartości odstające, aby upewnić się, że wyniki są naprawdę reprezentatywne.

Zastrzeżenie

Jedna ważna uwaga:nie możesz dołączać zaszyfrowanych kopii zapasowych. Jeśli generujesz zaszyfrowany plik kopii zapasowej za pomocą WITH INIT , a następnie spróbuj dołączyć kolejną zaszyfrowaną kopię zapasową do tego samego pliku, pojawi się następujący błąd:

Msg 3095, Poziom 16, Stan 1, Wiersz 11
Nie można wykonać kopii zapasowej, ponieważ zażądano „SZYFROWANIA” po sformatowaniu nośnika przy użyciu niezgodnej struktury. Aby dołączyć do tego zestawu multimediów, pomiń „SZYFROWANIE” lub utwórz nowy zestaw multimediów za pomocą WITH FORMAT w instrukcji BACKUP. Jeśli użyjesz WITH FORMAT na istniejącym zestawie nośników, wszystkie jego zestawy kopii zapasowych zostaną nadpisane.
Msg 3013, poziom 16, stan 1, wiersz 11
BACKUP DATABASE kończy się nieprawidłowo.

Możesz, myląco, dołączyć nie -encrypted kopii zapasowej, gdy plik początkowy był zaszyfrowany. To nie jest intencja i jest to błąd, który zgłosiłem na Connect (nr 805220, ale obecnie jest oznaczony jako prywatny); miejmy nadzieję, że zajmą się tym przed RTM.

W międzyczasie musisz być ostrożny, ponieważ nic się nie zmieniło w RESTORE HEADERONLY dane wyjściowe wskazujące, czy którakolwiek z załączonych kopii zapasowych została zaszyfrowana. Aby to odkryć, musisz sprawdzić BackupSetGUID wartość w tym wyjściu w Position = 1 i znajdź odpowiedni backup_set_uuid wartość w msdb.dbo.backupset . Ta tabela zawiera nowe kolumny obsługujące szyfrowanie, w których można uzyskać następujące informacje:key_algorithm , encryptor_thumbprint i encryptor_type . Jest to problematyczne w przypadkach, gdy nie masz backupset dane — może zostały wyczyszczone podczas zadań konserwacyjnych, a może nie masz do nich dostępu, ponieważ naprawdę odzyskujesz dane po awarii lub masz tylko plik .bak (albo masz tylko plik .bak z innych powodów). W tym przypadku mam nadzieję, że istnieje inny sposób, aby stwierdzić na podstawie pliku kopii zapasowej, że został zaszyfrowany (i w jaki sposób), ale w chwili pisania tego tekstu nie znam sposobu. Zgłosiłem sugestię (#805292, również prywatną), że dane wyjściowe RESTORE HEADERONLY być wzbogacony o informacje o szyfrowaniu w taki sam sposób, w jaki został rozszerzony o informacje o kompresji, gdy ta funkcja została dodana w SQL Server 2008.

Kiedy rozwiążą te problemy (i jestem przekonany, że to zrobią), usunę cały ten szum, ale ważne jest, aby w międzyczasie być tego świadomym, jeśli zamierzasz przeprowadzić jakiekolwiek testy z obecnymi CTP.

Dalej…

Co ten rodzaj kopii zapasowej oznacza dla przywracania, omówię w innym poście, kiedy testuję prędkości przywracania i ujawniam tam problemy. Chcę również wrócić do tych testów, aby zbadać zaszyfrowane kopie zapasowe dzienników.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak ustawić opcję maxrecursion dla CTE wewnątrz funkcji Table-Valued-Function?

  2. Przykład z życia, kiedy używać OUTER / CROSS APPLY w SQL

  3. W tabeli odniesienia nie ma kluczy podstawowych ani kandydujących, które pasują do listy kolumn odniesienia w kluczu obcym

  4. Rozwiązywanie problemów z długimi zapytaniami w MS SQL Server

  5. 10 wskazówek SP_EXECUTESQL, których należy unikać, aby uzyskać lepszy dynamiczny SQL