Temos um cluster de replicação do PostgreSQL 13 onde um dos standbys está configurado com recovery_min_apply_delay
="x hr", o que pode ser útil em caso de corrupção de dados.
Para um cenário em que uma exclusão acidental aconteceu no servidor mestre , mas ainda não foi aplicada ao servidor em espera . Neste caso, estou tentando extrair os dados do servidor em espera removendo o atraso de repetição do WAL e adicionando recovery_target_time
um ponto antes da exclusão acontecer.
Até este ponto, tive sucesso, mas depois que terminei de puxar os dados do servidor standby para o master (estou pensando em postgres_fdw), preciso retomar a replicação. Mas quando executo pg_wal_replay_resume()
, ele está criando uma nova linha do tempo e não está mais no cluster de replicação.
Existe alguma maneira de reproduzir o WAL além de usar recovery_target_time
?
Dando um exemplo do que estou tentando alcançar,
Digamos que recovery_min_apply_delay=2hr , uma exclusão acidental aconteceu às 03:50 AM, neste momento transações confirmadas em standby são transações que aconteceram em ou antes de 01:50 AM. Se eu esperar mais 2hr e às 05:49 AM se eu conseguir pausar a repetição do WAL em standby, poderei ver um instantâneo dos dados que estão "logo antes" de DELETE. Então usarei postgres_fdw para extrair dados do standby.
Como eu consigo "logo antes" de uma forma precisa e sistemática? Também seria capaz de retomar o replay do WAL.
Não, isso não é possível, e seria uma péssima ideia mesmo. Se você permanecer na mesma linha do tempo, o PostgreSQL não conseguiria distinguir o WAL dos dois “universos paralelos”: aquele em que você descartou a tabela e aquele em que não o fez. Isso poderia levar a uma corrupção de dados interessante.
Mas você não precisa disso.
Se acontecer um acidente, basta colocar
recovery_target_time
em standby e deixarrecovery_target_action
empause
. Quando o replay pausar, extraia os dados que você precisa do servidor standby. Então removarecovery_target_time
novamente, recarregue e retome a recuperação. Não há necessidade de promover o standby!