Boa Tarde Pessoal,

                 Recentemente aconteceu o erro " Error: could not read
block 1 in file "base/623739/277712901": read only 0 of 8192 bytes” em
um dos nossos servidores.

                 Teoricamente, esse erro  provocou um problema
catastrófico (um sincronização de banco onde a aplicação entendeu que
deveria fazer Delete de clientes e o fez).

                 A questão é que não sei como simular esse
comportamento, para realmente ter certeza que a aplicação não esta
preparada para tratar essa resposta.

Pelo que entendi você teve uma perda de arquivo de dados ou corrupção.

                 Obs: o Servidor que aconteceu o erro recebe varias
leituras e escritas de outras maquinas... uma outra maquina “X”, vai até
esse banco, faz um select bem pesadinho (uns 30 segs para executar) e o
resultado desse select, um executável em “TCL” pega a resposta, compara
a linha do select na base que deu problema com a linha do select de sua
maquina local, dependendo do IF, faz UPDATE, INSERT OU DELETE.

                 Algum colega da lista saberia me dizer se existe a
possibilidade de simular esse comportamento (fazer algo no disco, ou sei
la o que... que no momento do select ele daria essa resposta). A ideia
seria dar um start no executável com o bloco zuado e ver se realmente é
ele que não sabe tratar esse problema de bloco e faz coisa errada.

                 Resumindo, como faço isso no bloco do disco Postgresql
(intencionalmente) para simular a aplicação rodando em cima desse disco
zuado.

Você pode simular uma falha como essa facilmente.

1) Escolha uma tabela conveniente, que será usada pelo seu SELECT. Vamos usar de exemplo uma tabela chamada "tatabela" que está no banco "babanco"

2) Ache o nome do subdiretório correspondente ao seu banco de dados:
SELECT oid FROM pg_database WHERE datname = 'babanco';

3) Ache o nome do arquivo que corresponde à tabela:
SELECT refilenode FROM pg_class WHERE relname = 'tatabela';

4) Pare o PostgreSQL.

5) Vá no diretório do cluster, subdiretório base e mais o subdiretório que corresponde ao oid do banco que você achou no item 2 acima.

6) Zere o arquivo da tabela que você acho no item 3 acima, supondo que o relfilenode encontrado seja 12001:
touch 12001

7) Inicie o PostgreSQL e faça um SELECT sobre a tabela. Provavelmente você verá o mesmo erro que encontrou antes.

Lembre-se que isto irá *destruir* o conteúdo da tabela. Tenha seu backup antes e recrie completamente o cluster após isso.

[]s
Flavio Gurgel


_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a