Não há comando ou ferramenta de verificação de consistência embutida no PostgreSQL.
A visão geral é que não se deve ser necessário, pois a corrupção e a inconsistência não devem ser possíveis em uma pilha de hardware / software de qualidade. Se surgirem problemas, não há garantia de que algum tipo de verificação de consistência os encontre, apenas criaria uma falsa sensação de segurança. Não concordo com esse sentimento, mas é o que parece sair quando isso é discutido periodicamente no pgsql-hackers.
Como sempre, o problema subjacente é que ninguém precisa particularmente de uma ferramenta de verificação de consistência para atender às suas necessidades imediatas; portanto, ninguém gasta tempo escrevendo uma para coçar e não financia o desenvolvimento de uma em contrato comercial ou internamente. Voluntariado? : p
O PostgreSQL (até 9.3) não suporta somas de verificação no nível de bloco. Portanto, uma das principais coisas que você está acostumado a verificar não existia e, portanto, não pôde ser verificada. Uma ferramenta para varrer todas as relações e validar somas de verificação não existe no PostgreSQL 9.3, mas seria desejável adicionar e pode aparecer em uma versão futura. Enquanto isso, tudo o que você pode fazer é SELECT *
de cada relação individualmente - mas, devido ao fato de o PostgreSQL usar o cache do buffer do sistema operacional para leituras, não há garantia que realmente forçará a leitura do bloco de disco subjacente. Uma nova ferramenta seria necessária para fazer isso.
O PostgreSQL tende a evitar o armazenamento redundante de informações sempre que possível; portanto, geralmente não há nada a ser verificado, apenas uma única fonte autorizada. Um verificador de consistência não pode fazer muito, a menos que a mesma informação apareça ou possa ser derivada de vários locais diferentes.
Também é muito difícil fazer qualquer tipo de verificação útil simultaneamente, em um banco de dados que ainda está ocupado e ativo. A maioria das instalações não deseja bloquear todo o banco de dados, ou pelo menos várias relações importantes por vez, para executar algum tipo de verificação de consistência. Portanto, o verificador precisaria operar em um banco de dados sujeito a modificações simultâneas, tornando ainda mais difícil a gravação e capaz de detectar menos problemas de maneira confiável.
Ainda há muito que uma ferramenta validadora poderia fazer se uma fosse escrita, especialmente se fosse permitida a utilização de vários bloqueios exclusivos de relação:
Verifique se todos os espaços de tabela existem no disco.
Verifique se cada pg_class
entrada possui arquivos correspondentes relfilenode
no espaço de tabela correto.
Inspecione mapas de visibilidade, mapas de espaço livre, etc., garantindo que estejam presentes quando deveriam ser, legíveis e pareçam corresponder à relação à qual estão associados.
Relatar nós de arquivos órfãos no disco. (Isso é normal devido a DDL transacional e desassociação lenta, mas um verificador pode forçar a desassociação ansiosa e bloquear todas as relações antes de executar a verificação).
Leia todos os blocos de cada relação e procure problemas óbvios. Para relações de pilha, seriam coisas como:
- um
xmin
maior que xmax
(depois de considerar o xid wrap-around)
- Tuplas criadas por transações no futuro
- correntes QUENTES quebradas / correntes ctid quebradas
- estruturas de tupla que falham ao corresponder aos atributos da tabela
- qualquer Datum que não faça ida e volta
_in
e _out
funcione inalterado ou gere um erro
NULL
campos de bitmap definidos nos NOT NULL
atributos da tabela
CHECK
Falha na reexecução de restrições
Verifique novamente as restrições de chave estrangeira e exclusão depois de bloquear todas as tabelas envolvidas
... e provavelmente muito mais que eu não conheço o suficiente sobre a coragem de Pg para descobrir, como tentativas de detectar páginas rasgadas, validação de estrutura de árvore b, verificação de sanidade, índices GIN e GiST, verificação de sanidade pg_control
e muito mais. saber por onde começar.
Se você deseja ter essa ferramenta, a melhor coisa a fazer é aprender o suficiente para apresentar uma proposta concreta sobre como deve funcionar - e reservar um tempo para trabalhar nela ou para financiar outras pessoas para gastar seu tempo. desenvolvimento.
Pessoalmente, eu ficaria muito feliz em ter algo que pudesse verificar um cluster de banco de dados parado usando um modo de inicialização especial para o postgres
back - end, para que eu pudesse (um pouco) validar cópias físicas do banco de dados tiradas com pg_basebackup
, com pg_start_backup()
, rsync e pg_stop_backup
, com o nível do sistema de arquivos instantâneos atômicos etc.
Como alternativa, você pode fazer o que a maioria dos outros faz: Verifique se a sua pilha de hardware e software é robusta e configurada corretamente, mantenha bons backups e monitore seus logs. Não há substituto para o teste adequado de toda a pilha antes do comissionamento de um servidor - e para bons backups, físicos (streaming / PITR) e lógicos (dumps). Faça testes plug-pull em um banco de dados carregado - repetidamente - antes de entrar no ar para garantir que seu subsistema de E / S supostamente confiável seja realmente. Use várias formas de backup.