Reindexação de uma tabela quando o autovacuum está em execução
Se um índice se tornar corrompido, o autovacuum continuará processando a tabela e falhará. Se você tentar um vacuum manual nessa situação, receberá uma mensagem de erro semelhante à mostrada a seguir.
postgres=>
vacuum freeze pgbench_branches;
ERROR: index "pgbench_branches_test_index" contains unexpected zero page at block 30521 HINT: Please REINDEX it.
Quando o índice está corrompido e o autovacuum está tentando ser executado na tabela, você lutará com uma sessão de autovacuum já em execução. Ao emitir um comando REINDEX
Para reindexar uma tabela quando o autovacuum está em execução nela
-
Abra duas sessões no banco de dados que contém a tabela em que você deseja realizar vacuum. Para a segunda sessão, use "screen" ou outro utilitário que mantenha a sessão se a conexão for encerrada.
-
Na sessão um, obtenha o PID da sessão de autovacuum em execução na tabela.
Execute a seguinte consulta para obter o PID da sessão de autovacuum.
SELECT datname, usename, pid, current_timestamp - xact_start AS xact_runtime, query FROM pg_stat_activity WHERE upper(query) like '%VACUUM%' ORDER BY xact_start;
-
Na segunda sessão, emita o comando reindex.
\timing on
Timing is on.
reindex index pgbench_branches_test_index;
REINDEX Time: 9.966 ms
-
Na sessão um, se o autovacuum estava bloqueando o processo, você verá em
pg_stat_activity
que a espera é "T" para a sua sessão de vacuum. Nesse caso, você encerra o processo de autovacuum.SELECT pg_terminate_backend('the_pid');
Nesse ponto, sua sessão começa. É importante observar que o autovacuum é reiniciado imediatamente, pois essa tabela é provavelmente a mais alta em sua lista de trabalho.
-
Inicie seu comando na sessão dois e depois termine o processo de autovacuum na sessão um.