Aqui está o que estou fazendo:
- Tenho um contêiner docker Postgres 16 que arquiva continuamente arquivos WAL
- Depois
00012
e00013
foram arquivados, faço um backup base do banco de dados usandopg_basebackup
o que gera um00014..backup
arquivo (esses são arquivos de exemplo e os WALs reais são mais longos, eu sei) - Agora copio o backup base e os WALs arquivados em outro contêiner docker do Postgres 16 que foi criado recentemente a partir da mesma imagem docker (incluindo a versão)
- Eu faço
postgres
do usuário o proprietário de todos esses arquivos - Eu removo os WALs do
pg_wal
diretório de backup base e atualizo o restore_commandpostgresql.conf
(além disso, também desfaço as configurações de arquivo que estavam lá no primário) - Eu removo
00012
os00013
WALs, pois eles já estão lá no backup base, então agora os WALs arquivados são apenas00014
e o arquivo .backup criado - Eu crio um
recovery.signal
arquivo, que está vazio e no diretório de dados - Então, finalmente, altero o nome do diretório atual
pgdata
epgdata_ini
do diretório de backup parapgdata
que ele atue como meu diretório de dados - Então eu paro o contêiner e começo novamente, mas a inicialização do banco de dados falha devido a
invalid checkpoint record
ecould not find required checkpoint record
Alguém pode me dizer o que estou fazendo errado aqui?
Acontece que o registro de ponto de verificação inválido ocorreu porque os identificadores do sistema de banco de dados dos dois contêineres eram diferentes, o que podemos verificar fazendo
select system_identifier from pg_control_system();
Agora, isso pode parecer óbvio, mas tem uma pequena ressalva. Quando fazemos PITR, o primeiro passo é carregar o basebackup, e depois de carregar esse backup e renomeá-lo para
pgdata
, mas antes de reiniciar, o identificador acaba sendo o mesmo da consulta acima. (Mesmo que não seja para o sistema)Então temos que fazer o seguinte para contornar isso:
pg_wal
arquivos, atualizandorestore_command
em conf, adicionandorecovery.signal
etc.)pgdata
e reiniciar o contêinerAgora, ele pegará corretamente os arquivos arquivados e recuperará dados atualizados porque os identificadores do sistema são realmente os mesmos. Ele só precisa de uma reinicialização extra com o basebackup inicial.