pg_resetwal

pg_resetwal — redefine o registro de escrita antecipada (WAL) e outras informações de controle de uma instância do PostgreSQL

Sinopse

pg_resetwal [ -f | --force ] [ -n | --dry-run ] [opção...] [ -D | --pgdata ] diretório_de_dados

Descrição

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.

Opções

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
--version

Mostra as informações de versão, e termina.

-?
--help

Mostra 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,xid

Define 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_epoch

Define 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=walfile

Define 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.

Nota

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,mxid

Define 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=oid

Define 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=mxoff

Define 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=xid

Define 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=xid

Define 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_WAL

Define 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.

Nota

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.

Variáveis de ambiente

PG_COLOR

Especifica se devem ser usadas cores nas mensagens de diagnóstico. Os valores possíveis são always, auto e never.

Notas

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.

Veja também

pg_controldata