Sql-Server
如何安全地通過整個數據庫成功解密列數據?
我們正在遷移到 Azure SqlDb,但作為其中的一部分,我們需要遷移,
EncryptByPassPhrase
因為它不受支持。因此,我們在周末嘗試了這個過程,但我們遇到了日誌填滿並且腳本在中途停止的情況。
我在這裡有什麼選擇?在此過程中數據庫的使用率將為零,我可以/應該將數據庫暫時從完全恢復模式更改為簡單嗎?我真的不認為我們在乎過程中的個別交易,只關心最終結果。
此外,鑑於我們正在執行計算密集型任務 - 我是否應該暫時增加 CPU 資源以希望使其執行得更快?失敗了9個多小時,我想知道日誌是否受到干擾。
這是:
- SQL 2019 (15.0.2000.5)
- 數據庫兼容性為 150
- 在此過程中,我們已禁用所有觸發器/作業
這是腳本的一部分:
DECLARE @Password VARCHAR(255) = '<some super cool long very high entropy password here>'; SET NOCOUNT ON; DECLARE @TestDecryption VARCHAR(255); SELECT TOP(1)@TestDecryption = CONVERT (VARCHAR(50), DECRYPTBYPASSPHRASE (@Password, HealthNumber_Enc)) FROM Patients.Patient WHERE ProvinceCode = 'ON' AND HealthNumber_Enc IS NOT NULL ORDER BY CreateDate DESC; PRINT 'Test: ' + @TestDecryption; IF @TestDecryption IS NOT NULL -- this is to ensure that our password actually works BEGIN ; DISABLE TRIGGER ALL ON DATABASE; -- systematically decrypt data in all affected tables UPDATE Users.Activity SET [Description] = ISNULL (CONVERT (VARCHAR(1000), DECRYPTBYPASSPHRASE (@Password, Description_Enc)), [Description]); UPDATE Users.Activity SET Description_Enc = NULL; UPDATE Contact.[Address] SET Address1 = ISNULL (CONVERT (VARCHAR(1000), DECRYPTBYPASSPHRASE (@Password, Address1_Enc)), Address1), Address2 = ISNULL (CONVERT (VARCHAR(1000), DECRYPTBYPASSPHRASE (@Password, Address2_Enc)), Address2), Address3 = ISNULL (CONVERT (VARCHAR(1000), DECRYPTBYPASSPHRASE (@Password, Address3_Enc)), Address3), City = ISNULL (CONVERT (VARCHAR(255), DECRYPTBYPASSPHRASE (@Password, City_Enc)), City), PostalCode = ISNULL (CONVERT (VARCHAR(20), DECRYPTBYPASSPHRASE (@Password, PostalCode_Enc)), PostalCode), Latitude = ISNULL (CONVERT (DECIMAL(9, 6), CONVERT (VARCHAR(10), DECRYPTBYPASSPHRASE (@Password, Latitude_Enc))), Latitude), Longitude = ISNULL (CONVERT (DECIMAL(9, 6), CONVERT (VARCHAR(10), DECRYPTBYPASSPHRASE (@Password, Longitude_Enc))), Longitude); UPDATE Contact.[Address] SET Address1_Enc = NULL, Address2_Enc = NULL, Address3_Enc = NULL, City_Enc = NULL, PostalCode_Enc = NULL, Latitude_Enc = NULL, Longitude_Enc = NULL -- Some 50 other tables after here .. ;ENABLE TRIGGER ALL ON DATABASE; END; ELSE BEGIN PRINT 'Test Decryption returned NULL. Will not proceed!!'; END;
錯誤看起來像:
Msg 9002, Level 17, State 2, Procedure TRIG_Contact_Address_UPDATE_1, Line 26 [Batch Start Line 0] The transaction log for database 'YourExampleDb' is full due to 'LOG_BACKUP'.
進行更頻繁的日誌備份和/或增加可用於日誌文件的磁碟空間。讓它在周末執行 48 小時。
我對您的系統一無所知,但增加 CPU 不太可能有幫助。
使用
TOP(n)
方法分批進行。您可以監控事務日誌大小並相應地調整批處理大小。
如果您想將數據庫保持在完全恢復模式,那麼您可以備份日誌並根據需要縮小它。