Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server 2014:Mã hóa sao lưu gốc

Một tính năng mới trong SQL Server 2014 mà nhiều người trong số các bạn chưa biết đến cho đến khi nó được công bố vào tuần này tại Hội nghị thượng đỉnh PASS là mã hóa sao lưu gốc trong các phiên bản Standard, Business Intelligence và Enterprise (xin lỗi, Web và Express không được hỗ trợ). Đây là thứ mà các nhà cung cấp bên thứ 3 đã cung cấp trong một thời gian dài, và cuối cùng hãng cũng đưa vào sản phẩm, hỗ trợ bốn thuật toán mã hóa:AES 128, AES 192, AES 256 và Triple DES (3DES).

Nếu bạn hiện đang sử dụng Mã hóa dữ liệu minh bạch chỉ với mục đích có dữ liệu được mã hóa trong các tệp sao lưu của mình, thì đây có thể là một cách để di chuyển từ kỹ thuật đó và có các bản sao lưu được mã hóa mà không bị TDE đặt vào hệ thống trực tiếp của bạn. Nếu bạn hiện đang sử dụng công cụ của bên thứ 3 để sao lưu được mã hóa, bạn nên so sánh công cụ đó với chức năng và hiệu suất của các bản sao lưu được mã hóa gốc.

P.S. Bạn có thể tải xuống CTP2 ngay bây giờ.

Tôi không muốn so sánh với các sản phẩm của bên thứ 3 - tôi chắc chắn rằng tất cả chúng đều hoạt động tốt và có thể có các tính năng bổ sung mà tôi thậm chí còn chưa nghĩ đến. Tôi chỉ muốn kiểm tra xem các thuật toán khác nhau sẽ gặp phải tác động gì đối với các bản sao lưu đầy đủ, từ và đến cả đĩa spinny truyền thống (RAID 1) và ổ đĩa trạng thái rắn, và có và không có tính năng nén gốc.

Vì vậy, tôi đã tải xuống tệp dữ liệu AdventureWorks2012, tạo thành hai bản sao, đặt tên là awSSD.mdfawHDD.mdf và đặt một trên ổ RAID 1 (D:\) và một trên ổ SSD (E:\). Sau đó, tôi đính kèm cả hai với FOR ATTACH_REBUILD_LOG , đặt chúng thành FULL phục hồi, đã thay đổi cài đặt tự động tăng trưởng mặc định và đặt vị trí mặc định cho các tệp nhật ký ở giữa (vì đây là cách duy nhất tôi biết để chỉ định vị trí của tệp nhật ký được xây dựng lại):

 USE [master]; ĐI EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE ', N'Software \ Microsoft \ MSSQLServer \ MSSQLServer', N'DefaultLog ', REG_SZ, N'D:\ CTP2_Data'; ĐI TẠO CƠ SỞ DỮ LIỆU awHDD ON (tên tệp ='D:\ CTP2_Data \ awHDD.mdf') FOR 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' , N'Software \ Microsoft \ MSSQLServer \ MSSQLServer ', N'DefaultLog', REG_SZ, N'E:\ CTP2_Data '; ĐI TẠO CƠ SỞ DỮ LIỆU awSSD ON (tên tệp =' E:\ CTP2_Data \ awSSD.mdf ') CHO ATTACH_REBUILD_LOG; ALTER DATABASE awSSD SET RECOVERY FULL; ALTER DATABASE awSSD MODIFY FILE (NAME =N'AdventureWorks2012_Data ', FILEGROWTH =512000KB); ALTER DATABASE awSSD MODIFY FILE (NAME =N'AdventureWorks2012_Log', FILEGROWTH) 

Tiếp theo, tôi phóng to chúng bằng cách sử dụng tập lệnh này của Jonathan Kehayias (để cả cơ sở dữ liệu và nhật ký đều đủ lớn để có ý nghĩa). Quá trình này mất khoảng 4 phút cho mỗi cơ sở dữ liệu trên cả HDD và SSD.

Tại thời điểm đó, EXEC sp_helpfile; đã mang lại những điều sau cho mỗi cơ sở dữ liệu:

 tên fileid kích thước tên tệp --------------------------------- -------- ---- AdventureWorks2012_Data 1  .mdf 1553408 KBAdventureWorks2012_Log 2  .ldf 5605504 KB 

Bây giờ, một vài điều về tính năng này trước khi chúng tôi thực sự có thể bắt đầu thực hiện sao lưu được mã hóa. Bạn cần có chứng chỉ (hoặc khóa không đối xứng) để sử dụng mã hóa và điều này sẽ yêu cầu khóa chính. Tôi đã chọn một chứng chỉ và tạo những chứng chỉ này như sau:

 use master; GOCREATE MASTER KEY ENCRYPTION BY PASSWORD ='p @ ssw0rd'; GOOPEN MASTER KEY DECRYPTION BY PASSWORD ='p @ ssw0rd'; GOCREATE CERTIFICATE TestCert WITH SUBJECT ='EncryptionTests'; GO 

Bạn cũng nhận được cảnh báo nếu bạn cố gắng tạo bản sao lưu được mã hóa bằng chứng chỉ chưa được sao lưu:

Cảnh báo:Chứng chỉ được sử dụng để mã hóa khóa mã hóa cơ sở dữ liệu chưa được sao lưu. Bạn nên sao lưu ngay chứng chỉ và khóa cá nhân được liên kết với chứng chỉ. Nếu chứng chỉ không còn khả dụng hoặc nếu bạn phải khôi phục hoặc đính kèm cơ sở dữ liệu trên một máy chủ khác, bạn phải có bản sao lưu của cả chứng chỉ và khóa cá nhân, nếu không bạn sẽ không thể mở cơ sở dữ liệu.

Trong trường hợp của tôi, tôi chỉ có thể sao lưu chứng chỉ và khóa chính, như sau:

 CHỨNG NHẬN DỰ PHÒNG TestCert TO FILE ='C:\ temp \ TestCert.cert' VỚI KHÓA RIÊNG TƯ (FILE ='C:\ temp \ TestCert.key', ENCRYPTION BY PASSWORD ='p @ ssw0rd'); BACKUP MASTER KEY TO FILE ='C:\ temp \ MasterKey.key' ENCRYPTION BY PASSWORD ='p @ ssw0rd'; 

Nói một cách chính xác, sao lưu khóa chính là không cần thiết để thực hiện sao lưu được mã hóa (hoặc thậm chí để tránh cảnh báo), nhưng dù sao thì bạn cũng nên sao lưu điều này. Và bạn có thể sẽ muốn sử dụng mật khẩu mạnh hơn p@ssw0rd , lưu trữ nó ở một nơi nào đó không phải ổ C:trên cùng một máy, v.v. Cuối cùng, bạn nên lưu ý rằng nếu bạn mã hóa các bản sao lưu của mình và bạn không thực hiện tất cả các biện pháp phòng ngừa phù hợp, chúng có thể vô dụng trong trường hợp xảy ra thảm họa . Đây không phải là một tính năng mà bạn chỉ nên bật nếu không có sự siêng năng và thử nghiệm.

Với tất cả những điều đó, tôi có thể tiếp tục thử nghiệm. Hệ thống này chỉ có một đĩa dựa trên đĩa đơn và một SSD duy nhất, vì vậy tôi không thể kiểm tra SSD -> SSD hoặc HDD khác nhau -> HDD khác nhau; chỉ sao lưu từ ổ này sang ổ khác, hoặc vào cùng một ổ đĩa. Cú pháp cơ bản để sao lưu bằng mã hóa là:

 CƠ SỞ DỮ LIỆU DỰ PHÒNG ... CÓ VIẾT TẮT (ALGORITHM =, SERVER CERTIFICATE =); 

Và bốn giá trị có thể có cho <algorithm>AES_128 , AES_192 , AES_256TRIPLE_DES_3KEY .

Vì vậy, tiếp theo, tôi tạo tập lệnh để chạy các bản sao lưu nhằm so sánh hiệu suất và kích thước của các kết hợp khác nhau - bốn thuật toán mã hóa khác nhau (và không mã hóa), có và không có nén, dữ liệu đến từ đâu (HDD hoặc SSD) và dữ liệu được sao lưu vào (HDD hoặc SSD). Đó là 40 bản sao lưu khác nhau và tập lệnh tôi đã sử dụng để tạo nó trông giống như sau:

 DECLARE @sql NVARCHAR (MAX) =N '';; WITH (s) AS (CHỌN 1 ĐOÀN KẾT TẤT CẢ CHỌN 2), m AS (CHỌN m TỪ (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 KHI 1 THEN' HDD 'ELSE' SSD 'END + 'TO DISK =' '' + d + ':\ backup \' + n + '.bak' 'WITH INIT,' + c + ',' + COALESCE ('ENCRYPTION (ALGORITHM =' + m + ', SERVER CERTIFICATE) =TestCert), ',' ') +' NAME ='' '+ n +' ''; ' FROM (SELECT *, n ='test' + CONVERT (VARCHAR (8000), RIGHT ('0' + RTRIM (r), 2)) + '-' + COALESCE (m, 'NO_ENCRYPTION') + '-' + TRƯỜNG HỢP KHI r <11 THÌ 'HDD' ELSE 'SSD' END + '-to-' + t + '-' + c FROM (SELECT *, r =ROW_NUMBER () HẾT (PHẦN THEO ĐƠN HÀNG d.d THEO s.s, m.m, c.c ) FROM s CROSS JOIN m CROSS JOIN c CROSS JOIN d) AS x) AS y ORDER BY r; --EXEC sp_executesql @sql; - ĐI 10 CHỌN CHUYỂN ĐỔI (XML, @sql); 

Trông thực sự phức tạp, nhưng thực sự nó chỉ tạo ra 40 BACKUP DATABASE dây. Tôi chọn dưới dạng XML để khi bạn nhấp vào kết quả trong lưới, bạn có thể xem toàn bộ kết quả đầu ra - thay vì PRINT hoặc chọn đầu ra thành lưới / văn bản sẽ giới hạn bạn. Đầu ra trong trường hợp này là bên dưới (nhấp để hiển thị / ẩn):

 BACKUP DATABASE awHDD TO DISK ='D:\ backup \ test01-NO_ENCRYPTION-HDD-to-HDD-COMPRESSION.bak' VỚI INIT, COMPRESSION, NAME ='test01-NO_ENCRYPTION-HDD-to-HDD-COMPRESSION'; CƠ SỞ DỮ LIỆU DỰ PHÒNG awHDD TO DISK ='E:\ backup \ test01-NO_ENCRYPTION-HDD-to-SSD-COMPRESSION.bak' VỚI INIT, COMPRESSION, NAME ='test01-NO_ENCRYPTION-HDD-to-SSD-COMPRESSION'; CƠ SỞ DỰ PHÒNG awHDD TO DISK ='E:\ backup \ test02-NO_ENCRYPTION-HDD-to-SSD-NO_COMPRESSION.bak' VỚI INIT, NO_COMPRESSION, NAME ='test02-NO_ENCRYPTION-HDD-to-SSD-NO_COMPRESSION'; CƠ SỞ DỰ PHÒNG awHDD TO DISK ='D:\ backup \ test02-NO_ENCRYPTION-HDD-to-HDD-NO_COMPRESSION.bak' VỚI INIT, NO_COMPRESSION, NAME ='test02-NO_ENCRYPTION-HDD-to-HDD-NO_COMPRESSION'; CƠ SỞ DỰ PHÒNG awHDD TO DISK ='D:\ backup \ test03-AES_128-HDD-to-HDD-COMPRESSION.bak 'VỚI INIT, COMPRESSION, ENCRYPTION (ALGORITHM =AES_128, SERVER CERTIFICATE =TestCert), NAME =' test03-AES_128-HDD-to-HDD-COMPRESSION '; CƠ SỞ DỮ LIỆU DỰ PHÒNG awHDD TO DISK ='E:\ backup \ test03-AES_128-HDD-to-SSD-COMPRESSIO N.bak 'WITH INIT, COMPRESSION, ENCRYPTION (ALGORITHM =AES_128, SERVER CERTIFICATE =TestCert), NAME =' test03-AES_128-HDD-to-SSD-COMPRESSION '; BACKUP DATABASE awHDD TO DISK =' E:\ backup \ test04 -AES_128-HDD-to-SSD-NO_COMPRESSION.bak 'VỚI INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_128, SERVER CERTIFICATE =TestCert), NAME =' test04-AES_128-HDD-to-SSD-NO_COMPRESSION '; DISK ='D:\ backup \ test04-AES_128-HDD-to-HDD-NO_COMPRESSION.bak' VỚI INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_128, SERVER CERTIFICATE =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 'VỚI INIT, COMPRESSION, ENCRYPTION (ALGORITHM =AES_192, SERVER CERTIFICATE =TestCert), NAME 'test05-AES_192-HDD-to-HDD-COMPRESSION'; BACKUP DATABASE awHDD TO DISK ='E:\ backup \ test05-AES_192-HDD-to-SSD-COMPRESSION.bak' VỚI INIT, COMPRESSION, ENCRYPTION (ALGORITHM =AES_192 , SERVER CERTIFICATE =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 ( ALGORITHM =AES_192, SERVER CERTIFICATE =TestCert), NAME ='test06-AES_192-HDD-to-SSD-NO_COMPRESSION'; BACKUP DATABASE awHDD TO DISK ='D:\ backup \ test06-AES_192-HDD-to-HDD-NO_COMPRESSION. bak 'WITH INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_192, SERVER CERTIFICATE =TestCert), NAME =' test06-AES_192-HDD-to-HDD-NO_COMPRESSION '; BACKUP DATABASE awHDD TO DISK =' D:\ backup \ test07 -HDD-to-HDD-COMPRESSION.bak 'VỚI INIT, COMPRESSION, ENCRYPTION (ALGORITHM =AES_256, SERVER CERTIFICATE =TestCert), NAME =' test07-AES_256-HDD-to-HDD-COMPRESSION '; BACKUP DATABASE awHDD TO DISK ='E:\ backup \ test07-AES_256-HDD-to-SSD-COMPRESSION.bak' VỚI INIT, COMPRESSION, ENCRYPTION (ALGORITHM =AES_256, SERVER CERTIFICATE =TestCert), NAME ='test07-AES_256-HDD-to-SSD- COMPRESSION '; CƠ SỞ DỮ LIỆU DỰ PHÒNG awHDD TO DISK =' E:\ backup \ te st08-AES_256-HDD-to-SSD-NO_COMPRESSION.bak 'WITH INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_256, SERVER CERTIFICATE =TestCert), NAME =' test08-AES_256-HDD-to-SSD-NO_COMPRESSION ' TO DISK ='D:\ backup \ test08-AES_256-HDD-to-HDD-NO_COMPRESSION.bak' VỚI INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_256, SERVER CERTIFICATE =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 'VỚI INIT, COMPRESSION, ENCRYPTION (ALGORITHM =TRIPLE_DES_3KEY, NAME =Test CERTIFICATE) ='test09-TRIPLE_DES_3KEY-HDD-to-HDD-COMPRESSION'; CƠ SỞ DỮ LIỆU DỰ PHÒNG awHDD TO DISK ='E:\ backup \ test09-TRIPLE_DES_3KEY-HDD-to-SSD-COMPRESSION.bak' VỚI INIT, COMPRESSION, ENCRYPTION (ALGORITHM =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 (ALGORITHM =TRIPLE_DES_3KEY, SERVER CERTIFICATE =TestCert), NAME =' test10-TRIPLE_DES_3KEY-HDD-to-SSD-NO_COMPRESSION '; BACKUP DATABASE awHDD TO DISK =' D TRIPLE_DES_3KEY-HDD-to-HDD-NO_COMPRESSION.bak 'VỚI INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =TRIPLE_DES_3KEY, SERVER CERTIFICATE =TestCert), NAME =' test10-TRIPLE_DES_3KEY-HDD-to-BACKSUP TOAT_ABASE_3KEY-HDD-to-HDD-NOAT_COMPSDION '; ='D:\ backup \ test11-NO_ENCRYPTION-SSD-to-HDD-COMPRESSION.bak' VỚI INIT, COMPRESSION, NAME ='test11-NO_ENCRYPTION-SSD-to-HDD-COMPRESSION'; CƠ SỞ DỰ PHÒNG awSSD TO DISK ='E :\ backup \ test11-NO_ENCRYPTION-SSD-to-SSD-COMPRESSION.bak 'VỚI INIT, COMPRESSION, NAME =' test11-NO_ENCRYPTION-SSD-to-SSD-COMPRESSION '; CƠ SỞ DỮ LIỆU DỰ PHÒNG awSSD TO DISK =' E:\ backup \ test12-NO_ENCRYPTION-SSD-to-SSD-NO_COMPRESSION.bak 'VỚI INIT, NO_COMPRESSION, NAME =' test12-NO_ENCRYPTION-SSD-to-SSD-NO_COMPRESSION '; CƠ SỞ DỰ PHÒNG 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 'VỚI INIT, COMPRESSION, ENCRYPTION (ALGORITHM =AES_128, SERVER CERTIFICATE =TestCert), NAME =' test13-AES_128-SSD-to-HDD-COMPRESSION '; BACKUP DATABASE awSSD TO DISK =' E:\ backup \ test13-AES_128-SSD-to-SSD-COMPRESSION.bak 'VỚI INIT, COMPRESSION, ENCRYPTION (ALGORITHM =AES_128, SERVER CERTIFICATE =TestCert), NAME =' test13-AES_128-SSD-to-SSD-COMPRESSION '; BACKUP DATABASE awSSD TO DISK ='E:\ backup \ test14-AES_128-SSD-to-SSD-NO_COMPRESSION.bak' WITH INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_128, SERVER CERTIFICATE =TestCert), NAME ='test14-AES_128-SSD -to-SSD-NO_COMPRESSION '; BACKUP DATABASE awSSD TO DISK =' D:\ backup \ test14-AES_128-SSD-to-HDD-NO_COMPRESSION.bak 'VỚI INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_128, SERVER CERTIFICATE) , 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 'VỚI INIT, COMPRESSION, ENCRYPTION (ALGORITHM =AES_192, SERVER CERTIFICATE =TestCert), NAME 'test15-AES_192-SSD-to-HDD-COMPRESSION'; BACKUP DATABASE awSSD TO DISK ='E:\ backup \ test15-AES_192-SSD-to-SSD-COMPRESSION.bak' VỚI INIT, COMPRESSION, ENCRYPTION (ALGORITHM =AES_192 , SERVER CERTIFICATE =TestCert), NAME ='test15-AES_192-SSD-to-SSD-COMPRESSION'; BACKUP DATABASE awSSD TO DISK ='E:\ backup \ test16-AES_192-SSD-to-SSD-NO_COMPRESSION.bak' WITH INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_192, SERVER CERTIFICATE =TestCert), NAME ='test16-AES_192-SSD-to-SSD-NO_COMPRESSION'; BACKUP DATABASE awSSD TO DISK ='D SSD:\ backup \ test16-AES_19 to-HDD-NO_COMPRESSION.bak 'WITH INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_192, SERVER CERTIFICATE =TestCert), NAME =' test16-AES_192-SSD-to-HDD-NO_COMPRESSION '; BACKUP DATABASE =awSSD TO:\ backup \ test17-AES_256-SSD-to-HDD-COMPRE SSION.bak 'VỚI INIT, COMPRESSION, ENCRYPTION (ALGORITHM =AES_256, SERVER CERTIFICATE =TestCert), NAME =' test17-AES_256-SSD-to-HDD-COMPRESSION '; BACKUP DATABASE awSSD TO DISK =' E:\ backup \ test17 -AES_256-SSD-to-SSD-COMPRESSION.bak 'VỚI INIT, COMPRESSION, ENCRYPTION (ALGORITHM =AES_256, SERVER CERTIFICATE =TestCert), NAME =' test17-AES_256-SSD-to-SSD-COMPRESSION '; BACKUP DATABASE awSSD TO DISK ='E:\ backup \ test18-AES_256-SSD-to-SSD-NO_COMPRESSION.bak' VỚI INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_256, SERVER CERTIFICATE =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 'VỚI INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =AES_256, SERVER CERTIFICATE) 'test18-AES_256-SSD-to-HDD-NO_COMPRESSION'; BACKUP DATABASE awSSD TO DISK ='D:\ backup \ test19-TRIPLE_DES_3KEY-SSD-to-HDD-COMPRESSION.bak' VỚI INIT, COMPRESSION, ENCRYPTION_3 (ALGORITHM =TRIPLE , MÁY CHỦ 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.bak' WITH INIT, COMPRESSION, ENCRYPTION (ALGORITHM =TRIPLE_DES_3KEY, SERVER CERTIFICATE =TestCert), NAME ='test19-TRIPLE_DES_3KEY-SSD-to-SSD-COMPRESSION'; BACKUP DATABASE awSSD TO DISK ='E:\ backup \ test20-TRIPLE_DES_3- toKEY-backup \ test20-TRIPLE_DES_3 SSD-NO_COMPRESSION.bak 'VỚI INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =TRIPLE_DES_3KEY, SERVER CERTIFICATE =TestCert), NAME =' test20-TRIPLE_DES_3KEY-SSD-to-SSD-NO_COMPRESSION '; BACKSSD DATABASE \ backup \ test20-TRIPLE_DES_3KEY-SSD-to-HDD-NO_COMPRESSION.bak 'VỚI INIT, NO_COMPRESSION, ENCRYPTION (ALGORITHM =TRIPLE_DES_3KEY, SERVER CERTIFICATE =TestCert), NAME =' test20-TRIPLE_DES_3KEY-SSD-to-HDD trước> 

Tôi không cần phải làm bất cứ điều gì đặc biệt để tính thời gian cho những thứ này, bởi vì tôi có thể lấy tất cả các thống kê liên quan từ cơ sở dữ liệu msdb sau khi chúng được thực hiện (nhược điểm duy nhất là thời lượng chỉ được đo ở mức độ chi tiết của giây, trừ khi tôi muốn để phân tích cú pháp đầu ra theo cách thủ công). Vì vậy, tôi đã bỏ ghi chú EXEC sp_executesqlGO (Tôi muốn chạy mỗi bản sao lưu 10 lần để lấy giá trị trung bình, loại trừ điểm bất thường, v.v.), nhấn F5 và bắt đầu thực hiện một trong các phiên của tôi cho Hội nghị PASS.

Khi tôi quay lại, tôi đã kiểm tra các bảng msdb để biết kích thước / thời lượng cho mỗi bản sao lưu. Truy vấn này khá đơn giản:

; WITH x AS (SELECT name, natural_size =backup_size / 1024 / 1024.0, archi_size =ressed_backup_size / 1024 / 1024.0, time =1.0 * DATEDIFF (SECOND, backup_start_date, backup_finish_date) FROM msdb.dbo.backupset WHERE tên LIKE 'thử nghiệm % ') SELECT tên, [natural_size] =MAX (natural_size), [fixed_size] =MAX (fixed_size), [min_duration] =MIN (thời lượng), [max_duration] =MAX (thời lượng), [avg_duration] =AVG (thời lượng) TỪ x NHÓM THEO tên RỐI LOẠN THEO tên; 

Điều này sẽ cung cấp cho tôi dữ liệu tôi cần để tạo một số biểu đồ đẹp.

Ảnh hưởng đến kích thước

Tùy thuộc vào kinh nghiệm của bạn với mã hóa nói chung, bạn có thể ngạc nhiên hoặc không ngạc nhiên rằng việc mã hóa một bản sao lưu cơ sở dữ liệu có rất ít tác động đến kích thước tổng thể của nó. Làm thế nào điều này hoạt động nằm ngoài phạm vi của bài đăng này, nhất định; một lời giải thích đơn giản sẽ là - ít nhất là với mã hóa AES - việc nén không hiệu quả đối với hầu hết đầu ra vì nó về cơ bản là vô nghĩa ngẫu nhiên.

Kết quả cuối cùng là biểu đồ này không được thú vị cho lắm. Kích thước được nén và không nén của các bản sao lưu gốc dựa trên bốn phương pháp mã hóa khác nhau:


Kích thước, tính bằng MB, của các bản sao lưu có và không có mã hóa

Như bạn có thể thấy, hầu như không có tác động đến kích thước của cơ sở dữ liệu - kích thước tăng khoảng 0,03% đối với bản sao lưu không nén và thêm 0,04% đối với bản sao lưu nén.

Ảnh hưởng đến hiệu suất

Mặc dù mã hóa có tác động không đáng kể đến kích thước, nhưng nó đã ảnh hưởng đến tốc độ của bản sao lưu. Nhưng trong một số trường hợp, không theo cách bạn nghĩ. Dưới đây là thước đo tổng thể về thời gian chạy trung bình cho mỗi cách tiếp cận:


Thời lượng trung bình, tính bằng giây, của các bản sao lưu khác nhau

Tôi thực sự mong đợi mã hóa sẽ luôn gây ra hiệu quả hoạt động và bạn nên thử nghiệm trong môi trường của mình để xem liệu kết quả của bạn có khác với kết quả của tôi hay không. Tôi sẽ quay lại và cập nhật điều này với một biểu đồ mới hiển thị các trường hợp cụ thể khiến tôi ngạc nhiên và loại bỏ một số giá trị ngoại lệ để đảm bảo kết quả thực sự mang tính đại diện.

Một cảnh báo

Một lưu ý quan trọng:bạn không thể nối các bản sao lưu đã mã hóa. Nếu bạn tạo tệp sao lưu được mã hóa bằng WITH INIT và sau đó cố gắng nối một bản sao lưu được mã hóa khác vào cùng một tệp, bạn sẽ nhận được lỗi sau:

Msg 3095, Mức 16, Trạng thái 1, Dòng 11
Không thể thực hiện sao lưu vì 'ENCRYPTION' được yêu cầu sau khi phương tiện được định dạng với cấu trúc không tương thích. Để thêm vào tập phương tiện này, hãy bỏ qua 'ENCRYPTION' hoặc tạo tập phương tiện mới bằng cách sử dụng WITH FORMAT trong câu lệnh BACKUP của bạn. Nếu bạn sử dụng WITH FORMAT trên một tập phương tiện hiện có, tất cả các tập sao lưu của nó sẽ bị ghi đè.
Msg 3013, Level 16, State 1, Line 11
BACKUP DATABASE đang kết thúc bất thường.

Bạn có thể, một cách khó hiểu, thêm một không - sao lưu được mã hóa khi tệp ban đầu được mã hóa. Đây không phải là mục đích và là một lỗi tôi đã báo cáo trên Connect (# 805220, nhưng nó hiện được đánh dấu là riêng tư); hy vọng họ sẽ giải quyết vấn đề này trước RTM.

Trong thời gian chờ đợi, bạn phải cẩn thận ở đây vì không có gì thay đổi về RESTORE HEADERONLY đầu ra để cho biết liệu bất kỳ bản sao lưu kèm theo nào đã được mã hóa hay chưa. Để khám phá điều này, bạn cần kiểm tra BackupSetGUID giá trị trong đầu ra đó tại Position = 1 và tìm backup_set_uuid tương ứng giá trị trong msdb.dbo.backupset . Bảng này có các cột mới để hỗ trợ mã hóa, tại đây bạn có thể lấy thông tin sau:key_algorithm , encryptor_thumbprintencryptor_type . Điều này có vấn đề trong trường hợp bạn không có backupset dữ liệu - có thể nó đã bị xóa trong các nhiệm vụ bảo trì hoặc có thể bạn không thể truy cập vì bạn thực sự đang khôi phục sau thảm họa hoặc chỉ có tệp .bak (hoặc chỉ có tệp .bak vì các lý do khác). Trong trường hợp này, tôi hy vọng có một số cách khác để thông báo từ tệp sao lưu rằng nó đã được mã hóa (và cách thức), nhưng tại thời điểm viết bài, tôi không biết cách. Tôi đã gửi một đề xuất (# 805292, cũng là riêng tư) rằng đầu ra của RESTORE HEADERONLY được tăng cường thông tin mã hóa giống như cách nó được tăng cường với thông tin nén khi tính năng đó được thêm vào SQL Server 2008.

Khi họ giải quyết được những vấn đề này (và tôi tin chắc là sẽ làm được), tôi sẽ loại bỏ tất cả nhiễu này, nhưng điều quan trọng là phải lưu ý điều này trong thời gian chờ đợi, nếu bạn định thực hiện bất kỳ thử nghiệm nào với các CTP hiện tại.

Tiếp theo…

Loại sao lưu này có ý nghĩa như thế nào đối với việc khôi phục, tôi sẽ quay lại trong một bài đăng khác, khi tôi kiểm tra tốc độ khôi phục và tiết lộ bất kỳ khu vực trục trặc nào ở đó. Tôi cũng muốn truy cập lại các bài kiểm tra này để điều tra các bản sao lưu nhật ký được mã hóa.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tự động tăng chỉ mục cho Microsoft SQL Server 2008 R2

  2. HOẶC không được hỗ trợ với Câu lệnh CASE trong SQL Server

  3. Cách định dạng ngày và giờ trong SQL Server

  4. Chuyển đổi float thành varchar trong SQL Server mà không có ký hiệu khoa học

  5. Danh sách các toán tử so sánh máy chủ SQL