2014-05-22 7:33 GMT-03:00 Stanley Mendes Fonseca <[email protected]>
:
> Então minha dúvida é...
> Há possibilidade de recuperar esse registro "expirado"?
>
É possível sim, se e somente se, o VACUUM ainda não foi executado na tabela
após a exclusão/atualização desse registro. Caso você tenha feito um
UPDATE/DELETE incorretamente e não tem backup PITR, a dica é:
1. O mais rápido possível, desabilite o autovacuum para essa tabela:
ALTER TABLE tabela SET (autovacuum = off);
2. Instale a extensão pg_dirtyread (veja [1] e [2]). Ela consegue fazer uma
varredura completa da tabela e retorna todas as tuplas, mesmo aquelas
expiradas. Eu recomendo colocar o resultado numa tabela temporária, para
facilitar o trabalho:
CREATE TEMP TABLE tabela_suja AS
SELECT * FROM pg_dirtyread('tabela'::regclass) AS t(col1 tipo1, ...);
3. Agora, seu trabalho é identificar a tupla que você "estragou" (pra não
dizer outra coisa, =P ) e fazer INSERT ou UPDATE na tabela original de
forma correta.
4. Muito importante!!! Depois de tudo correto, habilite novamente o
autovacuum:
ALTER TABLE tabela RESET (autovacuum);
Veja que não é uma tarefa comum e muitas vezes nem possível (e.g. se o
autovacuum rodou na tabela, já era).
Uma dica aos navegantes, a versão 9.4 trará a possibilidade de um slave
"atrasado" [3] (agradeço ao Fabrízio que contribui com essa
funcionalidade), assim se seu ambiente é bagunçado ao ponto desse tipo de
situação ser comum, você pode configurar um slave para guardar informações
um pouco mais antigas. :)
[1] https://github.com/omniti-labs/pgtreats/tree/master/contrib/pg_dirtyread
[2] http://www.depesz.com/2012/04/04/lets-talk-dirty/
[3]
http://www.postgresql.org/docs/9.4/static/standby-settings.html#RECOVERY-MIN-APPLY-DELAY
Atenciosamente,
--
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral