top of page

Recompilando objetos inválidos no PostgreSQL

O PostgreSQL é um sistema gerenciador de banco de dados relacional (RDBMS) popular e de código aberto que oferece recursos avançados, incluindo transações ACID e suporte para SQL complexo. No entanto, como qualquer sistema de banco de dados, o PostgreSQL pode ocasionalmente encontrar problemas que precisam ser resolvidos pelos administradores do banco de dados.


Um desses problemas é a invalidação de objetos, que pode ocorrer quando as dependências entre os objetos do banco de dados são alteradas. Felizmente, é possível recompilar objetos inválidos no PostgreSQL com algumas etapas simples.


Neste artigo, você aprenderá como recompilar objetos inválidos no PostgreSQL.


Como recompilar objetos inválidos no PostgreSQL?


1. Antes de começar a recompilar objetos inválidos, você deve verificar quais objetos precisam ser recompilados. Para fazer isso, você pode executar a seguinte consulta:


SELECT n.nspname AS schema_name, c.relname AS object_name, c.relkind AS object_type

FROM pg_catalog.pg_class c

LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace

WHERE c.relkind IN ('r', 'v', 'm', 'f', 'p', 'I', 'S') AND n.nspname !~ '^pg_' AND n.nspname <> 'information_schema' AND (c.reloptions IS NULL OR NOT 'check_option=local' = ANY (c.reloptions)) AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_rewrite r ON r.oid = d.objid AND r.ev_class = d.refobjid WHERE d.classid = 'pg_catalog.pg_class'::regclass AND d.refclassid = 'pg_catalog.pg_class'::regclass AND d.refobjid = c.oid)

ORDER BY 1, 2;


Essa consulta retorna uma lista de todos os objetos inválidos no banco de dados, incluindo o nome do esquema, o nome do objeto e o tipo de objeto.


Depois de identificar quais objetos estão inválidos, você pode recompilá-los usando o comando REINDEX. O comando REINDEX é usado para recriar um índice ou cluster existente e também pode ser usado para recompilar objetos inválidos. Você pode executar o comando REINDEX para recompilar um objeto específico ou pode executar o comando para recompilar todos os objetos inválidos em um esquema ou em todo o banco de dados. Para recompilar um objeto específico, você pode executar o seguinte comando:


REINDEX [INDEX | TABLE] nome_do_objeto;


Substitua nome_do_objeto pelo nome do objeto inválido que você deseja recompilar.


Para recompilar todos os objetos inválidos em um esquema específico no PostgreSQL, você pode executar o comando REINDEX SCHEMA. Esse comando recompila todos os índices, funções, tabelas e outros objetos inválidos em um esquema especificado.


REINDEX SCHEMA nome_do_esquema;


Substitua nome_do_esquema pelo nome do esquema que você deseja recompilar. Ao executar este comando, o PostgreSQL examinará todos os objetos no esquema especificado e recompilará todos os objetos inválidos.


Se você quiser recompilar todos os objetos inválidos no banco de dados, você pode usar o seguinte comando:


REINDEX DATABASE nome_do_banco;


Substitua nome_do_banco pelo nome do banco de dados alvo que você deseja recompilar.


Este comando irá reindexar todos os índices e recompilar todas as funções inválidas no banco de dados especificado. Para recompilar outros tipos de objetos, você pode usar os comandos ALTER TABLE, ALTER INDEX, ALTER FUNCTION, ALTER PROCEDURE, ALTER TYPE e ALTER SEQUENCE, dependendo do tipo de objeto que você está recompilando.


É importante observar que a recompilação de objetos pode ser um processo demorado, especialmente em bancos de dados grandes. Por isso, é recomendável que você faça backup do banco de dados antes de recompilar objetos inválidos.

Além disso, é uma boa prática verificar regularmente o status dos objetos do banco de dados e resolver problemas de inválidos o mais cedo possível. Isso ajuda a manter o banco de dados funcionando sem problemas e a evitar interrupções não planejadas no acesso aos dados.


Observação: Se os objetos inválidos estiverem em um esquema que não está no search_path, você precisará especificar o esquema explicitamente ao recompilar o objeto. Além disso, se os objetos inválidos tiverem privilégios atribuídos a eles, esses privilégios precisarão ser reatribuídos após a recompilação.


Recomendamos que a verificação dos objetos inválidos sejam monitorados periodicamente.


Precisando de um apoio especializado, consulte-nos: comercial@datacosmos.com.br.


17 visualizações
bottom of page