Temos um fórum onde user_auth_token_logs tem 61 milhões de linhas (e crescendo).
Existem apenas 25 mil user_auth_tokens.
Das 61 milhões de linhas, 54 milhões de linhas referem-se a um user_auth_token que não existe mais (ou seja, um problema de integridade do banco de dados). E das 61 milhões de linhas, cerca de 58 milhões são mais antigas que 2 meses (ou seja, aparentemente inúteis?)
Perguntas:
Poderíamos simplesmente limpar isso sem arriscar mais problemas de integridade?
Seria uma ideia ter um job para limpar isso automaticamente?
db=# select count(*) from user_auth_tokens;
count
-------
25648
db=# select count(*) from user_auth_token_logs;
count
----------
61415352
db=# select count(*) from user_auth_token_logs where user_auth_token_id not in (select id from user_auth_tokens);
count
----------
54558442
db=# select count(*) from user_auth_token_logs where created_at < '2024-07-13';
count
----------
58565943
Sim, os user_auth_token_logs existem apenas para fins de depuração. Todas as linhas podem ser esvaziadas, a única consequência será que você não terá nenhum log para depurar.
Ah sim, boa observação. Parece que as linhas 214 a 217 também precisam ser corrigidas.
Eu estaria confortável com uma limpeza global após um certo período de tempo. @osama (já que você é o autor do commit vinculado acima), você acha que podemos limpar todos esses logs após algum tempo (e se sim, depois de quanto tempo)? Parece que precisamos manter alguns deles para detectar logins suspeitos.
Por que precisa de correção? Essa parte do código é sobre a limpeza de UserAuthTokens rotacionados, não sobre os registros de log?
Atualização: após habilitar SiteSetting.verbose_auth_token_logging, acionar o job semanal e executar VACUUM FULL user_auth_token_logs, a tabela passou de 16GB para 687MB
Sim, acho que podemos limpar a maioria dos logs, mas alguns deles precisam permanecer. Especificamente, acho que quaisquer registros que tenham suspicious, generate ou rotate como ação precisarão ser mantidos, pois são usados para detectar e gerar relatórios de logins suspeitos.
Estou vendo neste fórum que este bug nunca foi corrigido
O relatório de logins suspeitos parece se aplicar apenas a membros da equipe, há alguma razão para que esses logs precisem ser mantidos para não administradores?
Para que o relatório funcione, ele precisa de dados desde o início do histórico da conta? O log pode ser reduzido para algo como os últimos 6 meses?
No momento, não há nenhuma limpeza, o que é uma preocupação de privacidade.
Eu também não entendo a discussão acima.
O bug é muito simples: se o modo não for verboso, nenhuma limpeza de UserAuthTokenLog é realizada, nunca. O if deve ser removido.
A implementação original apenas registrava quando SiteSetting.verbose_auth_token_logging era verdadeiro. O que ainda tinha o problema de que, após desativá-lo, os logs restantes mais recentes permaneceriam, mas isso é uma coisa pequena.
Mas esta alteração tornou o registro incondicional (“Os logs de tokens de autenticação generate, rotate e suspicious agora são sempre registrados, independentemente da configuração verbose_auth_token_logging”).
Resumo; Essa alteração esqueceu de tornar a remoção incondicional também.
Com certeza, resolveremos isso nas próximas semanas. Se houver urgência, sinta-se à vontade para enviar um PR (que esteja testado e confirme que isso funciona como esperado).
De fato, esse PR agora foi mesclado graças ao @Osama. Ele aborda a maioria dos tipos de user_auth_token_logs, mas não todos, e em breve forneceremos uma correção para as entradas de generate. (Veja a discussão no link do PR acima para mais contexto).
Manterei este tópico aberto enquanto abordamos o acompanhamento.