REINDEX

Nome

REINDEX -- reconstrói índices

Sinopse

REINDEX { DATABASE | TABLE | INDEX } nome [ FORCE ]

Descrição

O comando REINDEX reconstrói um índice baseado nos dados armazenados na tabela do índice, substituindo a cópia antiga do índice. Existem dois motivos principais para utilizar o comando REINDEX:

Parâmetros

DATABASE
Reconstrói todos os índices do sistema do banco de dados especificado. Os índices das tabelas dos usuários não são processados. Também, os índices nos catálogos do sistema compartilhados são pulados, exceto no modo autônomo (veja abaixo).
TABLE
Reconstrói todos os índices da tabela especificada. Se a tabela possuir uma tabela secundária "TOAST", esta também é reindexada.
INDEX
Reconstrói o índice especificado.
nome
O nome do banco de dados, tabela ou índice a ser reindexado. Os nomes das tabelas e dos índices podem ser qualificados pelo esquema.
FORCE
Esta é uma opção obsoleta; se for especificada será ignorada.

Observações

Havendo suspeita que um índice de uma tabela do usuário está corrompido, é possível simplesmente reconstruir este índice, ou todos os índices da tabela, usando o comando REINDEX INDEX ou o comando REINDEX TABLE. Outra forma de lidar com o problema de índice corrompido em tabela do usuário é simplesmente eliminá-lo e recriá-lo. Pode ser preferida esta forma para manter alguma aparência de uma operação normal em uma tabela. O comando REINDEX obtém um bloqueio exclusivo da tabela, enquanto o comando CREATE INDEX bloqueia a escrita mas não a leitura da tabela.

A situação fica mais difícil quando é necessário recuperar um índice corrompido de uma tabela do sistema. Neste caso é importante para o sistema não ter usado nenhum dos índices suspeitos (Sem dúvida, neste tipo de cenário pode acontecer que o processo servidor caia tão logo a inicialização comece por depender de índices corrompidos). Para recuperar com segurança o servidor deve ser inicializado com a opção -P, que impede a utilização de índice para procura em catálogo do sistema.

Uma forma de fazer, é parar o postmaster e inicializar o servidor PostgreSQL autônomo com a opção -P incluída na linha de comando. Em seguida pode ser executado REINDEX DATABASE, REINDEX TABLE ou REINDEX INDEX, dependendo de quanto se deseja reconstruir. Em caso de dúvida deve ser usado REINDEX DATABASE para selecionar a reconstrução de todos os índices do sistema no banco de dados. Depois a sessão do servidor autônomo deve ser encerrada, e reiniciado o servidor normal. Veja a página de referência do postgres para obter mais informações sobre como interagir com a interface do servidor autônomo.

Como alternativa, pode ser iniciada uma sessão normal do servidor com a opção -P incluída nas opções de linha de comando. O método para se fazer isto varia entre clientes, mas em todos os clientes baseados na biblioteca libpq é possível definir a variável de ambiente PGOPTIONS com o valor -P antes de iniciar o cliente. Deve ser observado que embora este método não requeira o bloqueio dos outros clientes, ainda assim é razoável evitar que outros usuários se conectem ao banco de dados danificado até os reparos estarem completos.

Havendo suspeita que algum dos índices dos catálogos do sistema compartilhados esteja corrompido (pg_database, pg_group ou pg_shadow), então o servidor autônomo deve ser usado para fazer o reparo. O comando REINDEX não processa os catálogos compartilhados no modo multiusuário.

Para todos os índices, exceto os catálogos do sistema compartilhados, o comando REINDEX é seguro quanto à queda e transação (crash-safe e transaction-safe). O comando REINDEX não é seguro quanto à queda para os índices compartilhados, e por esse motivo não é permitido durante a operação normal. Se uma falha ocorrer durante a reindexação de um destes catálogos no modo autônomo, não será possível reiniciar o servidor normal até o problema ser resolvido (O sintoma típico de um índice compartilhado reconstruído parcialmente são erros "index is not a btree").

Antes do PostgreSQL 7.4, o comando REINDEX TABLE não processava automaticamente as tabelas TOAST e, portanto, estas tinham de ser reindexadas através de comandos separados. Isto ainda é possível, porém redundante.

Exemplos

Recriar os índices da tabela minha_tabela:

REINDEX TABLE minha_tabela;

Reconstruir um único índice:

REINDEX INDEX meu_indice;

Reconstruir todos os índices do sistema de um determinado banco de dados, sem confiar que estejam válidos:

$ export PGOPTIONS="-P"
$ psql bd_danificado
...
bd_danificado=> REINDEX DATABASE bd_danificado;
bd_danificado=> \q

Compatibilidade

Não existe o comando REINDEX no padrão SQL.

SourceForge.net Logo