資料清除
適用於: ✅Azure 數據總管
注意
本文提供關於如何從裝置或服務刪除個人資料的步驟,並且可以用來支援遵循 GDPR 的義務。 如需 GDPR 的一般資訊,請參閱 Microsoft 信任中心的 GDPR 區段和服務信任入口網站的 GDPR 區段。
數據平台支援使用 Kusto .purge
和相關命令來刪除個別記錄的能力。 您也可以清除整個數據表,或清除具體化檢視中的記錄。
警告
透過 .purge
命令刪除數據的設計目的是用來保護個人資料,而不應該在其他案例中使用。 它的設計不是為了支持頻繁的刪除要求,或刪除大量數據,而且可能會對服務造成顯著的效能影響。
清除指南
在儲存個人資料之前,請仔細設計您的數據架構並調查相關原則。
- 在最佳案例中,此數據的保留期間足夠短,且數據會自動刪除。
- 如果無法使用保留期間使用量,請隔離少數數據表中受限於隱私權規則的所有數據。 以最佳方式,只使用一個數據表,並從所有其他數據表連結到它。 此隔離可讓您在保存敏感數據的幾個數據表上執行數據 清除程式 ,並避免所有其他數據表。
- 呼叫端應該每次嘗試將命令的執行
.purge
批處理到每個數據表的 1-2 個命令。 請勿發出具有唯一使用者身分識別述詞的多個命令。 相反地,傳送單一命令,其述詞包含需要清除的所有使用者身分識別。
清除程式
選擇性清除資料的程式會在下列步驟中發生:
階段 1:提供具有資料表名稱和每個記錄述詞的輸入,指出要刪除的記錄。 Kusto 會掃描數據表,以找出將參與數據清除的數據範圍。 所識別的範圍是具有一或多個述詞傳回 true 的記錄。
階段 2:(虛刪除)以重新擷取的版本取代數據表中的每個數據範圍(在步驟 (1)中識別。 重新擷取的版本不應該有述詞傳回 true 的記錄。 如果新的數據未內嵌到數據表中,則在此階段結束時,查詢將不再傳回述詞傳回 true 的數據。 清除虛刪除階段的持續時間取決於下列參數:
- 必須清除的記錄數目
- 記錄叢集中數據範圍的分佈
- 叢集中的節點數目
- 清除作業的備用容量
- 其他幾個因素
階段 2 的持續時間在幾秒到數小時之間可能會有所不同。
階段 3:(硬式刪除) 處理所有可能具有「有害」數據的記憶體成品,並從記憶體中刪除它們。 此階段至少會在上一個階段完成五天后完成,但在初始命令之後不超過 30 天。 這些時程表會設定為遵循數據隱私權需求。
.purge
發出命令會觸發此程式,這需要幾天的時間才能完成。 如果套用述詞的記錄密度夠大,程式會有效地重新擷取數據表中的所有數據。 這種重新擷取對效能和COGS(銷售的商品成本)產生了重大影響。
清除限制和考慮
清除程式是最終且無法復原的。 無法復原此程式或復原已清除的數據。 復原數據表卸除之類的命令無法復原已清除的數據。 將數據復原至舊版之前,無法移至最新的清除命令。
在執行清除之前,請執行查詢並檢查結果是否符合預期的結果,以確認述詞。 您也可以使用傳回預期清除記錄數目的雙步驟程式。
此命令
.purge
會針對 資料管理 端點執行:https://ingest-[YourClusterName].[region].kusto.windows.net
。 此命令需要 相關資料庫的資料庫管理員 許可權。由於清除程式效能影響,並保證 已遵循清除指導方針 ,呼叫端應該修改數據架構,讓最少數據表包含相關數據,以及每個數據表的批次命令,以減少清除程式的重大 COGS 影響。
predicate
.purge 命令的 參數是用來指定要清除的記錄。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].[ 上執行清除數據表 TableName records 命令來叫用。Region].kusto.windows.net。
清除資料表 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 數據總管 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 的令牌傳回。 |
清除述詞限制
- 述詞必須是簡單的選取範圍(例如,其中 [ColumnName] == 'X' / ,其中 [ColumnName] in ('X', 'Y', 'Z') 和 [OtherColumn] == 'A')。
- 多個篩選必須與 『and』 結合,而不是個別
where
子句(例如,where [ColumnName] == 'X' and OtherColumn] == 'Y'
而非where [ColumnName] == 'X' | where [OtherColumn] == 'Y'
)。 - 述詞無法參考要清除的數據表以外的數據表(TableName)。 述詞只能包含選取語句 (
where
)。 它無法從數據表投影特定數據行(執行'table
時輸出架構 |述詞『必須符合數據表架構。 - 系統函式(例如、
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 | VerificationToken |
---|---|---|
1,596 | 00:00:02 | e43c7184ed2f4f23c7a9d7b124d196be2e570096987e5baadf65057fa65736b |
然後,在執行步驟 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 | 科。RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 | AAD 應用程式識別碼=... |
範例:單一步驟清除
若要在單一步驟啟用案例中觸發清除,請執行下列命令:
// 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 | 科。RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 | AAD 應用程式識別碼=... |
取消清除作業命令
如有需要,您可以取消擱置的清除要求。
注意
這項作業適用於錯誤復原案例。 它不保證會成功,而且不應該是一般作業流程的一部分。 它只能套用至仍在佇列中且尚未分派執行的要求。
語法
// 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 | 科。RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 | AAD 應用程式識別碼=... |
範例:取消資料庫中所有暫止的清除作業
.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 | 科。RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 | AAD 應用程式識別碼=... | ||||
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 | 科。RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 | AAD 應用程式識別碼=... |
追蹤清除作業狀態
注意
您可以使用 show purges 命令追蹤清除作業,針對 資料管理 端點 https://ingest-[YourClusterName].[region].kusto.windows.net。
Status = 'Completed' 表示清除作業的第一個階段成功完成,也就是記錄已虛刪除,且無法再進行查詢。 客戶不會追蹤並驗證第二階段(硬刪除)完成。 此階段會在內部受到監視。
顯示清除命令
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 | 科。RunCommand;1d0ad28b-f791-4f5a-a60f-0e32318367b7 | AAD 應用程式識別碼=... |
OperationId
- 執行清除時傳回的 DM 作業識別碼。DatabaseName
** - 資料庫名稱(區分大小寫)。TableName
- 資料表名稱(區分大小寫)。ScheduledTime
- 對 DM 服務執行清除命令的時間。Duration
- 清除作業的總持續時間,包括執行 DM 佇列等候時間。EngineOperationId
- 引擎中實際執行之清除的作業標識符。State
- 清除狀態,可以是下列其中一個值:Scheduled
- 清除作業已排程執行。 如果作業維持已排程,則可能會有清除作業的待辦專案。 請參閱 清除效能 以清除此待辦專案。 如果清除作業在暫時性錯誤時失敗,DM 將會重試並再次設定為 Scheduled(因此您可能會看到作業從 Scheduled 轉換為 InProgress,然後切換回 Scheduled)。InProgress
- 清除作業在引擎中正在進行中。Completed
- 清除成功完成。BadInput
- 清除錯誤輸入時失敗,且不會重試。 此失敗的原因可能是各種問題,例如述詞中的語法錯誤、清除命令的非法述詞、超過限制的查詢(例如運算符中的externaldata
超過 100 萬個實體,或超過 64 MB 的總擴充查詢大小),以及 Blob 的 404 或 403 錯誤externaldata
。Failed
- 清除失敗,且不會重試。 如果作業在佇列中等候的時間太長(超過 14 天),可能會發生此失敗,因為其他清除作業積壓或超過重試限制的失敗數目。 後者將引發內部監視警示,並由小組調查。
StateDetails
- 狀態的描述。EngineStartTime
- 命令發出給引擎的時間。 如果此時間與 ScheduledTime 之間有很大的差異,通常會有大量的清除作業待辦專案,且叢集無法跟上步調。EngineDuration
- 引擎中實際清除執行的時間。 如果重試了數次清除,則會是所有執行持續時間的總和。Retries
- DM 服務因暫時性錯誤而重試作業的次數。ClientRequestId
- DM 清除要求的用戶端活動標識碼。Principal
- 清除命令簽發者的身分識別。
清除整個數據表
清除數據表包括卸除數據表,並將它標示為已清除,讓清除進程所 描述的硬式刪除程式 在該數據表上執行。
卸除數據表而不清除,並不會刪除其所有記憶體成品。 這些成品會根據最初在數據表上設定的硬式保留原則來刪除。
purge table allrecords
此命令快速且有效率,如果適用於您的案例,最好是清除記錄程式。
注意
在 資料管理 端點 https://ingest-[YourClusterName].[ 上執行清除數據表 TableName allrecords 命令,以叫用命令。region].kusto.windows.net。
清除數據表 TableName allrecords 命令
類似於 '.purge 數據表記錄 ' 命令,這個命令可以在程序設計式 (單一步驟) 或手動 (雙步驟) 模式中叫用。
程式設計調用 (單一步驟):
語法
// 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
e43c7184ed2f4f23c7a9d7b124d196be2e570096987e5baadf65057fa65736b 若要在雙步驟啟用案例中完成清除,請使用步驟 1 傳回的驗證令牌來執行步驟 #2:
.purge table MyTable in database MyDatabase allrecords with (verificationtoken=h'eyJT.....')
輸出與 『.show tables』 命令輸出相同(沒有清除的數據表傳回)。
輸出
TableName DatabaseName Folder 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 | Folder | DocString |
---|---|---|---|
OtherTable | MyDatabase | --- | --- |