Sabemos que o arquivo WAL está localizado no diretório $PGDATA/pg_xlog , mas não sei o significado do arquivo WAL, como um arquivo WAL chamado "0000000A00005283000000E0",
Vejo o blog de alguns dizer que o nome do arquivo WAL respeita um nome de formato subdividido em 3 sequências de 8 dígitos hexadecimais definindo:
Código da linha do tempo
ID do bloco
ID do segmento
Mas eu ainda não entendo isso. alguém pode explicar isso?
--consulta
francs=> select pg_current_xlog_location();
pg_current_xlog_location
--------------------------
5283/D9C2A320
(1 row)
francs=> select pg_xlogfile_name(pg_current_xlog_insert_location());
pg_xlogfile_name
--------------------------
0000000A00005283000000E0
A nomenclatura do arquivo WAL é realmente um detalhe de implementação. Veja o código-fonte - começando com a implementação de
pg_xlogfile_name
insrc/backend/access/transam/xlogfuncs.c
, que usaXLogFileName
insrc/include/access/xlog_internal.h
:A partir daí, você pode ver que nas versões atuais do PostgreSQL, o nome do arquivo é oito dígitos hexadecimais preenchidos com zero do ID da linha do tempo e, em seguida, um valor formatado de forma estranha para o segmento que funciona com os 32 bits altos de um número de segmento de 64 bits zero- preenchido para 8 dígitos hexadecimais, então o zero de 32 bits baixo preenchido para 8 dígitos hexadecimais. Esse formato é realmente uma peculiaridade histórica.
Você pode resolver isso por causa da definição de
XLogSegmentsPerXLogId
:que é
1 << 32
ou seja, 2 ^ 32, então, na verdade,XLogFileName
está apenas pegando os 32 bits altos e baixos.Dito isso, você não precisa fazer nada com o WAL com base nos nomes dos arquivos, exceto usá-los para identificar exclusivamente um arquivo WAL, então estou me perguntando por que você está perguntando isso. O que você está tentando alcançar?