metrics
é uma tabela não registrada que tem cerca de 3 milhões de linhas, acabei de executar o ALTER TABLE metrics SET LOGGED
para manter esses dados registrados. Mas parece estar bloqueado por algum processo de autovacuum em execução.
pid | usename | blocked_by | blocked_query
-------+----------+------------+------------------------------------------
13462 | postgres | {32090} | ALTER TABLE sensors.metrics SET LOGGED;
duration | query | pid
-----------------+------------------------------------------------------------------------+-------
02:03:08.131365 | autovacuum: VACUUM pg_toast.pg_toast_315873283 (to prevent wraparound) | 32090
Minhas configurações de autovacuum para uma RAM de 32 núcleos e 98gigs:
autovacuum_max_workers
------------------------
12
autovacuum_vacuum_cost_limit
------------------------------
-1
autovacuum_vacuum_cost_delay
------------------------------
20ms
vacuum_cost_page_hit
----------------------
1
vacuum_cost_page_miss
-----------------------
10
vacuum_cost_page_dirty
------------------------
20
Posso fazer algo para evitar o bloqueio ou corrigir esse bloqueio sem encerrar o processo de alteração da tabela que está logando os dados?
Você pode encerrar o autovacuum (32090). Você não deve ter o hábito de fazer isso, mas nesta situação deve estar tudo bem.
Você pode querer executar primeiro:
E certifique-se de que o valor informado esteja bem abaixo de 2 bilhões.
Você também pode querer verificar se pg_toast_315873283 é a tabela de brinde para sensores.metrics. Não vejo por que ele bloquearia em primeiro lugar se não fosse o caso, mas não custa verificar essas suposições.
Por outro lado, você pode apenas ser paciente e deixar o autovacuum terminar. O vácuo precisa acontecer e gerará menos tráfego WAL se você fizer o vácuo enquanto ainda não estiver registrado.
Por outro lado, você pode querer iniciar um manual
VACUUM FREEZE sensors.metrics
em uma sessão e, em seguida, cancelar o ALTER TABLE e o autovac e, em seguida, fazer o ALTER TABLE assim que o vácuo terminar. Isso será feito mais rápido que o autovac (a configuração padrão para aspiradores manuais não usa a limitação de E/S) e, novamente, faz o trabalho que precisa ser feito eventualmente e provavelmente é melhor feito enquanto a tabela ainda estiver definida como UNLOGGED.