Cenário resumido:
- um laptop de desenvolvimento quebrou
- HDD antigo ainda é legível
- novo laptop tem PostgreSQL 9.4 em vez de 9.1
- ambos os laptops usam um sabor do Ubuntu Linux
Pergunta 1: Meu entendimento está correto de que, para restaurar os dados antigos, eu precisaria de um servidor com a mesma versão principal+secundária daquele que gravou o diretório de dados antigo? Como nenhum pacote 9.1 está disponível para minha distribuição, eu teria que compilar um servidor v9.1.x a partir do código-fonte, copiar os dados antigos, iniciar o servidor e executar um pg_dump normal, que poderia então ser restaurado para o novo cluster?
Pergunta 2: Havia cerca de 10 a 15 bancos de dados no laptop antigo, mas como era uma máquina de desenvolvimento, em teoria todos os dados deveriam ser substituíveis, exceto alguns experimentos locais. Estou pensando em apenas descartar os dados antigos, mas não consigo me lembrar com 100% de certeza quais eram esses bancos de dados. Existe uma maneira de extrair algumas informações básicas (como nomes de banco de dados, talvez até tamanhos ou registros de data e hora) do diretório de dados antigo sem executar um servidor 9.1?
Parece que você já descobriu a pergunta 1 para si mesmo (resposta curta: sim, use a versão 9.1.x mais recente e certifique-se de que as opções de tempo de compilação sejam as mesmas entre a versão na máquina antiga e na nova para garantir que o data, e as máquinas devem idealmente ser o mais semelhantes possível para serem compatíveis com o binário, por exemplo, x86-64, versões glibc semelhantes, etc.).
Mas sobre a questão 2:
Você pode procurar no subdiretório "base" do diretório de dados e deverá ver algo assim:
Cada um desses diretórios com um número inteiro como nome do diretório representa um banco de dados dentro do meu cluster PostgreSQL. Os números inteiros (OIDs) no nome do diretório correspondem ao
oid
que você veria em uma consulta como:se você tivesse o servidor em execução. Não conheço uma maneira trivial de determinar o nome do banco de dados desses OIDs sem ter o servidor em execução, mas pelo menos você sabe quantos bancos de dados existem e quão grandes eles devem ser. E você também deve ser capaz de descobrir o tempo de criação verificando
stat
. No meu caso, "1" era para "template1", "12292" era "template0" e o restante eram vários outros bancos de dados.Acabei de encontrar uma maneira de descobrir quais bancos de dados o
PG_DATA
diretório antigo continha. É um pouco hackista e tarde demais para mim, mas pode ser útil para outra pessoa no futuro.Informações sobre nomes de banco de dados (etc) não são armazenadas em
PG_DATA/base
, mas sim emPG_DATA/global
. Os arquivos nesse diretório são (no meu caso, pelo menos) pequenos o suficiente para serem inspecionados com editores hexadecimais ou ferramentas de linha de comando comogrep
estrings
:O nome de um dos bancos de dados internos padrão, "template1", ocorre como string de texto simples em apenas dois arquivos pequenos. Procurar outras strings nesses arquivos revela os outros nomes de banco de dados:
Removendo os bancos de dados PG padrão e os nomes dos conjuntos de caracteres, isso deixa a lista de nomes de bancos de dados que eu estava procurando originalmente: