Meu banco de dados PostgreSQL parece ter sofrido corrupção após um desligamento não limpo e agora não consigo descobrir como tirá-lo do modo de recuperação. Como o banco de dados não recebe atualizações muito frequentes, o último backup noturno válido conhecido deve ter uma cópia atual dos dados.
Corrida
sudo -u postgres pg_restore /path/to/backup.post
apenas despeja uma longa lista de comandos SQL no console, mas nada mais acontece.
Suspeitando de corrupção de dados, simplesmente movi o arquivo inteiro data_directory
(conforme referenciado em /etc/postgresql/9.6/main/postgresql.conf
) para um caminho diferente. Agora estou querendo saber como recriar uma versão “virgem” do diretório de dados onde posso restaurar o backup. Eu recriei o caminho e configurei seu dono para postgres:postgres
, mas tentar reiniciar o PostgreSQL, re-executar pg_restore
ou até mesmo dpkg_reconfigure
não funcionar – o diretório ainda está vazio.
Qual é o procedimento correto para descartar um PostgreSQL corrompido data_directory
, substituí-lo por um novo e restaurar o último backup válido conhecido?
O SO é Raspbian 9.
A execução
pg_restore
sem a-d $DATABASE
opção apenas imprimirá os comandos para restaurar o banco de dados para stdout, mas não tocará em nenhum banco de dados.1. Reconstrua o diretório de dados
O comando para reconstruir o diretório de dados é
initdb
. Comando completo:Isso é para o PostgreSQL 9.6; para qualquer outra versão, você precisará alterar o número da versão no caminho e garantir que o caminho
initdb
ainda esteja correto.$DB_PATH
é o caminho para o seu diretório de dados.Consulte a página man para opções adicionais, como definir uma localidade diferente ou especificar credenciais.
No meu caso, a inicialização do banco de dados terminou com um segfault, indicando corrupção de um binário (ou script) envolvido. Então eu tive que correr
para reinstalar os binários relacionados ao PostgreSQL do zero. (Se você não tiver certeza de quais pacotes reinstalar, execute
dpkg -l | grep postgres
e reinstale tudo listado lá.)2. Restaurar dados
-C
criará o banco de dados, se ele ainda não existir.Ao usar
-C
,postgres
pode ser substituído por qualquer banco de dados presente em seu sistema; ele é usado apenas para a conexão inicial, mas o banco de dados em si não será tocado. (Sem-C
, você precisaria inserir um banco de dados existente para o qual deseja restaurar.)-c
irá remover quaisquer objetos existentes (por exemplo, bancos de dados, tabelas etc.) antes de criá-los. Isso garante que o banco de dados resultante contenha exatamente o que estava no backup, sem sobras do banco de dados no qual você está restaurando.--if-exists
evita mensagens de erro (inofensivas, mas confusas) ao usar-c
se alguns objetos ainda não existirem no banco de dados.