AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 20959
Accepted
Edward
Edward
Asked: 2012-07-14 12:58:42 +0800 CST2012-07-14 12:58:42 +0800 CST 2012-07-14 12:58:42 +0800 CST

Recuperar banco de dados PostgreSQL de erros do WAL na inicialização?

  • 772

Estou tentando configurar um servidor OpenStreetMap em uma máquina Ubuntu 12.04 usando os pacotes Ubuntu listados em switch2osm.org . Inicialmente, instalei e configurei tudo usando uma extração de mapa do nordeste dos EUA, mas agora quero instalar todo o planeta de mapas. Baixei planet-latest.osm.bz2 e executei osm2pgsql --slim -C 60000 planet-latest.osm.bz2como um usuário com permissão de gravação no banco de dados; este foi o mesmo comando que funcionou para instalar us-northeast.osm.pbf anteriormente. Voltei no dia seguinte para descobrir que esse comando parecia ter sido concluído com sucesso, mas por algum motivo o daemon de renderização não estava gerando novos blocos a partir dos novos dados. Tentei reiniciar o renderizado e, quando isso não teve efeito, tentei reiniciar o servidor PostgreSQL com sudo /etc/init.d/postgresql restart. No entanto, a inicialização do servidor falhou com os seguintes erros no log:

2012-07-13 18:54:59 UTC WARNING:  page 1525147 of relation base/16385/477861 was uninitialized
2012-07-13 18:54:59 UTC WARNING:  page 2247965 of relation base/16385/477861 was uninitialized
...500 more lines like this...
2012-07-13 18:54:59 UTC WARNING:  page 2262926 of relation base/16385/477861 was uninitialized
2012-07-13 18:54:59 UTC PANIC:  WAL contains references to invalid pages
2012-07-13 18:55:00 UTC LOG:  startup process (PID 22826) was terminated by signal 6: Aborted

(Pastebin de log inteiro aqui ).

Não há muita informação sobre esses tipos de erros na Internet, mas pelo que posso descobrir, parece significar que meus índices estão corrompidos ou meu Write-Ahead-Log está. A única maneira de corrigir índices corrompidos, no entanto, é iniciar o banco de dados no modo de usuário único e reconstruí-los, e nem posso fazer isso porque recebo os mesmos erros fatais mesmo quando começo no modo de usuário único com indexação Desativado.

Existe alguma maneira de excluir o log Write-Ahead e forçar o servidor a inicializar "do zero" ou uma correção para esse tipo de corrupção que não requer a inicialização do banco de dados com êxito?

Como alternativa, existe uma maneira de excluir o banco de dados e apenas reimportar todos os dados do planeta, visto que não consigo iniciar o servidor para executar o comando DROP DATABASE?

ATUALIZAÇÃO :

Seguindo a sugestão de Craig Ringer, examinei os logs do banco de dados antes de os erros do WAL começarem a ocorrer para ver se encontrava algum comportamento suspeito. No log imediatamente antes da primeira ocorrência de erros do WAL, encontrei estas linhas de aparência suspeita:

2012-07-13 00:20:51 UTC LOG:  received fast shutdown request
2012-07-13 00:20:51 UTC LOG:  aborting any active transactions
2012-07-13 00:20:51 UTC FATAL:  terminating connection due to administrator command
2012-07-13 00:20:51 UTC FATAL:  terminating connection due to administrator command
2012-07-13 00:20:51 UTC FATAL:  terminating connection due to administrator command
2012-07-13 00:20:51 UTC FATAL:  terminating connection due to administrator command
2012-07-13 00:20:54 UTC FATAL:  terminating connection due to administrator command
2012-07-13 00:20:54 UTC STATEMENT:  CREATE TABLE planet_osm_polygon_tmp AS SELECT * 
FROM planet_osm_polygon ORDER BY way;

2012-07-13 00:20:55 UTC FATAL:  terminating connection due to administrator command
2012-07-13 00:20:55 UTC STATEMENT:  CREATE INDEX planet_osm_ways_nodes ON planet_osm_ways 
USING gin (nodes)  WITH (FASTUPDATE=OFF);

2012-07-13 00:20:57 UTC FATAL:  terminating connection due to administrator command
2012-07-13 00:20:57 UTC STATEMENT:  CREATE TABLE planet_osm_line_tmp AS SELECT * 
FROM planet_osm_line ORDER BY way;

2012-07-13 00:21:51 UTC LOG:  received immediate shutdown request
2012-07-13 00:21:52 UTC WARNING:  terminating connection because of crash of another
server process
2012-07-13 00:21:52 UTC DETAIL:  The postmaster has commanded this server process 
to roll back the current transaction and exit, because another server process 
exited abnormally and possibly corrupted shared memory.
2012-07-13 00:21:52 UTC HINT:  In a moment you should be able to reconnect to the 
database and repeat your command.
2012-07-13 00:21:52 UTC LOG:  could not send data to client: Broken pipe
2012-07-13 00:21:58 UTC WARNING:  terminating connection because of crash of another 
server process
2012-07-13 00:21:58 UTC DETAIL:  The postmaster has commanded this server process 
to roll back the current transaction and exit, because another server process
exited abnormally and possibly corrupted shared memory.
2012-07-13 00:21:58 UTC HINT:  In a moment you should be able to reconnect to the
 database and repeat your command.
2012-07-13 00:21:58 UTC LOG:  could not send data to client: Broken pipe

(Pastebin de todo o log está aqui )

Quando diz "terminando a conexão devido ao comando do administrador", presumo que esse seja o meu comando para reiniciar o servidor de banco de dados. Mas parece que o desligamento de alguma forma falhou terrivelmente, resultando em corrupção de memória compartilhada. Isso não faz sentido, porque eu o reiniciei "limpamente", usando o /etc/init.d/postgres restartscript, não uma morte abrupta ou login manual como postgres. Estou interpretando este log incorretamente? Ou existe realmente um problema em usar /etc/init.d/postgres restartpara reiniciar um servidor PostgreSQL?

(Observe que, como minha pergunta foi movida para o administrador do banco de dados, onde sou um "novo usuário", não tenho mais a capacidade de votar em suas respostas. Isso não significa que não aprecio a ajuda).

postgresql ubuntu
  • 2 2 respostas
  • 4215 Views

2 respostas

  • Voted
  1. Best Answer
    Craig Ringer
    2012-07-14T18:04:13+08:002012-07-14T18:04:13+08:00

    ATUALIZAÇÃO : parece que este é um bug no empacotamento Debian/Ubuntu do PostgreSQL , onde o script init - extremamente inseguro - kill -9o postmaster e remove postmaster.pid. Veja esta postagem em pgsql-general .

    Ver:

    • https://bugs.launchpad.net/debian/+source/postgresql-common/+bug/1042556
    • http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=686060

    Pessoalmente, editei meus scripts de inicialização para me livrar desse código complicado e perigoso.

    A resposta original

    Por favor, volte nos logs para antes da reinicialização e veja se você pode encontrar algum erro. A corrupção do WAL absolutamente não deveria acontecer, portanto, se acontecer, é importante investigar o motivo. Se você puder fazer upload de uma cópia de todo o log para um pastebin ou algo que seja realmente útil.

    A única vez em que a corrupção do WAL é uma possibilidade aceita com o PostgreSQL é se você estiver executando com fsync=offdefinido no PostgreSQL.conf e seu sistema travar ou perder energia inesperadamente. Se não for essa a causa, seria muito bom investigar o que aconteceu.

    Por favor, não use pg_resetxlogsem saber por que seus xlogs estão danificados. Se os logs de transação forem danificados, algo está muito errado e você precisa descobrir o quê. Se você fizer um band-aid agora, poderá ser mordido por ele mais tarde, quando se preocupar com os dados.

    Os logs de transação existem por um motivo e apenas removê-los pode deixar suas tabelas e índices em um estado inconsistente e danificado. Depois pg_resetxlogdisso, é uma boa ideia pg_dumpalldescartar o cluster, reiniciar o initdb e recarregar o banco de dados. Como eu disse, porém, isso não deveria acontecer e você deve procurar nos logs por pistas sobre o que poderia ter acontecido.

    Agora leia os comentários

    • 5
  2. Daniel Vérité
    2012-07-14T15:07:33+08:002012-07-14T15:07:33+08:00

    Para limpar os arquivos WAL, consulte pg_resetxlog . O diretório de dados no Ubuntu 12 deve ser/var/lib/postgresql/9.1/main

    Observe que pg_resetxlogestá localizado em /usr/lib/postgresql/9.1/bin, não em /usr/bin, portanto não está necessariamente em $PATH. Também deve ser executado como o postgresusuário.

    Para limpar e recriar todo o cluster se você não se importa com os dados, execute:

    pg_dropcluster 9.1 main
    

    Para recriar o cluster:

    pg_createcluster 9.1 main
    
    • 4

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve