資料清除
注意
本文提供關於如何從裝置或服務刪除個人資料的步驟,並且可以用來支援遵循 GDPR 的義務。 如需 GDPR 的一般資訊,請參閱 Microsoft 信任中心的 GDPR 區段和服務信任入口網站的 GDPR 區段。
身為數據平臺,Azure Data Explorer 支援使用 Kusto .purge
和相關命令刪除個別記錄的能力。 您也可以清除整個資料表或清除具體化檢視中的記錄。
警告
透過 .purge
命令的資料刪除是設計用來保護個人資料,而且不應該用於其他案例。 其設計目的不是為了支援頻繁的刪除要求或刪除大量的資料,而且可能會對服務造成顯著的效能影響。
清除指南
在 Azure 資料總管中儲存個人資料之前,請仔細設計您的資料結構描述並調查相關的原則。
- 在最佳情況下,這項資料的保留期間夠短,而且會自動刪除資料。
- 如果無法使用保留期間使用量,請隔離少數 Azure Data Explorer 數據表中受限於隱私權規則的所有數據。 最好是僅使用一個資料表,並且從其他所有資料表連結到該資料表。 此隔離可讓您在保留敏感數據的幾個數據表上執行數據 清除程式 ,並避免所有其他數據表。
- 呼叫者應該盡量嘗試,讓每天針對每個資料表的
.purge
命令執行批次處理為 1-2 個命令。 請勿使用唯一的使用者身分識別述詞來發出多個命令。 而是傳送單一命令,其述詞包含需要清除的所有使用者身分識別。
清除程序
從 Azure 資料總管選擇性清除資料的程序包含下列步驟:
階段 1:為輸入提供 Azure 資料總管資料表名稱和個別記錄述詞,以指出要刪除的記錄。 Kusto 會掃描資料表,以找出參與資料清除的資料範圍。 識別的範圍是具有述詞會傳回 true 的一或多個記錄範圍。
階段 2:(虛刪除) 以重新擷取版本取代在資料表 (在步驟 (1) 中識別) 中的每個資料範圍。 重新擷取版本不應有述詞傳回 true 的記錄。 如果未將新數據擷取到數據表中,則在此階段結束時,查詢將不再傳回述詞傳回 true 的數據。 清除虛刪除階段的持續時間取決於下列參數:
- 必須清除的記錄數目
- 在叢集中的資料範圍記錄分佈
- 叢集中的節點數目
- 針對清除作業所具備的備用容量
- 其他數個因素
階段 2 的持續時間從幾秒鐘到數小時不等。
階段 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。
- 使用 'in' 運算子,例如,
清除效能
在任何指定的時間,都只能在叢集上執行一個清除要求。 其他所有要求都會以 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 notwhere [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 ' 命令,此命令可以在程式設計 (單一步驟) 或手動 (雙步驟) 模式中叫用。
程式設計叫用 (單一步驟):
語法
// Connect to the Data Management service #connect "https://ingest-[YourClusterName].[Region].kusto.windows.net" .purge table [TableName] in database [DatabaseName] allrecords with (noregrets='true')
人為叫用 (雙步驟):
語法
// 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:
// Connect to the Data Management service #connect "https://ingest-[YourClusterName].[Region].kusto.windows.net" .purge table MyTable in database MyDatabase allrecords
輸出
VerificationToken
e43c7184ed22f4f23c7a9d7b124d196be2e570096987e5baadf65057fa65736b 若要在雙步驟啟用案例中完成清除,請使用步驟 #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 | --- | --- |
相關內容
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應