摘要管理

適用於: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL 受控執行個體

資料庫摘要

資料庫總帳中最新區塊的雜湊稱為「資料庫摘要」。 這代表產生區塊時,資料庫中所有總帳資料表的狀態。 產生資料庫摘要十分有效率,因為此作業僅需計算近期附加的區塊雜湊。

資料庫摘要可由系統自動產生,或由使用者手動產生。 您稍後可以使用摘要來確認資料庫的完整性。

產生的資料庫摘要為 JSON 文件格式,其中包含最新區塊的雜湊,以及區塊識別碼的中繼資料。 此中繼資料會包含摘要產生的時間,以及此區塊中最新交易的認可時間戳記。

驗證程序和資料庫的完整性取決於輸入摘要的完整性。 因此,從資料庫中擷取的資料庫摘要必須儲存在信任的儲存體中,且要確保資料庫中具高階權限的使用者或攻擊者無法竄改此儲存體。

自動產生和儲存資料庫摘要

注意

自動產生和儲存 SQL Server 資料庫摘要的功能僅支援 Azure 儲存體帳戶。

總帳會與 Azure Blob 儲存體的不可變儲存體功能Azure 機密總帳整合。 這項整合可在 Auzre 中提供安全的儲存體服務,協助保護資料庫摘要免遭潛在的竄改行為。 這項整合提供簡單且符合成本效益的方式,供使用者自動化摘要管理,無須擔心摘要的可用性和地理複寫。 若客戶對特殊權限管理員存取摘要的行為有所疑慮,Azure 機密總帳可以提供更強大的完整性保證。 本資料表比較了 Azure Blob 儲存體與 Azure 機密總帳的不可變儲存體功能。

您可以透過 Azure 入口網站、PowerShell 或 Azure CLI 來設定自動產生和儲存資料庫摘要。 如需詳細資訊,請參閱啟用自動摘要儲存體。 當您設定自動產生和儲存時,系統會先依預先定義的 30 秒間隔產生資料庫摘要,並將其上傳至所選的儲存體服務。 如果系統在 30 秒間隔內未發生交易,便不會產生和上傳資料庫摘要。 這項機制可確保僅在資料上傳至資料庫時,才會產生資料庫摘要。 當端點是 Azure Blob 儲存體 時,Azure SQL 資料庫或 Azure SQL 受控執行個體的邏輯伺服器會建立名為 sqldbledgerdigests 的新容器,並使用以下命名模式:ServerName/DatabaseName/CreationTime。 因為可以卸除和重新建立或還原具有相同名稱的資料庫,因此需要建立時間,以相同名稱允許資料庫的不同化身。 如需詳細資訊,請參閱摘要管理考量

注意

針對 SQL Server,使用者必須手動建立容器。

Azure 儲存體帳戶不變性原則

如果您使用 Azure 儲存體帳戶儲存資料庫摘要,完成佈建後,請為容器設定不變性原則,以保護資料庫摘要不受竄改。 請確定不變性原則允許受保護的附加寫入附加 Blob,且原則已鎖定。

Azure 儲存體帳戶權限

如果您使用的是 Azure SQL 資料庫Azure SQL 受控執行個體,請確定邏輯伺服器或受控執行個體 (系統身分識別) 擁有足夠的角色型存取控制 (RBAC) 權限,能夠將摘要新增至儲存體 Blob 資料參與者角色,藉此寫入摘要。 如果您使用作用中異地復寫或自動容錯移轉群組,請確定次要複本在 Azure 儲存體帳戶上具有相同的 RBAC 權限。

如果您使用的是 SQL Server,則必須在摘要容器中建立共用存取簽章 (SAS),以允許 SQL Server 連線至 Azure 儲存體帳戶並向其進行驗證。

  • 在 Azure 儲存體帳戶內建立名為 sqldbledgerdigests 的容器。
  • 在容器中建立具備「讀取」、「新增」、「建立」、「寫入」和「列出」權限的原則,並產生共用存取簽章金鑰。
  • 為摘要檔案儲存體使用的 sqldbledgerdigests 容器,建立名稱符合容器路徑的 SQL Server 認證

以下範例假設已建立 Azure 儲存體容器、原則和 SAS 金鑰。 為了讓 SQL Server 存取容器中的摘要檔案,這是必要項目。

在下列程式碼片段中,以 SAS 金鑰取代 <your SAS key>。 SAS 金鑰如下所示:'sr=c&si=<MYPOLICYNAME>&sig=<THESHAREDACCESSSIGNATURE>'

CREATE CREDENTIAL [https://ledgerstorage.blob.core.windows.net/sqldbledgerdigests]  
WITH IDENTITY='SHARED ACCESS SIGNATURE',  
SECRET = '<your SAS key>'   

Azure 機密總帳權限

如果您使用的是 Azure SQL 資料庫Azure SQL 受控執行個體,請確定邏輯伺服器或受控執行個體 (系統身分識別) 擁有足夠的權限,能夠將摘要新增至參與者角色,藉此寫入摘要。 若要這樣做,請遵循 Azure 機密總帳使用者管理的步驟操作。

注意

自動產生和儲存 SQL Server 資料庫摘要的功能僅支援 Azure 儲存體帳戶。

設定 Azure SQL 受控執行個體 NSG 規則以使用 Azure 機密總帳

如果您使用 Azure SQL 受控執行個體,請確定您已設定 Azure SQL 受控執行個體的虛擬網路規則,以與 Azure 機密總帳通訊。 如需詳細資訊,請參閲設定 Azure SQL 受控執行個體 NSG 規則以使用 Azure 機密總帳

手動產生和儲存資料庫摘要

您也可以依需求產生資料庫摘要,如此便能以手動方式將摘要儲存在您信任的儲存體目的地中任何服務或裝置。 例如,您可以選擇進行一次內部部署寫入,將許多 (WORM) 裝置讀取為目的地。 您可以執行 SQL Server Management StudioAzure Data Studio 中的 sys.sp_generate_database_ledger_digest 預存程序,來手動產生資料庫摘要。

EXECUTE sp_generate_database_ledger_digest;

傳回的結果集是單一資料列。 此結果集應以 JSON 文件格式儲存於受信任的儲存位置,如下所示:

    {
        "database_name":  "ledgerdb",
        "block_id":  0,
        "hash":  "0xDC160697D823C51377F97020796486A59047EBDBF77C3E8F94EEE0FFF7B38A6A",
        "last_transaction_commit_time":  "2020-11-12T18:01:56.6200000",
        "digest_time":  "2020-11-12T18:39:27.7385724"
    }

權限

產生資料庫摘要需要GENERATE LEDGER DIGEST權限。 如需總帳資料表相關權限的詳細資訊,請參閱權限

摘要管理考量

資料庫還原

發生錯誤時,若使用者需要快速將資料庫的狀態還原至較早的時間點,經常會使用「還原時間點」這項作業。 將產生的摘要上傳至 Azure 儲存體或 Azure 機密總帳後,系統會擷取這些摘要所對應的資料庫建立時間。 資料庫每次還原後都會標上新的建立時間,這項技術讓我們可將摘要儲存在資料庫的所有不同「實體」(incarnation) 中。 對 SQL Server 而言,建立時間是指首次啟用摘要上傳作業當下的 UTC 時間。 總帳會保留還原作業時的相關資訊,讓驗證流程能夠使用資料庫各種實體 (incarnation) 中所有相關摘要。 此外,使用者可以檢查所有摘要,找出不同的建立時間,以識別資料庫還原的時間以及最早的還原時間點。 由於此資料是寫入不可變儲存體,因此這項資訊也會受到保護。

注意

如果您在 Azure SQL 受控執行個體中執行資料庫備份的原生還原,則需要使用 Azure 入口網站、PowerShell 或 Azure CLI 手動變更摘要路徑。

作用中異地複寫和 AlwaysOn 可用性群組

您可以為 Azure SQL 資料庫或 Azure SQL 受控執行個體設定作用中異地複寫或自動容錯移轉群組。 基於效能考量,跨地理區域的複寫不會同步進行,因此次要資料庫會比主要資料庫稍微落後。 發生地理容錯移轉時,所有尚未複寫的最新資料都會遺失。 總帳只會針對已複寫至地理次要資料庫的資料發行資料庫摘要,以確保摘要永遠不會參考在地理容錯移轉時可能遺失的資料。 這僅適用於自動產生和儲存資料庫摘要。 在容錯移轉群組中,主要資料庫和次要資料庫將會有相同的摘要路徑。 即使您執行容錯移轉,也不會同時變更主要資料庫和次要資料庫的摘要路徑。

如果刪除容錯移轉群組,或您卸除連結,這兩個資料庫都會以主要資料庫的形式運作。 此時,先前次要資料庫的摘要路徑將會變更,我們會將 RemovedSecondaryReplica 資料夾新增至該路徑。

若您的資料庫屬於 SQL Server 中 Always On 可用性群組或受控執行個體連結的一部分,便會採用與作用中異地複寫相同的原則。 待所有交易都複寫到次要複本後,摘要才會上傳。