pg_resetwal — redefine o registro de escrita antecipada (WAL) e outras informações de controle de uma instância do PostgreSQL
pg_resetwal [ -f | --force ] [ -n | --dry-run ] [opção...] [ -D | --pgdata ] diretório_de_dados
O utilitário pg_resetwal limpa o registro de
escrita antecipada (WAL)
e, opcionalmente, redefine algumas outras informações de controle
armazenadas no arquivo pg_control.
Este utilitário é às vezes necessário, se estes arquivos estiverem
corrompidos.
Deve ser usado apenas como último recurso, quando o servidor não
iniciar devido a este corrompimento.
Algumas opções, como --wal-segsize (veja abaixo),
também podem ser usadas para modificar certas configurações globais
de um agrupamento de bancos de dados
(cluster) sem a necessidade de executar
novamente o utilitário initdb.
Isto pode ser feito com segurança em um agrupamento de bancos de dados
estável, desde que nenhum dos modos perigosos mencionados abaixo seja
utilizado.
Se o utilitário pg_resetwal for usado em um
diretório de dados onde o servidor foi parado corretamente e o
arquivo de controle está íntegro, ele não terá efeito sobre o
conteúdo do sistema de banco de dados, exceto pela remoção dos
arquivos de WAL que não são mais usados.
Qualquer outro uso é potencialmente perigoso e deve ser feito com
extrema cautela.
O utilitário pg_resetwal irá requerer que se
especifique a opção -f (forçar) antes de trabalhar
em um diretório de dados em um estado de parada incorreta ou com
um arquivo de controle corrompido.
Após executar este comando em um diretório de dados com o
WAL corrompido, ou um arquivo de controle
corrompido, deverá ser possível iniciar o servidor, mas lembre-se
de que o banco de dados pode conter dados inconsistentes devido
a transações parcialmente efetivadas.
Deve-se fazer imediatamente uma exportação
(dump) dos, executar o comando
initdb e restaurar o banco de dados.
Após a restauração, deve-se verificar se há inconsistências e
corrigir conforme necessário.
Se o utilitário pg_resetwal informar que não pode
determinar dados válidos para o arquivo pg_control,
pode-se forçá-lo a prosseguir de qualquer maneira especificando a
opção -f (forçar).
Neste caso, os dados ausentes serão substituídos por valores plausíveis.
Espera-se que a maioria dos campos corresponda, mas pode ser
necessária assistência manual para o próximo OID, o próximo
ID de transação e época (carimbo de data e hora), o
próximo ID de multi-transação e deslocamento, e campos de localização
inicial do WAL.
Estes campos podem ser definidos usando as opções discutidas abaixo.
Se não for possível determinar os valores corretos para todos estes
campos, a opção -f ainda pode ser usada, mas o
banco de dados recuperado deve ser tratado como ainda mais suspeito
do que o normal: fazer imediatamente uma cópia de segurança e
recuperar é imperativo.
Não deve ser executada nenhuma operação de
modificação de dados no banco de dados antes de fazer a cópia de
segurança, porque esta ação provavelmente irá piorar o corrompimento.
Este utilitário só pode ser executado pelo usuário que instalou o servidor, porque requer acesso de leitura/gravação ao diretório de dados.
diretório_de_dados-D diretório_de_dados--pgdata=diretório_de_dados
Especifica a localização do diretório do banco de dados.
Por motivos de segurança, é necessário especificar o diretório
de dados na linha de comando.
O utilitário pg_resetwal não utiliza a
variável de ambiente PGDATA.
-f--force
Força o utilitário pg_resetwal a prosseguir
mesmo em situações que possam ser perigosas, conforme explicado
acima.
Especificamente, esta opção é necessária para prosseguir se o
servidor não tiver sido parado corretamente, ou se o utilitário
pg_resetwal não puder determinar dados válidos
para o arquivo pg_control.
-n--dry-run
A opção -n/--dry-run instrui o
utilitário pg_resetwal a mostrar os valores
reconstruídos do arquivo pg_control, e os
valores prestes a serem alterados e, em seguida, terminar sem
modificar nada.
É principalmente uma ferramenta de depuração, mas pode ser útil
como verificação de sanidade antes de permitir que o
utilitário pg_resetwal prossiga de verdade.
-V--versionMostra as informações de versão, e termina.
-?--helpMostra a ajuda, e termina.
As opções a seguir são necessárias apenas quando o utilitário
pg_resetwal for incapaz de determinar os valores
apropriados lendo o arquivo pg_control.
Podem ser determinados valores seguros conforme descrito abaixo.
Para valores que usam argumentos numéricos, podem ser especificados
valores hexadecimais usando o prefixo 0x.
Note que estas instruções se aplicam somente ao tamanho de bloco
padrão de 8 kB.
-c xid,xid--commit-timestamp-ids=xid,xidDefine manualmente os IDs de transação mais antigos e mais recentes para os quais a época (carimbo de data e hora) da efetivação pode ser recuperado.
Um valor seguro para o ID de transação mais antigo para o qual a
época da efetivação pode ser recuperada (primeira parte),
pode ser determinado procurando pelo arquivo com o nome
numericamente menor no diretório pg_commit_ts
sob o diretório de dados.
Por outro lado, um valor seguro para o ID de transação mais recente
para o qual a época da efetivação pode ser recuperada
(segunda parte), pode ser determinado procurando pelo arquivo
com o nome numericamente maior no mesmo diretório.
Os nomes dos arquivos estão em hexadecimal.
-e xid_epoch--epoch=xid_epochDefine manualmente a época (carimbo de data e hora) do próximo ID da transação.
A época do ID da transação não é realmente armazenada em nenhum
lugar no banco de dados, exceto no campo definido pelo utilitário
pg_resetwal, portanto, qualquer valor funcionará
no que diz respeito ao próprio banco de dados.
Pode ser necessário ajustar este valor para garantir que sistemas
de replicação como Slony-I e
Skytools funcionem corretamente —
em caso afirmativo, deve ser obtido um valor apropriado do estado
do banco de dados replicado.
-l walfile--next-wal-file=walfileDefine manualmente o local inicial do WAL especificando o nome do próximo arquivo de segmento do WAL.
O nome do próximo arquivo de segmento do WAL
deve ser maior do que qualquer nome de arquivo de segmento do
WAL existente no momento no diretório
pg_wal sob o diretório de dados.
Estes nomes também estão em hexadecimal e possuem três partes.
A primeira parte é o “ID da linha do tempo”,
e geralmente deve ser mantido o mesmo.
Por exemplo, se 00000001000000320000004A
for a maior entrada no pg_wal, deve ser usado
-l 00000001000000320000004B, ou maior.
Note que ao usar tamanhos de segmento do WAL não padrão, os números nos nomes dos arquivos do WAL serão diferentes dos LSNs relatados pelas funções e visões do sistema. Esta opção recebe um nome de arquivo do WAL, e não um LSN.
O utilitário pg_resetwal examina os arquivos
em pg_wal e escolhe uma configuração padrão
-l, além do último nome de arquivo existente.
Portanto, o ajuste manual da opção -l só deverá
ser necessário caso se saiba de arquivos de segmento do
WAL que não estão presentes no momento em
pg_wal, como entradas em um arquivo
fora de linha (off-line); ou se o
conteúdo de pg_wal foi inteiramente perdido.
-m mxid,mxid--multixact-ids=mxid,mxidDefine manualmente o próximo ID de multi-transação, e o mais antigo.
Um valor seguro para o próximo ID de multi-transação (primeira parte)
pode ser determinado procurando pelo arquivo com o nome numericamente
maior no diretório pg_multixact/offsets
sob o diretório de dados, adicionando um, e então multiplicando
por 65536 ( 0x10000).
Por outro lado, um valor seguro para o ID de multi-transação mais
antigo (segunda parte da opção -m) pode ser
determinado procurando pelo arquivo com o nome numericamente menor
no mesmo diretório, e multiplicando por 65536.
Os nomes dos arquivos estão em hexadecimal, portanto, a maneira
mais fácil de se fazer isto é especificando o valor da opção em
hexadecimal e acrescentando quatro zeros.
-o oid--next-oid=oidDefine manualmente o próximo OID.
Não há uma maneira comparativamente fácil de determinar o próximo OID que esteja além do maior no banco de dados, mas, felizmente, não é crítico acertar a definição do próximo OID.
-O mxoff--multixact-offset=mxoffDefine manualmente o próximo deslocamento de multi-transação.
Pode ser determinado um valor seguro procurando pelo arquivo com o
nome numericamente maior no diretório
pg_multixact/members sob o diretório de dados,
adicionando um, e então multiplicando por 52352 (0xCC80).
Os nomes dos arquivos estão em hexadecimal.
Não existe uma receita simples de adição de zeros, como as de
outras opções.
-u xid--oldest-transaction-id=xidDefine manualmente o ID de transação descongelado mais antigo.
Pode ser determinado um valor seguro procurando pelo arquivo com o
nome numericamente menor no diretório pg_xact
sob o diretório de dados, e então multiplicando por 1048576 (0x100000).
Note que os nomes dos arquivos estão em hexadecimal.
Geralmente é mais fácil especificar o valor dessa opção em
hexadecimal também.
Por exemplo, se a menor entrada em pg_xact
for 0007, então -u 0x700000
irá funcionar
(cinco zeros à direita fornecem um multiplicador adequado).
-x xid--next-transaction-id=xidDefine manualmente o próximo ID de transação.
Pode ser determinado um valor seguro procurando pelo arquivo com
o nome numericamente maior no diretório pg_xact
sob o diretório de dados, adicionando um, e então multiplicando
por 1048576 (0x100000).
Note que os nomes dos arquivos estão em hexadecimal.
Geralmente é mais fácil especificar o valor dessa opção em
hexadecimal também.
Por exemplo, se a maior entrada em pg_xact
for 0011, -x 0x1200000
irá funcionar
(cinco zeros à direita fornecem um multiplicador adequado).
--char-signedness=opção
Define manualmente o especificador padrão para novas instâncias.
Os valores possíveis são signed e
unsigned
Para um agrupamento de bancos de dados que foi atualizado usando
o utilitário pg_upgrade a partir de uma versão
do PostgreSQL anterior à 18,
o valor seguro seria o valor padrão da especificação do tipo de
dados char da plataforma que executava a instância
antes dessa atualização.
Para todos os outros agrupamentos de bancos de dados,
signed seria o valor seguro.
Entretanto, esta opção destina-se exclusivamente ao uso com o
utilitário pg_upgrade, e normalmente não deve
ser usada manualmente.
--wal-segsize=tamanho_do_segmento_do_WALDefine o novo tamanho do segmento do WAL, em megabytes. O valor deve ser definido como uma potência de 2, entre 1 e 1024 (megabytes). Veja a mesma opção em initdb para obter mais informações.
Esta opção também pode ser usada para alterar o tamanho do
segmento do WAL de um agrupamento de bancos
de dados existente, evitando a necessidade de executar novamente
o utilitário initdb.
Embora o utilitário pg_resetwal defina o
endereço inicial do WAL além do último arquivo
de segmento do WAL existente, algumas
alterações no tamanho do segmento podem fazer com que nomes de
arquivo do WAL anteriores sejam reutilizados.
Recomenda-se usar a opção -l junto com esta
opção para definir manualmente o endereço inicial do
WAL, se a sobreposição do nome do arquivo do
WAL causar problemas com a estratégia de
arquivamento em uso.
PG_COLOR
Especifica se devem ser usadas cores nas mensagens de diagnóstico.
Os valores possíveis são always,
auto e never.
Este utilitário não deve ser usado quando o servidor estiver em execução.
O utilitário pg_resetwal se recusará a iniciar
se encontrar um arquivo de bloqueio do servidor no diretório de dados.
Se o servidor travar, pode ter sido deixado para trás um arquivo de
bloqueio; neste caso, deve ser removido o arquivo de bloqueio para
permitir a execução do utilitário pg_resetwal.
Mas antes de fazer isto, deve-se ter certeza de que não há nenhum
processo servidor ativo.
O utilitário pg_resetwal só funciona com
servidores da mesma versão principal.