Share via


資料清除

注意

本文提供關於如何從裝置或服務刪除個人資料的步驟,並且可以用來支援遵循 GDPR 的義務。 如需 GDPR 的一般資訊,請參閱 Microsoft 信任中心的 GDPR 區段服務信任入口網站的 GDPR 區段

身為數據平臺,Azure Data Explorer 支援使用 Kusto .purge 和相關命令刪除個別記錄的能力。 您也可以清除整個資料表或清除具體化檢視中的記錄。

警告

透過 .purge 命令的資料刪除是設計用來保護個人資料,而且不應該用於其他案例。 其設計目的不是為了支援頻繁的刪除要求或刪除大量的資料,而且可能會對服務造成顯著的效能影響。

清除指南

在 Azure 資料總管中儲存個人資料之前,請仔細設計您的資料結構描述並調查相關的原則。

  1. 在最佳情況下,這項資料的保留期間夠短,而且會自動刪除資料。
  2. 如果無法使用保留期間使用量,請隔離少數 Azure Data Explorer 數據表中受限於隱私權規則的所有數據。 最好是僅使用一個資料表,並且從其他所有資料表連結到該資料表。 此隔離可讓您在保留敏感數據的幾個數據表上執行數據 清除程式 ,並避免所有其他數據表。
  3. 呼叫者應該盡量嘗試,讓每天針對每個資料表的 .purge 命令執行批次處理為 1-2 個命令。 請勿使用唯一的使用者身分識別述詞來發出多個命令。 而是傳送單一命令,其述詞包含需要清除的所有使用者身分識別。

清除程序

從 Azure 資料總管選擇性清除資料的程序包含下列步驟:

  1. 階段 1:為輸入提供 Azure 資料總管資料表名稱和個別記錄述詞,以指出要刪除的記錄。 Kusto 會掃描資料表,以找出參與資料清除的資料範圍。 識別的範圍是具有述詞會傳回 true 的一或多個記錄範圍。

  2. 階段 2:(虛刪除) 以重新擷取版本取代在資料表 (在步驟 (1) 中識別) 中的每個資料範圍。 重新擷取版本不應有述詞傳回 true 的記錄。 如果未將新數據擷取到數據表中,則在此階段結束時,查詢將不再傳回述詞傳回 true 的數據。 清除虛刪除階段的持續時間取決於下列參數:

    • 必須清除的記錄數目
    • 在叢集中的資料範圍記錄分佈
    • 叢集中的節點數目
    • 針對清除作業所具備的備用容量
    • 其他數個因素

    階段 2 的持續時間從幾秒鐘到數小時不等。

  3. 階段 3:(實刪除) 針對可能具有「有害」資料的所有儲存體成品執行,並將其從儲存體中刪除。 這個階段會在上一個階段完成後的至少五天完成,但是不超過初始命令之後的 30 天。 這些時間表設定為遵循資料隱私權需求。

發出 .purge 命令會觸發此程序,需要數天的時間完成。 如果套用述詞的記錄密度夠大,此程序將會有效地重新擷取資料表中的所有資料。 這項重新擷取對效能和 COGS (已售出貨物成本) 有顯著的影響。

清除限制與注意事項

  • 清除程序是最後手段且無法復原。 您無法復原此程序或復原已清除的資料。 undo table drop 之類的命令無法復原清除的資料。 將資料復原至先前的版本無法回到最新清除命令之前。

  • 執行清除之前,請執行查詢來確認述詞,並檢查結果是否符合預期的結果。 您也可以使用兩個步驟的程序,這會傳回要清除的預期記錄數目。

  • .purge 命令會針對資料管理端點執行:https://ingest-[YourClusterName].[region].kusto.windows.net。 命令需要相關資料庫的資料庫系統管理員權限。

  • 由於清除程序的效能影響,並且要保證遵循清除指導方針,因此呼叫者必須修改資料結構描述,讓最少量的資料表包含相關資料,並且將每個資料表的命令進行批次處理,以減少清除程序的顯著 COGS 影響。

  • .purge 命令的 predicate 參數是用來指定要清除哪些記錄。 Predicate 大小限制為 1 MB。 當您建構 predicate 時:

    • 使用 'in' 運算子,例如,where [ColumnName] in ('Id1', 'Id2', .. , 'Id1000')
    • 請注意 'in' 運算子 的限制 (清單可能包含多達 1,000,000 個值)。
    • 如果查詢大小很大,請使用 externaldata 運算子,例如 where UserId in (externaldata(UserId:string) ["https://...blob.core.windows.net/path/to/file?..."])。 檔案會儲存要清除的識別碼清單。
    • 展開所有 externaldata Blob 之後,查詢大小總計 (所有 Blob 的大小總計) 不能超過 64 MB。

清除效能

在任何指定的時間,都只能在叢集上執行一個清除要求。 其他所有要求都會以 Scheduled 狀態排入佇列。 監視清除要求佇列大小,並保留足夠的限制,以符合適用於您資料的需求。

若要減少清除執行時間:

觸發清除程序

注意

清除執行的叫用方式是在資料管理端點 https://ingest-[YourClusterName].[Region].kusto.windows.net 上執行 purge table TableName records 命令。

清除資料表 TableName 記錄命令

針對不同的使用案例,可以使用兩種方式來叫用清除命令:

  • 程式設計叫用:單一步驟,由應用程式叫用。 直接呼叫此命令會觸發清除執行順序。

    語法

    // Connect to the Data Management service
    #connect "https://ingest-[YourClusterName].[region].kusto.windows.net"
    
    // To purge table records
    .purge table [TableName] records in database [DatabaseName] with (noregrets='true') <| [Predicate]
    
    // To purge materialized view records
    .purge materialized-view [MaterializedViewName] records in database [DatabaseName] with (noregrets='true') <| [Predicate]
    
  • 人為叫用:兩個步驟的程序,需要在個別步驟明確確認。 命令的第一個叫用會傳回驗證權杖,應該提供此權杖以執行實際清除。 此順序可降低不慎刪除不正確資料的風險。

注意

雙步驟調用中的第一個步驟需要在整個數據集上執行查詢,以識別要清除的記錄。 此查詢可能會在大型資料表上逾時或失敗,特別是有大量的冷快取資料時。 如果發生失敗,請自行驗證述詞,並在確認正確性之後,使用單一步驟清除搭配 noregrets 選項。

語法

注意

若要使用 Azure Data Explorer Web UI 連線到叢集,請參閱新增叢集

   // Connect to the Data Management service - this command only works in Kusto.Explorer
   #connect "https://ingest-[YourClusterName].[region].kusto.windows.net"

   // Step #1 - retrieve a verification token (no records will be purged until step #2 is executed)
   .purge table [TableName] records in database [DatabaseName] <| [Predicate]

   // Step #2 - input the verification token to execute purge
   .purge table [TableName] records in database [DatabaseName] with (verificationtoken=h'<verification token from step #1>') <| [Predicate]

若要清除具體化檢視,請將 table 關鍵字取代為 materialized-view,並且將 TableName 取代為 MaterializedViewName

參數 描述
DatabaseName 資料庫名稱
TableName / MaterializedViewName 要清除的資料表/具體化檢視名稱。
Predicate 識別要清除的記錄。 請參閱清除述詞限制
noregrets 如果設定,則會觸發單一步驟啟用。
verificationtoken 在雙步驟啟用案例中 (noregrets 未設定),此權杖可用來執行第二個步驟並認可動作。 如果 verificationtoken 未指定,則會觸發命令的第一個步驟。 將會傳回有關清除的資訊,以及應傳回給命令以進行步驟 #2 的權杖。

清除述詞限制

  • 述詞必須是簡單的選項 (例如,where [ColumnName] == 'X' / where [ColumnName] in ('X', 'Y', 'Z') and [OtherColumn] == 'A')。
  • 多個篩選條件必須使用 'and' 合併,而不是使用個別的 where 子句 (例如,where [ColumnName] == 'X' and OtherColumn] == 'Y' and not where [ColumnName] == 'X' | where [OtherColumn] == 'Y')。
  • 述詞不能參考要刪除的資料表以外的資料表 (TableName)。 述詞只能包含選取範圍陳述式 (where)。 無法從資料表預測指定資料行 (執行 'table | Predicate' 時的輸出結構描述必須符合資料表結構描述)。
  • 不支援系統函式 (例如 ingestion_time()extent_id())。

範例:雙步驟清除

若要在雙步驟啟用案例中開始清除,請執行命令的步驟 #1:

   // Connect to the Data Management service
   #connect "https://ingest-[YourClusterName].[region].kusto.windows.net"

   .purge table MyTable records in database MyDatabase <| where CustomerId in ('X', 'Y')

   .purge materialized-view MyView records in database MyDatabase <| where CustomerId in ('X', 'Y')

輸出

NumRecordsToPurge EstimatedPurgeExecutionTime fb:VerificationToken
1,596 00:00:02 e43c7184ed22f4f23c7a9d7b124d196be2e570096987e5baadf65057fa65736b

然後,在執行步驟 #2 之前驗證 NumRecordsToPurge。

若要在雙步驟啟用案例中完成清除,請使用步驟 #1 所傳回的驗證權杖來執行步驟 #2:

.purge table MyTable records in database MyDatabase
 with(verificationtoken=h'e43c7....')
<| where CustomerId in ('X', 'Y')

.purge materialized-view MyView records in database MyDatabase
 with(verificationtoken=h'e43c7....')
<| where CustomerId in ('X', 'Y')

輸出

OperationId DatabaseName TableName ScheduledTime Duration LastUpdatedOn EngineOperationId State StateDetails EngineStartTime EngineDuration Retries ClientRequestId Principal
c9651d74-3b80-4183-90bb-bbe9e42eadc4 MyDatabase MyTable 2019-01-20 11:41:05.4391686 00:00:00.1406211 2019-01-20 11:41:05.4391686 已排程 0 KE.RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 AAD app id=...

範例:單一步驟清除

若要在單一步驟啟用案例中觸發清除,請執行下列命令:

// Connect to the Data Management service
 #connect "https://ingest-[YourClusterName].[region].kusto.windows.net"

.purge table MyTable records in database MyDatabase with (noregrets='true') <| where CustomerId in ('X', 'Y')

.purge materialized-view MyView records in database MyDatabase with (noregrets='true') <| where CustomerId in ('X', 'Y')

輸出

OperationId DatabaseName TableName ScheduledTime Duration LastUpdatedOn EngineOperationId State StateDetails EngineStartTime EngineDuration Retries ClientRequestId Principal
c9651d74-3b80-4183-90bb-bbe9e42eadc4 MyDatabase MyTable 2019-01-20 11:41:05.4391686 00:00:00.1406211 2019-01-20 11:41:05.4391686 已排程 0 KE.RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 AAD app id=...

取消清除作業命令

如有需要,您可以取消暫止的清除要求。

注意

這項作業適用於錯誤修復案例。 不保證會成功,而且不應該是正常操作流程的一部分。 它只能套用至仍在佇列中且尚未分派執行的要求。

語法

 // Cancel of a single purge operation
 .cancel purge <OperationId>

  // Cancel of all pending purge requests in a database
 .cancel all purges in database <DatabaseName>

 // Cancel of all pending purge requests, for all databases
 .cancel all purges

範例:取消單一清除作業

 .cancel purge aa894210-1c60-4657-9d21-adb2887993e1

輸出

此命令的輸出與 'show purges OperationId' 命令輸出相同,顯示取消的清除作業更新狀態。 如果嘗試成功,作業狀態會更新為 Canceled。 否則,作業狀態不會變更。

OperationId DatabaseName TableName ScheduledTime Duration LastUpdatedOn EngineOperationId State StateDetails EngineStartTime EngineDuration Retries ClientRequestId Principal
c9651d74-3b80-4183-90bb-bbe9e42eadc4 MyDatabase MyTable 2019-01-20 11:41:05.4391686 00:00:00.1406211 2019-01-20 11:41:05.4391686 已取消 0 KE.RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 AAD app id=...

範例:取消資料庫中的所有暫止清除作業

 .cancel all purges in database MyDatabase

輸出

此命令的輸出與 show purges 命令輸出相同,顯示資料庫中的所有作業及其更新狀態。 已成功取消的作業會將其狀態更新為 Canceled。 否則,作業狀態不會變更。

OperationId DatabaseName TableName ScheduledTime Duration LastUpdatedOn EngineOperationId State StateDetails EngineStartTime EngineDuration Retries ClientRequestId Principal
5a34169e-8730-49f5-9694-7fde3a7a0139 MyDatabase MyTable 2021-03-03 05:07:29.7050198 00:00:00.2971331 2021-03-03 05:07:30.0021529 已取消 0 KE.RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 AAD app id=...
2fa7c04c-6364-4ce1-a5e5-1ab921f518f5 MyDatabase MyTable 2021-03-03 05:05:03.5035478 00:00:00.1406211 2021-03-03 05:05:03.6441689 InProgress 0 KE.RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 AAD app id=...

追蹤清除作業狀態

注意

您可以使用 show purges 命令來追蹤清除作業,針對資料管理端點 https://ingest-[YourClusterName].[region].kusto.windows.net 執行。

狀態為「已完成」表示清除作業的第一個階段已成功完成,也就是記錄已經虛刪除,而且無法再進行查詢。 客戶不需要追蹤和驗證第二個階段 (實刪除) 完成。 此階段會由 Azure 資料總管在內部進行監視。

顯示清除命令

Show purges 命令會藉由指定要求時間期間內的作業識別碼,顯示清除作業狀態。

.show purges <OperationId>
.show purges [in database <DatabaseName>]
.show purges from '<StartDate>' [in database <DatabaseName>]
.show purges from '<StartDate>' to '<EndDate>' [in database <DatabaseName>]
屬性 描述 強制/選用
OperationId 執行單一階段或第二個階段之後,輸出的資料管理作業識別碼。 強制性
StartDate 篩選作業的時間下限。 如果省略,則預設為目前時間之前的 24 小時。 選用
EndDate 篩選作業的時間上限。 如果省略,預設值為目前的時間。 選用
DatabaseName 用來篩選結果的資料庫名稱。 選用

注意

只有在用戶端具有資料庫 管理員 許可權的資料庫上,才會提供狀態。

範例

.show purges
.show purges c9651d74-3b80-4183-90bb-bbe9e42eadc4
.show purges from '2018-01-30 12:00'
.show purges from '2018-01-30 12:00' to '2018-02-25 12:00'
.show purges from '2018-01-30 12:00' to '2018-02-25 12:00' in database MyDatabase

輸出

OperationId DatabaseName TableName ScheduledTime Duration LastUpdatedOn EngineOperationId State StateDetails EngineStartTime EngineDuration Retries ClientRequestId Principal
c9651d74-3b80-4183-90bb-bbe9e42eadc4 MyDatabase MyTable 2019-01-20 11:41:05.4391686 00:00:33.6782130 2019-01-20 11:42:34.6169153 a0825d4d-6b0f-47f3-a499-54ac5681ab78 已完成 清除已順利完成 (儲存體成品暫止刪除) 2019-01-20 11:41:34.6486506 00:00:04.4687310 0 KE.RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 AAD app id=...
  • OperationId - 執行清除時傳回的 DM 作業識別碼。
  • DatabaseName** - 資料庫名稱 (區分大小寫)。
  • TableName - 資料表名稱 (區分大小寫)。
  • ScheduledTime - 對 DM 服務執行清除命令的時間。
  • Duration - 清除作業的持續時間總計,包括執行 DM 查詢等候時間。
  • EngineOperationId - 在引擎中所執行實際清除的作業識別碼。
  • State - 清除狀態,可以是下列其中一個值:
    • Scheduled - 清除作業已排程執行。 如果作業維持已排程,可能是清除作業的待處理項目。 若要清除此待處理項目,請參閱清除效能。 如果在發生暫時性錯誤時清除作業失敗,則會由 DM 重試並且再次設為「已排程」(您可能會看到作業從「已排程」轉換成「進行中」再回到「已排程」)。
    • InProgress - 清除作業在引擎中為進行中。
    • Completed - 清除已成功完成。
    • BadInput - 清除因為錯誤的輸入而失敗,而且不會重試。 此錯誤可能是因為各種問題所造成,例如述詞中的語法錯誤、清除命令的述詞不合法、超過限制的查詢 (例如,在 externaldata 運算子中超過 1 百萬個實體,或展開的查詢大小總計超過 64 MB),以及 externaldata Blob 的 404 或 403 錯誤。
    • Failed - 清除失敗,而且不會重試。 由於其他清除作業的待處理項目或超過重試限制的失敗次數,如果作業在佇列中等候太久 (超過 14 天),就可能會發生此錯誤。 後者將會引發內部監視警示,並會由 Azure 資料總管小組進行調查。
  • StateDetails - 狀態的說明。
  • EngineStartTime - 命令發出給引擎的時間。 如果這個時間與 ScheduledTime 之間有很大的差異,通常有大量的清除作業待辦專案,而且叢集不會跟上步調。
  • EngineDuration - 引擎中實際清除執行的時間。 如果多次嘗試清除,就是所有執行持續時間的總和。
  • Retries - 因為暫時性錯誤而由 DM 服務重試的作業次數。
  • ClientRequestId - DM 清除要求的用戶端活動識別碼。
  • Principal - 清除命令簽發者的身分識別。

清除整個資料表

清除資料表包括卸除資料表,並將其標示為已清除,讓清除程序中所述的實刪除程序在其上執行。 卸除資料表而不加以清除,並不會刪除其所有的儲存體成品。 系統會根據最初在資料表上設定的硬式保留原則來刪除這些成品。 purge table allrecords 命令既快速又有效率,如果適用於您的案例,是更為理想的清除記錄程序。

注意

命令的叫用方式是在資料管理端點 https://ingest-[YourClusterName].[region].kusto.windows.net 上執行 purge table TableName allrecords 命令。

清除資料表 TableName allrecords 命令

類似於 '.purge table records ' 命令,此命令可以在程式設計 (單一步驟) 或手動 (雙步驟) 模式中叫用。

  1. 程式設計叫用 (單一步驟):

    語法

    // Connect to the Data Management service
    #connect "https://ingest-[YourClusterName].[Region].kusto.windows.net"
    
    .purge table [TableName] in database [DatabaseName] allrecords with (noregrets='true')
    
  2. 人為叫用 (雙步驟):

    語法

    
    // Connect to the Data Management service
    #connect "https://ingest-[YourClusterName].[Region].kusto.windows.net"
    
    // Step #1 - retrieve a verification token (the table will not be purged until step #2 is executed)
    
    .purge table [TableName] in database [DatabaseName] allrecords
    
    // Step #2 - input the verification token to execute purge
    .purge table [TableName] in database [DatabaseName] allrecords with (verificationtoken=h'<verification token from step #1>')
    
    參數 描述
    DatabaseName 資料庫的名稱。
    TableName 資料表的名稱。
    noregrets 如果設定,則會觸發單一步驟啟用。
    verificationtoken 在雙步驟啟用案例中 (noregrets 未設定),此權杖可用來執行第二個步驟並認可動作。 如果 verificationtoken 未指定,則會觸發命令的第一個步驟。 在此步驟中,會傳回權杖以傳回到命令,並執行步驟 #2。

範例:雙步驟清除

  1. 若要在雙步驟啟用案例中開始清除,請執行命令的步驟 #1:

    // Connect to the Data Management service
     #connect "https://ingest-[YourClusterName].[Region].kusto.windows.net"
    
    .purge table MyTable in database MyDatabase allrecords
    

    輸出

    VerificationToken
    e43c7184ed22f4f23c7a9d7b124d196be2e570096987e5baadf65057fa65736b
  2. 若要在雙步驟啟用案例中完成清除,請使用步驟 #1 所傳回的驗證權杖來執行步驟 #2:

    .purge table MyTable in database MyDatabase allrecords
    with (verificationtoken=h'eyJT.....')
    

    輸出與 '.show tables' 命令輸出相同 (傳回而不清除資料表)。

    輸出

    TableName DatabaseName 資料夾 DocString
    OtherTable MyDatabase --- ---

範例:單一步驟清除

若要在單一步驟啟用案例中觸發清除,請執行下列命令:

// Connect to the Data Management service
#connect "https://ingest-[YourClusterName].[Region].kusto.windows.net"

.purge table MyTable in database MyDatabase allrecords with (noregrets='true')

輸出與 '.show tables' 命令輸出相同 (傳回而不清除資料表)。

輸出

TableName DatabaseName 資料夾 DocString
OtherTable MyDatabase --- ---