sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server 2014:Native backup-kryptering

En ny funktion i SQL Server 2014 som många av er inte hade hört talas om förrän den tillkännagavs den här veckan vid PASS Summit är inbyggd säkerhetskopieringskryptering i Standard, Business Intelligence och Enterprise Editions (tyvärr, Web och Express stöds inte). Detta är något som tredjepartsleverantörer har erbjudit under lång tid, och det kommer äntligen in i produkten och stöder fyra krypteringsalgoritmer:AES 128, AES 192, AES 256 och Triple DES (3DES).

Om du för närvarande använder Transparent Data Encryption enbart i syfte att ha krypterad data i dina säkerhetskopior, kan detta vara ett sätt att migrera från den tekniken och ha krypterade säkerhetskopior utan den träff som TDE placerar på ditt livesystem. Om du för närvarande använder ett tredjepartsverktyg för krypterade säkerhetskopior, bör du jämföra det med funktionaliteten och prestandan för inbyggda krypterade säkerhetskopior.

P.S. Du kan ladda ner CTP2 just nu.

Jag ville inte gå in på att jämföra med produkter från tredje part – jag är säker på att de alla gör ett bra jobb och har förmodligen ytterligare funktioner som jag inte ens har tänkt på. Jag ville bara testa vilken typ av träff de olika algoritmerna skulle ta på fullständiga säkerhetskopior, från och till både traditionella spinny-diskar (RAID 1) och solid state-enheter, och med och utan inbyggd komprimering.

Så jag laddade ner AdventureWorks2012-datafilen, gjorde två kopior och gav dem namnet awSSD.mdf och awHDD.mdf , och placerade en på RAID 1-enheten (D:\) och en på SSD-enheten (E:\). Sedan bifogade jag båda med FOR ATTACH_REBUILD_LOG , ställ in dem på FULL återställning, ändrade standardinställningarna för automatisk tillväxt och ställ in standardplatsen för loggfiler däremellan (eftersom detta är det enda sättet jag känner till för att ange platsen för den ombyggda loggfilen):

ANVÄND [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 DATABON (filawHDDname='D:\CTP2_Data\awHDD.mdf') FÖR ATTACH_REBUILD_LOG; ALTER DATABASE awHDD SET RECOVERY FULL;ALTER DATABASE awHDD MODIFY FILE (NAME =N'AdventureWorks2012_Data', FILEGROWTH =512000KB);ALTER DATABASE awHDD MODIFY FILE (NAME =N'AdventureWorks2012_Log', FILEGROWTH =512000KB);GO EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE' , N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', REG_SZ, N'E:\CTP2_Data';GO SKAPA DATABAS awSSD PÅ (filnamn='E:\CTP2_Data\awBUSSD.mdf') FÖR ATTACH_RE; ALTER DATABASE awSSD SET RECOVERY FULL; ALTER DATABASE awSSD MODIFIER FIL (NAME =N'AdventureWorks2012_Data', FILEGROWTH =512000KB);ALTER DATABASE awSSD MODIFIER FIL (NAME =N'AdventureWorks2012_Data', FILEGROWTH =512000KB); 

Därefter förstorade jag dem med det här skriptet från Jonathan Kehayias (så att både databasen och loggen skulle vara tillräckligt stora för att vara meningsfulla). Detta tog cirka 4 minuter per databas på både hårddisk och SSD.

Vid den tidpunkten, EXEC sp_helpfile; gav följande för varje databas:

namn fil-id filnamnsstorlek ----------------------- -------------- ------ ----AdventureWorks2012_Data 1 .mdf 1553408 KBAdventureWorks2012_Log 2 .ldf 5605504 KB

Nu, ett par saker om den här funktionen innan vi faktiskt kan börja utföra krypterade säkerhetskopior. Du måste ha ett certifikat (eller asymmetrisk nyckel) för att använda kryptering, och detta i sin tur kräver en huvudnyckel. Jag valde ett certifikat och skapade dessa enligt följande:

ANVÄND master;GOCREATE MASTER KEY KRYPTION BY LÖSENORD ='p@ssw0rd';GOOPEN MASTER KEY DECRYPTION BY PASSWORD ='p@ssw0rd';GOCREATE CERTIFICATE TestCert WITH SUBJECT ='EncryptionTesting';GO

Du får också en varning om du försöker skapa en krypterad säkerhetskopia med ett certifikat som inte i sig har säkerhetskopierats:

Varning:Certifikatet som används för att kryptera databaskrypteringsnyckeln har inte säkerhetskopierats. Du bör omedelbart säkerhetskopiera certifikatet och den privata nyckel som är kopplad till certifikatet. Om certifikatet någon gång blir otillgängligt eller om du måste återställa eller bifoga databasen på en annan server måste du ha säkerhetskopior av både certifikatet och den privata nyckeln annars kommer du inte att kunna öppna databasen.

I mitt fall kunde jag bara säkerhetskopiera certifikatet och huvudnyckeln, så här:

BACKUP CERTIFICATE TestCert TO FILE ='C:\temp\TestCert.cert' MED PRIVAT NYCKEL ( FILE ='C:\temp\TestCert.key', KRYPTERING MED LÖSENORD ='p@ssw0rd' ); BACKUP MASTER KEY TO FILE ='C:\temp\MasterKey.key' KRYPTERING MED LÖSENORD ='p@ssw0rd';

Strängt taget är det inte nödvändigt att säkerhetskopiera huvudnyckeln för att utföra en krypterad säkerhetskopiering (eller ens för att undvika varningen), men du bör säkerhetskopiera detta ändå. Och du kommer förmodligen att vilja använda ett starkare lösenord än p@ssw0rd , lagra den någon annanstans än C:-enheten på samma maskin, etc. Slutligen bör du vara uppmärksam på att om du krypterar dina säkerhetskopior och du inte vidtar alla rätta försiktighetsåtgärder kan de vara värdelösa i händelse av en katastrof . Det här är inte en funktion du bara bör aktivera utan en hel del flit och testning.

Med allt detta ur vägen kunde jag fortsätta med att testa. Det här systemet har bara en enda skivbaserad disk och en enda SSD, så jag kunde inte testa SSD -> annan SSD eller hårddisk -> annan hårddisk; bara säkerhetskopiera från den ena till den andra, eller till samma enhet. Den grundläggande syntaxen för säkerhetskopiering med kryptering är:

BACKUP DATABAS ... MED KRYPTERING (ALGORITHM =, SERVER CERTIFICATE =);

Och de fyra möjliga värdena för <algorithm> är AES_128 , AES_192 , AES_256 och TRIPLE_DES_3KEY .

Så härnäst genererade jag skriptet för att köra säkerhetskopiorna för att jämföra prestanda och storlek för olika kombinationer – de fyra olika krypteringsalgoritmerna (och ingen kryptering), med och utan komprimering, var data kommer ifrån (hårddisk eller SSD) och var data säkerhetskopieras till (HDD eller SSD). Det är 40 olika säkerhetskopior, och skriptet jag använde för att skapa det ser ut så här:

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 (SELECT c FROM (VALUES('NO_COMPRESSION'),('COMPRESSION')) AS c(c)),d AS (SELECT d,t FROM (VALUES('D' ,'HDD'),('E','SSD')) AS d(d,t))SELECT @sql +=N'BACKUP DATABASE aw' + CASE s WHEN 1 SEDAN 'HDD' ANDERS 'SSD' END + ' TO DISK =''' + d + ':\backup\' + n + '.bak'' MED INIT, ' + c + ',' + COALESCE(' ENCRYPTION (ALGORITHM =' + m + ', SERVERCERTIFIKAT =TestCert),', '') + ' NAME =''' + n + ''';' FRÅN ( SELECT *, n ='test' + CONVERT(VARCHAR(8000), RIGHT('0' + RTRIM(r),2)) + '-' + COALESCE(m,'NO_ENCRYPTION') + '-' + FALL NÄR r <11 DÅ 'HDD' ANNARS 'SSD' END + '-to-' + t + '-' + c FRÅN ( VÄLJ *, r =ROW_NUMBER() ÖVER (PARTITION BY d.d ORDER BY s.s,m.m,c.c ) FROM s CROSS JOIN m CROSS JOIN c CROSS JOIN d ) AS x) AS y BESTÄLLNING AV r; --EXEC sp_executesql @sql;--GO 10 VÄLJ KONVERTERA(XML, @sql);

Ser riktigt komplicerat ut, men egentligen genererar det bara 40 BACKUP DATABASE strängar. Jag väljer som XML så att när du klickar på resultaten i rutnätet kan du se hela resultatet – istället för vad PRINT eller välja utdata till rutnät/text kommer att begränsa dig till. Utdata i detta fall är nedan (klicka för att visa/dölja):

BACKUP DATABAS awHDD TO DISK ='D:\backup\test01-NO_ENCRYPTION-HDD-to-HDD-COMPRESSION.bak' MED INIT, KOMPRESSION, NAMN ='test01-NO_EKRYPTION-HDD-till-HDD-KOMPRESSION'; BACKUP DATABAS awHDD TO DISK ='E:\backup\test01-NO_ENCRYPTION-HDD-to-SSD-COMPRESSION.bak' WITH INIT, COMPRESSION, NAME ='test01-NO_ENCRYPTION-HDD-to-SSD-COMPRESSION';BACKUP DATABASE TO DISK ='E:\backup\test02-NO_ENCRYPTION-HDD-to-SSD-NO_COMPRESSION.bak' MED INIT, NO_COMPRESSION, NAME ='test02-NO_ENCRYPTION-HDD-to-SSD-NO_COMPRESSION';BACKUP DATABAS =awHDD TO DISK 'D:\backup\test02-NO_ENCRYPTION-HDD-to-HDD-NO_COMPRESSION.bak' MED INIT, NO_COMPRESSION, NAME ='test02-NO_ENCRYPTION-HDD-to-HDD-NO_COMPRESSION';BACKUP DATABAS awHDD:TO DISK \backup\test03-AES_128-HDD-to-HDD-COMPRESSION.bak' MED INIT, KOMPRESSION, KRYPTERING (ALGORITHM =AES_128, SERVERCERTIFIKAT =TestCert), NAME ='test03-AES_128-HDD-to-HDD-COMPRESSION'-COMPRESSION; BACKUP DATABAS awHDD TO DISK ='E:\backup\test03-AES_128-HDD-to-SSD-COMPRESSIO N.bak' MED INIT, KOMPRESSION, KRYPTERING (ALGORITHM =AES_128, SERVER CERTIFICATE =TestCert), NAME ='test03-AES_128-HDD-to-SSD-COMPRESSION';BACKUP DATABAS awHDD TO DISK\Test04\backup -AES_128-HDD-to-SSD-NO_COMPRESSION.bak' MED INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_128, SERVER CERTIFICATE =TestCert), NAMN ='test04-AES_128-HDD-to-SSD-NO_COMPRESSION TO-SSD-NO_COMPRESSH DISK ='D:\backup\test04-AES_128-HDD-to-HDD-NO_COMPRESSION.bak' MED INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_128, SERVER CERTIFICATE =TestCert), NAME ='test04-HDD_to-128 HDD-NO_COMPRESSION';BACKUP DATABAS awHDD TO DISK ='D:\backup\test05-AES_192-HDD-to-HDD-COMPRESSION.bak' MED INIT, KOMPRESSION, KRYPTERING (ALGORITHM =AES_192, =TESTNAMN), =TESTNAMN), 'test05-AES_192-HDD-to-HDD-COMPRESSION';BACKUP DATABAS awHDD TO DISK ='E:\backup\test05-AES_192-HDD-to-SSD-COMPRESSION.bak' MED INIT, KOMPRESSION, KRYPTERING (ALGORITHM =AES_192 , SERVERCERTIFIKAT =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' MED INIT, NO_COMPRESSION, ENCRY ALGORITHM =AES_192, SERVER CERTIFICATE =TestCert), NAME ='test06-AES_192-HDD-to-SSD-NO_COMPRESSION';BACKUP DATABAS awHDD TO DISK ='D:\backup\test06-AES_192-HDD-NO_COMPRESSION.NO_COMPRESSION. bak' MED INIT, NO_COMPRESSION, KRYPTION (ALGORITHM =AES_192, SERVER CERTIFICATE =TestCert), NAME ='test06-AES_192-HDD-to-HDD-NO_COMPRESSION';BACKUP DATABAS awHDD TO DISK\_D:\backup ='D:\backup -HDD-to-HDD-COMPRESSION.bak' MED INIT, KOMPRESSION, KRYPTERING (ALGORITHM =AES_256, SERVERCERTIFICATE =TestCert), NAME ='test07-AES_256-HDD-to-HDD-COMPRESSION';BACKUP DATABAS DISKaw 'E:\backup\test07-AES_256-HDD-to-SSD-COMPRESSION.bak' MED INIT, KOMPRESSION, KRYPTERING (ALGORITHM =AES_256, SERVERCERTIFICATE =TestCert), NAMN ='test07-AES_256-HDD-to-SS KOMPRESSION';BACKUP DATABAS awHDD TO DISK ='E:\backup\te st08-AES_256-HDD-to-SSD-NO_COMPRESSION.bak' MED INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_256, SERVER CERTIFICATE =TestCert), NAME ='test08-AES_256-HDD_to-SSDATA DATA-SSDATA-BawPRESSION'; TO DISK ='D:\backup\test08-AES_256-HDD-to-HDD-NO_COMPRESSION.bak' MED INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_256, SERVER CERTIFICATE =TestCert), NAME ='test08-AESDD_25 -HDD-NO_COMPRESSION';BACKUP DATABAS awHDD TO DISK ='D:\backup\test09-TRIPLE_DES_3KEY-HDD-to-HDD-COMPRESSION.bak' MED INIT, KOMPRESSION, KRYPTERING (ALGORITHM =TRIPLE_DESSERVERCERT,CERTIFICERT TRIPELA_DESSERVERCERT),CERTIFICERT,CERTIFICAT. ='test09-TRIPLE_DES_3KEY-HDD-to-HDD-COMPRESSION';BACKUP DATABAS awHDD TO DISK ='E:\backup\test09-TRIPLE_DES_3KEY-HDD-to-SSD-COMPRESSION.bak' MED INIT, KOMPRESSION =KOMPRESSION (ALT KOMPRESSION) TRIPLE_DES_3KEY, SERVER CERTIFICATE =TestCert), NAME ='test09-TRIPLE_DES_3KEY-HDD-to-SSD-COMPRESSION';BACKUP DATABAS awHDD TO DISK ='E:\backup\test10-TRIPLE_DES_3KEY-DDD-NO- .bak' MED INIT, NO_COMPRESSION, KRYPTION (ALGORITHM =TRIPLE_DES_3KEY, SERVER CERTIFICATE =TestCert), NAME ='test10-TRIPLE_DES_3KEY-HDD-to-SSD-NO_COMPRESSION'; TRIPLE_DES_3KEY-HDD-to-HDD-NO_COMPRESSION.bak' WITH INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =TRIPLE_DES_3KEY, SERVER CERTIFICATE =TestCert), NAME ='test10-TRIPLE_DES_3KEY-HDDSSION TOBACKPRESSION TOBACK-HDDSSION DSBATA-TOCOM-KEY-HDDSSION; ='D:\backup\test11-NO_ENCRYPTION-SSD-to-HDD-COMPRESSION.bak' WITH INIT, COMPRESSION, NAME ='test11-NO_ENCRYPTION-SSD-to-HDD-COMPRESSION';BACKUP DATABAS 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 DATABAS awSSD TO DISK ='E:\backup \test12-NO_ENCRYPTION-SSD-to-SSD-NO_COMPRESSION.bak' MED INIT, NO_COMPRESSION, NAME ='test12-NO_ENCRYPTION-SSD-to-SSD-NO_COMPRESSION';BACKUP DATABAS awSSD TO DISK ='D:\backup\backup NO_ENCRYPTION-S SD-to-HDD-NO_COMPRESSION.bak' MED INIT, NO_COMPRESSION, NAME ='test12-NO_ENCRYPTION-SSD-to-HDD-NO_COMPRESSION';BACKUP DATABAS awSSD TO DISK ='D:\backup\test13-AES_128-SSD-to -HDD-COMPRESSION.bak' MED INIT, KOMPRESSION, KRYPTERING (ALGORITHM =AES_128, SERVERCERTIFICATE =TestCert), NAME ='test13-AES_128-SSD-to-HDD-COMPRESSION';BACKUP DATABAS ='awSSD:\DISK backup\test13-AES_128-SSD-to-SSD-COMPRESSION.bak' MED INIT, KOMPRESSION, KRYPTERING (ALGORITHM =AES_128, SERVER CERTIFICATE =TestCert), NAMN ='test13-AES_128-SSD-to-SSD-KOMPRESSION'; DATABAS awSSD TO DISK ='E:\backup\test14-AES_128-SSD-to-SSD-NO_COMPRESSION.bak' MED INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_128, SERVERCERTIFICATE =TestCert), NAME ='Test_1128 -to-SSD-NO_COMPRESSION';BACKUP DATABAS awSSD TO DISK ='D:\backup\test14-AES_128-SSD-to-HDD-NO_COMPRESSION.bak' MED INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AESVERCERT)CERTIFICAT, , NAMN ='test14-AES_128-SSD-to-H DD-NO_COMPRESSION';BACKUP DATABAS awSSD TO DISK ='D:\backup\test15-AES_192-SSD-to-HDD-COMPRESSION.bak' MED INIT, KOMPRESSION, KRYPTERING (ALGORITHM =AES_192, =TESTNAMN), =TESTNAMN), 'test15-AES_192-SSD-to-HDD-COMPRESSION';BACKUP DATABASE awSSD TO DISK ='E:\backup\test15-AES_192-SSD-to-SSD-COMPRESSION.bak' MED INIT, KOMPRESSION, KRYPTERING (ALGORITHM =AES_192 =, SERVER CERTIFICATE =TestCert), NAME ='test15-AES_192-SSD-to-SSD-COMPRESSION';BACKUP DATABAS awSSD TO DISK ='E:\backup\test16-AES_192-SSD-to-SSD-NO_COMPRESSION.bak' MED INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_192, SERVER CERTIFICATE =TestCert), NAME ='test16-AES_192-SSD-to-SSD-NO_COMPRESSION';BACKUP DATABAS awSSD TO DISK ='D:\backup_192-ASSSD-19 to-HDD-NO_COMPRESSION.bak' WITH INIT, NO_COMPRESSION, KRYPTION (ALGORITHM =AES_192, SERVER CERTIFICATE =TestCert), NAME ='test16-AES_192-SSD-to-HDD-NO_COMPRESSION'; \backup\test17-AES_256-SSD-to-HDD-COMPRE SSION.bak' MED INIT, KOMPRESSION, KRYPTERING (ALGORITHM =AES_256, SERVER CERTIFICATE =TestCert), NAME ='test17-AES_256-SSD-to-HDD-COMPRESSION';BACKUP DATABAS awSSD TO DISK ='E:\backup -AES_256-SSD-to-SSD-COMPRESSION.bak' MED INIT, KOMPRESSION, KRYPTERING (ALGORITHM =AES_256, SERVERCERTIFICATE =TestCert), NAMN ='test17-AES_256-SSD-till-SSD-KOMPRESSION FÖR ATT BACKUPPRESSE'; DISK ='E:\backup\test18-AES_256-SSD-to-SSD-NO_COMPRESSION.bak' MED INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_256, SERVER CERTIFICATE =TestCert), NAME ='test18-ASSD-to-256 SSD-NO_COMPRESSION';BACKUP DATABAS awSSD TO DISK ='D:\backup\test18-AES_256-SSD-to-HDD-NO_COMPRESSION.bak' MED INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_256), SERVER CERTIFICERT 'test18-AES_256-SSD-to-HDD-NO_COMPRESSION';BACKUP DATABASE awSSD TO DISK ='D:\backup\test19-TRIPLE_DES_3KEY-SSD-to-HDD-COMPRESSION.bak' MED INIT, KOMPRESSION, ENCRYPTION_3 , SERVER CER 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 IN.bak,' MED KOMPRESSION, KRYPTERING (ALGORITHM =TRIPLE_DES_3KEY, SERVER CERTIFICATE =TestCert), NAMN ='test19-TRIPLE_DES_3KEY-SSD-to-SSD-COMPRESSION';BACKUP DATABAS awSSD TO DISK ='E:_TRIPLESS-to SSD-NO_COMPRESSION.bak' MED INIT, NO_COMPRESSION, KRYPTION (ALGORITHM =TRIPLE_DES_3KEY, SERVER CERTIFICATE =TestCert), NAME ='test20-TRIPLE_DES_3KEY-SSD-to-SSD-NO_COMPRESSION DATABACK DATABACK DATABACKD'; \test20-TRIPLE_DES_3KEY-SSD-to-HDD-NO_COMPRESSION.bak' MED INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =TRIPLE_DES_3KEY, SERVER CERTIFICATE =TestCert), NAME ='test20-TRIPLE-PRESSION_COMPRESSION-NO;

före>

Jag behövde inte göra något speciellt för att tajma dessa, eftersom jag kunde hämta all relevant statistik från msdb-databasen efter att de var klara (den enda nackdelen är att varaktigheten bara mäts till sekunders granularitet, om jag inte ville för att analysera utdata manuellt). Så jag avkommenterade EXEC sp_executesql och GO rader (jag ville köra varje säkerhetskopia 10 gånger för att få medelvärden, utesluta anomalier etc.), tryckte på F5 och gick till jobbet på en av mina sessioner för PASS Summit.

När jag kom tillbaka kollade jag in msdb-tabellerna för att få storlekar/längder för varje säkerhetskopia. Den här frågan är ganska enkel:

;WITH x AS( VÄLJ namn, naturlig_storlek =backup_size/1024/1024.0, compressed_size =compressed_backup_size/1024/1024.0, varaktighet =1.0*DATEDIFF(SECOND, backup_start_date, backup_start_date, backup_finish_date) FERE m %')VÄLJ namn, [naturlig_storlek] =MAX(naturlig_storlek), [komprimerad_storlek] =MAX(komprimerad_storlek), [min_duration] =MIN(varaktighet), [max_duration] =MAX(varaktighet), [avg_duration] =AVG(varaktighet) FRÅN x GRUPP EFTER namnORDER BY name;

Detta skulle ge mig den information jag behövde för att göra några vackra diagram.

Påverkan på storlek

Beroende på din erfarenhet av kryptering i allmänhet, kan det kanske inte förvåna dig att kryptering av en databassäkerhetskopiering har väldigt liten inverkan på dess totala storlek. Hur detta fungerar ligger utanför ramen för detta inlägg, för vissa; en enkel förklaring skulle vara att – åtminstone med AES-kryptering – komprimering inte är särskilt effektiv på det mesta av utdata eftersom det i grunden är slumpmässigt trams.

Slutresultatet är att det här diagrammet inte är särskilt spännande. De komprimerade och icke-komprimerade storlekarna av inbyggda säkerhetskopior mot de fyra olika krypteringsmetoderna:


Storlek, i MB, av säkerhetskopior med och utan kryptering

Som du kan se var det nästan ingen inverkan på storleken på databasen – cirka 0,03 % ökad storlek för en okomprimerad säkerhetskopia och ytterligare 0,04 % för en komprimerad säkerhetskopia.

Påverkan på prestanda

Även om kryptering hade en försumbar inverkan på storleken, gjorde det det påverka hastigheten på säkerhetskopieringen. Men i vissa fall, inte på det sätt som du tror. Här är det övergripande måttet på genomsnittliga körtider för varje tillvägagångssätt:


Genomsnittlig varaktighet, i sekunder, för olika säkerhetskopior

Jag förväntade mig verkligen att krypteringen alltid skulle orsaka en prestandaträff, och du bör testa i din miljö för att se om dina resultat skiljer sig från mina. Jag kommer att återkomma och uppdatera detta med ett nytt diagram som visar specifika fall som var förvånande för mig, och ta bort några extremvärden för att se till att resultaten verkligen är representativa.

En varning

En viktig anmärkning:du kan inte lägga till krypterade säkerhetskopior. Om du genererar en krypterad säkerhetskopia med WITH INIT , och sedan försöka lägga till en annan krypterad säkerhetskopia till samma fil, får du det här felet:

Msg 3095, Level 16, State 1, Line 11
Säkerhetskopieringen kan inte utföras eftersom 'ENCRYPTION' begärdes efter att mediet formaterades med en inkompatibel struktur. För att lägga till denna mediauppsättning, antingen utelämna 'KRYPTION' eller skapa en ny mediauppsättning genom att använda WITH FORMAT i din BACKUP-sats. Om du använder WITH FORMAT på en befintlig mediauppsättning kommer alla dess säkerhetskopieringsuppsättningar att skrivas över.
Msg 3013, Level 16, State 1, Line 11
BACKUP DATABAS avslutas onormalt.

Du kan, förvirrande nog, lägga till ett icke -krypterad säkerhetskopia när den ursprungliga filen krypterades. Detta är inte meningen, och är en bugg som jag har rapporterat om Connect (#805220, men den är för närvarande markerad som privat); förhoppningsvis kommer de att ta itu med detta innan RTM.

Under tiden måste du vara försiktig här eftersom ingenting har ändrats i RESTORE HEADERONLY utdata för att indikera om någon av de bifogade säkerhetskopiorna var krypterade. För att upptäcka detta måste du kontrollera BackupSetGUID värde i den utgången vid Position = 1 , och hitta motsvarande backup_set_uuid värde i msdb.dbo.backupset . Den här tabellen har nya kolumner för att stödja kryptering, där du kan få denna information:key_algorithm , encryptor_thumbprint och encryptor_type . Detta är problematiskt i fall där du inte har backupset data – kanske har det rensats ut under underhållsuppgifter, eller så kanske du inte kan komma åt det för att du verkligen återhämtar dig från en katastrof eller bara har .bak-filen (eller bara har .bak-filen av andra skäl). I det här fallet hoppas jag att det finns något annat sätt att se från säkerhetskopian att den har krypterats (och hur), men i skrivande stund vet jag inte något sätt. Jag lämnade in ett förslag (#805292, även privat) att utdata från RESTORE HEADERONLY utökas med krypteringsinformation på samma sätt som den utökades med komprimeringsinformation när den funktionen lades till i SQL Server 2008.

När de löser dessa problem (och jag är övertygad om att de kommer att göra det), tar jag bort allt detta brus, men det är viktigt att vara medveten om detta under tiden, om du ska utföra några tester med nuvarande CTP:er.

Nästa...

Vad den här typen av säkerhetskopiering betyder för återställning kommer jag att cirkla tillbaka till i ett annat inlägg, när jag testar återställningshastigheter och avslöjar eventuella problemområden där. Jag vill också se över dessa tester för att undersöka krypterade loggsäkerhetskopior.


  1. Oracle PLS-00363:uttryck '' kan inte användas som ett tilldelningsmål

  2. Hur man lägger till en ny kolumn i en befintlig tabell i SQL Server (T-SQL)

  3. Samla rekursiva JSON-nycklar i Postgres

  4. LOAD DATA LOCAL INFILE ger felet Det använda kommandot är inte tillåtet med denna MySQL-version