Limpeza de dados
Observação
Este artigo mostra as etapas de como excluir dados pessoais do dispositivo ou serviço e pode ser usado para dar suporte às suas obrigações de acordo com o GDPR. Para obter informações gerais sobre o GDPR, confira a seção GDPR da Central de Confiabilidade da Microsoft e a seção GDPR do Portal de Confiança do Serviço.
Como uma plataforma de dados, o Azure Data Explorer dá suporte à capacidade de excluir registros individuais usando o Kusto .purge
e comandos relacionados. Você também pode limpar uma tabela inteira ou limpar registros em uma exibição materializada.
Aviso
A exclusão de dados por meio do .purge
comando foi projetada para ser usada para proteger dados pessoais e não deve ser usada em outros cenários. Ele não foi projetado para dar suporte a solicitações de exclusão frequentes ou à exclusão de grandes quantidades de dados e pode ter um impacto significativo no desempenho no serviço.
Diretrizes do comando Purge
Crie cuidadosamente seu esquema de dados e investigue políticas relevantes antes de armazenar dados pessoais no Azure Data Explorer.
- Em um cenário melhor, o período de retenção nesses dados é suficientemente curto e os dados são excluídos automaticamente.
- Se o uso do período de retenção não for possível, isole todos os dados sujeitos a regras de privacidade em algumas tabelas Data Explorer do Azure. O ideal é usar apenas uma tabela e vincular a ela de todas as outras tabelas. Esse isolamento permite executar o processo de limpeza de dados em algumas tabelas que contêm dados confidenciais e evitar todas as outras tabelas.
- O chamador deve fazer todas as tentativas de executar em lote a execução de
.purge
comandos para 1 a 2 comandos por tabela por dia. Não emita vários comandos com predicados exclusivos de identidade do usuário. Em vez disso, envie um único comando cujo predicado inclui todas as identidades de usuário que exigem limpeza.
Processo de limpeza
O processo de limpeza seletiva de dados do Azure Data Explorer ocorre nas seguintes etapas:
Fase 1: forneça uma entrada com um nome de tabela Data Explorer do Azure e um predicado por registro, indicando quais registros excluir. O Kusto examina a tabela que procura identificar as extensões de dados que participariam da limpeza de dados. As extensões identificadas são aquelas que têm um ou mais registros para os quais o predicado retorna true.
Fase 2: (Exclusão Reversível) Substitua cada extensão de dados na tabela (identificada na etapa (1)) por uma versão redimensiva. A versão mais reingestada não deve ter os registros para os quais o predicado retorna true. Se novos dados não estiverem sendo ingeridos na tabela, até o final dessa fase, as consultas não retornarão mais dados para os quais o predicado retornará true. A duração da fase de exclusão reversível de limpeza depende dos seguintes parâmetros:
- O número de registros que devem ser limpos
- Registrar distribuição entre as extensões de dados no cluster
- O número de nós no cluster
- A capacidade sobressalente que ele tem para operações de limpeza
- Vários outros fatores
A duração da fase 2 pode variar entre alguns segundos e muitas horas.
Fase 3: (Exclusão temporária) Trabalhe de volta todos os artefatos de armazenamento que possam ter os dados "venenosos" e exclua-os do armazenamento. Essa fase é feita pelo menos cinco dias após a conclusão da fase anterior, mas não mais do que 30 dias após o comando inicial. Essas linhas do tempo são definidas para seguir os requisitos de privacidade de dados.
Emitir um .purge
comando dispara esse processo, o que leva alguns dias para ser concluído. Se a densidade de registros para os quais o predicado se aplica for suficientemente grande, o processo reingessará efetivamente todos os dados na tabela. Essa reingesção tem um impacto significativo no desempenho e no COGS (custo das mercadorias vendidas).
Limitações e considerações de limpeza
O processo de limpeza é final e irreversível. Não é possível desfazer esse processo ou recuperar dados que foram limpos. Comandos como desfazer a queda de tabela não podem recuperar dados limpos. A reversão dos dados para uma versão anterior não pode ser acessada antes do comando de limpeza mais recente.
Antes de executar a limpeza, verifique o predicado executando uma consulta e verificando se os resultados correspondem ao resultado esperado. Você também pode usar o processo de duas etapas que retorna o número esperado de registros que serão limpos.
O
.purge
comando é executado no ponto de extremidade Gerenciamento de Dados:https://ingest-[YourClusterName].[region].kusto.windows.net
. O comando requer permissões de administrador de banco de dados nos bancos de dados relevantes.Devido ao impacto no desempenho do processo de limpeza e para garantir que as diretrizes de limpeza tenham sido seguidas , espera-se que o chamador modifique o esquema de dados para que tabelas mínimas incluam dados relevantes e comandos em lote por tabela para reduzir o impacto significativo do COGS do processo de limpeza.
O
predicate
parâmetro do comando .purge é usado para especificar quais registros limpar.Predicate
o tamanho é limitado a 1 MB. Ao construir opredicate
:- Use o operador 'in', por exemplo,
where [ColumnName] in ('Id1', 'Id2', .. , 'Id1000')
. - Observe os limites do operador 'in' (a lista pode conter até
1,000,000
valores). - Se o tamanho da consulta for grande, use
externaldata
o operador , por exemplowhere UserId in (externaldata(UserId:string) ["https://...blob.core.windows.net/path/to/file?..."])
. O arquivo armazena a lista de IDs a serem limpas. - O tamanho total da consulta, depois de expandir todos os
externaldata
blobs (tamanho total de todos os blobs), não pode exceder 64 MB.
- Use o operador 'in', por exemplo,
Limpar o desempenho
Somente uma solicitação de limpeza pode ser executada no cluster, a qualquer momento. Todas as outras solicitações são enfileiradas no Scheduled
estado.
Monitore o tamanho da fila de solicitação de limpeza e mantenha-se dentro dos limites adequados para corresponder aos requisitos aplicáveis aos seus dados.
Para reduzir o tempo de execução de limpeza:
Siga as diretrizes de limpeza para diminuir a quantidade de dados limpos.
Ajuste a política de cache , pois a limpeza demora mais em dados frios.
Escalar horizontalmente o cluster
Aumente a capacidade de limpeza do cluster, após uma consideração cuidadosa, conforme detalhado em Extensões limpar a capacidade de recompilação.
Disparar o processo de limpeza
Observação
A execução de limpeza é invocada executando o comando limpar tabela TableName records no ponto de extremidade https://ingest-Gerenciamento de Dados [YourClusterName].[ Região].kusto.windows.net.
Comando Limpar tabela TableName records
O comando Purge pode ser invocado de duas maneiras para cenários de uso diferentes:
Invocação programática: uma só etapa que se destina a ser invocada por aplicativos. Chamar esse comando dispara diretamente a sequência de execução de limpeza.
Sintaxe
// 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]
Invocação humana: um processo de duas etapas que requer uma confirmação explícita como etapa separada. A primeira invocação do comando retorna um token de verificação, que deve ser fornecido para executar a limpeza real. Essa sequência reduz o risco de excluir inadvertidamente dados incorretos.
Observação
A primeira etapa na invocação de duas etapas requer a execução de uma consulta em todo o conjunto de dados para identificar registros a serem limpos.
Essa consulta pode atingir o tempo limite ou falhar em tabelas grandes, especialmente com uma quantidade significativa de dados de cache frio. Em caso de falhas, valide o predicado por conta própria e, depois de verificar a correção, use a limpeza de etapa única com a opção noregrets
.
Sintaxe
Observação
Para se conectar a um cluster usando a interface do usuário da Web Data Explorer do Azure, consulte Adicionar clusters.
// 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]
Para limpar uma exibição materializada, substitua o table
palavra-chave por materialized-view
e substitua TableName pelo MaterializedViewName.
Parâmetros | Descrição |
---|---|
DatabaseName |
Nome do banco de dados |
TableName / MaterializedViewName |
Nome da tabela/exibição materializada a ser limpa. |
Predicate |
Identifica os registros a serem limpos. Confira Limpar limitações de predicado. |
noregrets |
Se definido, dispara uma ativação de etapa única. |
verificationtoken |
No cenário de ativação em duas etapas (noregrets não está definido), esse token pode ser usado para executar a segunda etapa e confirmar a ação. Se verificationtoken não for especificado, ele disparará a primeira etapa do comando. As informações sobre a limpeza serão retornadas com um token que deve ser passado de volta para o comando para executar a etapa nº 2. |
Limitações de predicado de limpeza
- O predicado deve ser uma seleção simples (por exemplo, em que [ColumnName] == 'X' / , em que [ColumnName] em ('X', 'Y', 'Z') e [OtherColumn] == 'A').
- Vários filtros devem ser combinados com um 'e', em vez de cláusulas separadas
where
(por exemplo,where [ColumnName] == 'X' and OtherColumn] == 'Y'
e nãowhere [ColumnName] == 'X' | where [OtherColumn] == 'Y'
). - O predicado não pode referenciar tabelas diferentes da tabela que está sendo limpa (TableName). O predicado só pode incluir a instrução de seleção (
where
). Ele não pode projetar colunas específicas da tabela (esquema de saída ao executar 'table
| Predicado' deve corresponder ao esquema da tabela). - Não há suporte para funções do sistema (como,
ingestion_time()
,extent_id()
).
Exemplo: limpeza em duas etapas
Para iniciar a limpeza em um cenário de ativação em duas etapas, execute a etapa nº 1 do comando:
// 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')
Saída
NumRecordsToPurge | EstimatedPurgeExecutionTime | VerificationToken |
---|---|---|
1\.596 | 00:00:02 | e43c7184ed22f4f23c7a9d7b124d196be2e570096987e5baadf65057fa65736b |
Em seguida, valide o NumRecordsToPurge antes de executar a etapa 2.
Para concluir uma limpeza em um cenário de ativação em duas etapas, use o token de verificação retornado da etapa 1 para executar a etapa 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')
Saída
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 | Agendado | 0 | KE. RunCommand; 1d0ad28b-f791-4f5a-a60f-0e32318367b7 | ID do aplicativo AAD=... |
Exemplo: limpeza em etapa única
Para disparar uma limpeza em um cenário de ativação de etapa única, execute o seguinte comando:
// 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')
Saída
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 | Agendado | 0 | KE. RunCommand; 1d0ad28b-f791-4f5a-a60f-0e32318367b7 | ID do aplicativo AAD=... |
Comando Cancelar operação de limpeza
Se necessário, você pode cancelar solicitações de limpeza pendentes.
Observação
Essa operação destina-se a cenários de recuperação de erros. Não há garantia de que ele tenha êxito e não faça parte de um fluxo operacional normal. Ele só pode ser aplicado a solicitações que ainda estão na fila e ainda não foram expedidas para execução.
Sintaxe
// 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
Exemplo: cancelar uma única operação de limpeza
.cancel purge aa894210-1c60-4657-9d21-adb2887993e1
Saída
A saída desse comando é igual à saída do comando 'show purges OperationId', mostrando o status atualizado da operação de limpeza que está sendo cancelada.
Se a tentativa for bem-sucedida, o estado da operação será atualizado para Canceled
. Caso contrário, o estado da operação não será alterado.
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 | Canceled | 0 | KE. RunCommand; 1d0ad28b-f791-4f5a-a60f-0e32318367b7 | ID do aplicativo AAD=... |
Exemplo: cancelar todas as operações de limpeza pendentes em um banco de dados
.cancel all purges in database MyDatabase
Saída
A saída desse comando é a mesma que a saída do comando show purges, mostrando todas as operações no banco de dados com seus status atualizados.
As operações que foram canceladas com êxito terão seus status atualizados para Canceled
. Caso contrário, o estado da operação não será alterado.
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 | Canceled | 0 | KE. RunCommand; 1d0ad28b-f791-4f5a-a60f-0e32318367b7 | ID do aplicativo 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 | KE. RunCommand; 1d0ad28b-f791-4f5a-a60f-0e32318367b7 | ID do aplicativo AAD=... |
Acompanhar status de operação de limpeza
Observação
As operações de limpeza podem ser rastreadas com o comando show purges, executado no ponto de extremidade https://ingest-do Gerenciamento de Dados [YourClusterName].[ region].kusto.windows.net.
Status = 'Completed' indica a conclusão bem-sucedida da primeira fase da operação de limpeza, ou seja, os registros são excluídos temporariamente e não estão mais disponíveis para consulta. Não é esperado que os clientes acompanhem e verifiquem a conclusão da segunda fase (exclusão rígida). Essa fase é monitorada internamente pelo Data Explorer do Azure.
Comando Mostrar limpezas
Show purges
O comando mostra a operação de limpeza status especificando a ID da operação dentro do período de tempo solicitado.
.show purges <OperationId>
.show purges [in database <DatabaseName>]
.show purges from '<StartDate>' [in database <DatabaseName>]
.show purges from '<StartDate>' to '<EndDate>' [in database <DatabaseName>]
Propriedades | Descrição | Obrigatório/opcional |
---|---|---|
OperationId |
A ID da operação Gerenciamento de Dados gerada após a execução de uma única fase ou segunda fase. | Obrigatório |
StartDate |
Limite de tempo menor para operações de filtragem. Se omitido, o padrão será 24 horas antes da hora atual. | Opcional |
EndDate |
Limite de tempo superior para operações de filtragem. Se omitido, o padrão será a hora atual. | Opcional |
DatabaseName |
Nome do banco de dados para filtrar resultados. | Opcional |
Observação
O status será fornecido somente em bancos de dados para os quais o cliente tem permissões de banco de dados Administração.
Exemplos
.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
Saída
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 | Concluído | Limpeza concluída com êxito (artefatos de armazenamento pendentes de exclusão) | 2019-01-20 11:41:34.6486506 | 00:00:04.4687310 | 0 | KE. RunCommand; 1d0ad28b-f791-4f5a-a60f-0e32318367b7 | ID do aplicativo AAD=... |
OperationId
– a ID da operação de DM retornada ao executar a limpeza.DatabaseName
** – nome do banco de dados (diferencia maiúsculas de minúsculas).TableName
- nome da tabela (diferencia maiúsculas de minúsculas).ScheduledTime
– tempo de execução do comando de limpeza para o serviço DM.Duration
– duração total da operação de limpeza, incluindo o tempo de espera da fila de DM de execução.EngineOperationId
– a ID da operação da limpeza real em execução no mecanismo.State
– estado de limpeza, pode ser um dos seguintes valores:Scheduled
– a operação de limpeza está agendada para execução. Se o trabalho permanecer Agendado, provavelmente haverá uma lista de pendências de operações de limpeza. Confira Limpar o desempenho para limpar essa lista de pendências. Se uma operação de limpeza falhar em um erro transitório, ela será repetida pelo DM e definida como Agendada novamente (para que você possa ver uma transição de operação de Agendado para InProgress e voltar para Agendado).InProgress
– a operação de limpeza está em andamento no mecanismo.Completed
– limpeza concluída com êxito.BadInput
- A limpeza falhou na entrada incorreta e não será repetida. Essa falha pode ser devido a vários problemas, como um erro de sintaxe no predicado, um predicado ilegal para comandos de limpeza, uma consulta que excede os limites (por exemplo, mais de 1M de entidades em umexternaldata
operador ou mais de 64 MB do tamanho total da consulta expandida) e 404 ou 403 erros paraexternaldata
blobs.Failed
- A limpeza falhou e não será repetida. Essa falha poderá ocorrer se a operação estiver aguardando na fila por muito tempo (mais de 14 dias), devido a uma lista de pendências de outras operações de limpeza ou a uma série de falhas que excedem o limite de repetição. Este último gerará um alerta de monitoramento interno e será investigado pela equipe de Data Explorer do Azure.
StateDetails
- uma descrição do Estado.EngineStartTime
- a hora em que o comando foi emitido para o mecanismo. Se houver uma grande diferença entre esse horário e ScheduledTime, geralmente há uma lista de pendências significativa de operações de limpeza e o cluster não está acompanhando o ritmo.EngineDuration
- tempo de execução de limpeza real no mecanismo. Se a limpeza foi repetida várias vezes, é a soma de todas as durações de execução.Retries
- número de vezes que a operação foi repetida pelo serviço DM devido a um erro transitório.ClientRequestId
– ID de atividade do cliente da solicitação de limpeza de DM.Principal
– identidade do emissor do comando de limpeza.
Limpar uma tabela inteira
A limpeza de uma tabela inclui remover a tabela e marcá-la como limpa para que o processo de exclusão rígida descrito em Processo de limpeza seja executado nela.
Remover uma tabela sem purgá-la não exclui todos os artefatos de armazenamento. Esses artefatos são excluídos de acordo com a política de retenção rígida inicialmente definida na tabela.
O purge table allrecords
comando é rápido e eficiente e é preferível ao processo de limpeza de registros, se aplicável ao seu cenário.
Observação
O comando é invocado executando o comando allrecords TableName da tabela de limpeza no ponto de extremidade https://ingest-Gerenciamento de Dados [YourClusterName].[ region].kusto.windows.net.
Limpar tabela TableName comando allrecords
Semelhante ao comando '.purge table records ', esse comando pode ser invocado em uma programática (etapa única) ou em um modo manual (duas etapas).
Invocação programática (etapa única):
Sintaxe
// Connect to the Data Management service #connect "https://ingest-[YourClusterName].[Region].kusto.windows.net" .purge table [TableName] in database [DatabaseName] allrecords with (noregrets='true')
Invocação humana (duas etapas):
Sintaxe
// 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>')
Parâmetros Descrição DatabaseName
Nome do banco de dados. TableName
Nome da tabela. noregrets
Se definido, dispara uma ativação de etapa única. verificationtoken
No cenário de ativação em duas etapas ( noregrets
não está definido), esse token pode ser usado para executar a segunda etapa e confirmar a ação. Severificationtoken
não for especificado, ele disparará a primeira etapa do comando. Nesta etapa, um token é retornado para passar de volta para o comando e executar a etapa nº 2.
Exemplo: limpeza em duas etapas
Para iniciar a limpeza em um cenário de ativação em duas etapas, execute a etapa nº 1 do comando:
// Connect to the Data Management service #connect "https://ingest-[YourClusterName].[Region].kusto.windows.net" .purge table MyTable in database MyDatabase allrecords
Saída
VerificationToken
e43c7184ed22f4f23c7a9d7b124d196be2e570096987e5baadf65057fa65736b Para concluir uma limpeza em um cenário de ativação em duas etapas, use o token de verificação retornado da etapa nº 1 para executar a etapa nº 2:
.purge table MyTable in database MyDatabase allrecords with (verificationtoken=h'eyJT.....')
A saída é igual à saída do comando '.show tables' (retornada sem a tabela limpa).
Saída
TableName DatabaseName Pasta DocString OtherTable MyDatabase --- ---
Exemplo: limpeza de etapa única
Para disparar uma limpeza em um cenário de ativação de etapa única, execute o seguinte comando:
// Connect to the Data Management service
#connect "https://ingest-[YourClusterName].[Region].kusto.windows.net"
.purge table MyTable in database MyDatabase allrecords with (noregrets='true')
A saída é igual à saída do comando '.show tables' (retornada sem a tabela limpa).
Saída
TableName | DatabaseName | Pasta | DocString |
---|---|---|---|
OtherTable | MyDatabase | --- | --- |
Conteúdo relacionado
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de