it-swarm-eu.dev

Chyba PostgreSQL 9.1 Hot Backup: databázový systém se spouští

Chvíli jsem pracoval na horké záloze pro Postgres 9.1 a narazil jsem na konzistentní problém. Po restartování Postgresu na slave serveru se soubor protokolu pgstartup a denní soubor protokolu v adresáři pg_log načte bez chyb. Když se však pokusím vstoupit do databáze pomocí příkazu psql, zobrazí se chyba:

 FATAL: databázový systém se spouští. 

Soubor recovery.conf se také neobrací na recovery.done. Tuto chybu jsem důkladně prozkoumal a důsledně najímal stejnou odpověď: databáze nebyla čistě vypnuta, než jsem se pokusil restartovat Postgres. Jediným způsobem, jak jsem restartoval Postgres, je přes service postgresql-9.1 restart nebo /etc/init.d/postgresql-9.1 restart příkazy. Po obdržení této chyby zabiju všechny procesy a znovu se pokusím restartovat databázi a stále dostávat stejnou chybu. Ztrácí mě, kam se mám odtud dostat a jak tento problém vyřešit. Níže je uveden přesný proces, který jsem provedl pro dokončení horké zálohy.

Konfigurace hlavního serveru:

pg_hba.conf, přidán řádek:

 Hostitelská replikace pogresu IPAddressOfSlaveServer trust 

postgresql.conf:

 wal_level = hot_standby 
 max_wal_senders = 5 
 listen_address = '*' 
 port = 5432 
 max_wal_senders = 5 
 wal_keep_segment = 32 

Konfigurace slave serveru:

postgresql.conf:

 hot_standby = na 

recovery.conf:

 standby_mode = on 
 primární_conninfo = Host = IPAddressOfMasterServer 
 port = 5432 
 user = postgres 
 restore_command = 'cp/var/lib/pgsql/9.1/data/pg_xlog /% f "% p" '

Po konfiguraci obou serverů

Na hlavním serveru přejdu k uživateli postgres a spouštím příkazy:

 psql -c "Vyberte pg_start_backup ('label', true);"; 
 rsync -a -v -e ssh /var/lib/pgsql/9.1/data slave:/var/lib /pgsql/9.1/data\
 - vyloučit postmaster.pid 
 pgsql -c "select pg_stop_backup ();"; 

Po synchronizaci databáze s podřízeným serverem

Restartuji slave server a spuštění se nezdaří. Soubor pgstartup.log zní:

Úspěch. Nyní můžete spustit databázový server pomocí: 
 
 /Usr/pgsql-9.1/bin/postgres -D /var/lib/pgsql/9.1/data
or
 /usr/pgsql/9.1/bin/pg_ctl -D /var/lib/pgsql/9.1/data -l logfile start 

aktuální logovací soubor, postgresql-Thu.log, čte:

 Protokol: vypínání 
 Protokol: Databázový systém je ukončen 
 Protokol: databázový systém byl vypnut v procesu obnovy v 2012-4-10 
 Protokol: vstup do pohotovostního režimu režim 
 Protokol: obnovený soubor protokolu "logFileName" z archivu 
 Protokol: trvalý stav obnovy dosažen na 0/BF0000B0 
 Protokol: opakování začíná na 0/BF000020 
 Protokol : obnovený soubor protokolu "logFileName" z archivu 
 Protokol: neočekávaný pageaddr 0/85000000 v souboru protokolu 0, segment 192, offset 0 
 Protokol: neočekávaný pageaddr 0/85000000 v souboru protokolu 0, segment 192 , offset 0 
 Protokol: replikace streamování úspěšně připojena k primární 

Prozkoumal jsem nečekaný pageaddr az archivu postgresu jsem si vědom toho, že je zcela normální a jedním z očekávaných způsobů, jak detekovat konec WAL.

Jakákoli rada by byla velmi oceněna.

16
Jen

Zpráva „Databázový systém se spouští.“ neoznačuje chybu. Důvod, proč je na úrovni FATAL je tak, že se vždy dostane do protokolu, bez ohledu na nastavení log_min_messages:

http://www.postgresql.org/docs/9.1/interactive/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHEN

Po rsync jste opravdu spustili to, co ukazujete ?:

 pgsql -c "vyberte pg_stop_backup ();"; 

Protože, pokud vím, neexistuje žádný spustitelný soubor pgsql, který by ponechal zálohu nekompletní a otrok by nikdy nevyšel z režimu obnovy. Na druhou stranu, možná jste opravdu spustili psql, protože jinak nechápu, jak by otrok zaznamenal takové zprávy o úspěchu jako:

 Protokol: konzistentního stavu zotavení bylo dosaženo na 0/BF0000B0 

a:

 Protokol: replikace streamování úspěšně připojena k primární 

Zkusili jste se v tuto chvíli připojit k otrokovi? Co se stalo?

Zpráva „Úspěch. Nyní můžete začít ...“ je generována pomocí initdb, která by neměla být spouštěna jako součást nastavení otroka; takže si myslím, že by vás mohlo něco zmást. Také mě znepokojují tato zjevně protichůdná prohlášení:

Jediným způsobem, jak jsem restartoval Postgres, je pomocí služby restartu postgresql-9.1 nebo příkazů /etc/init.d/postgresql-9.1 restart. Po obdržení této chyby zabiju všechny procesy a znovu se pokusím restartovat databázi ...

Pokusili jste se zastavit službu pomocí servisního skriptu? Co se stalo? Pokud předzálohujete řádky s více informacemi, může to pomoci pochopit protokoly. Používáme:

log_line_prefix = '[%m] %p %q<%u %d %r> '

The recovery.conf skript vypadá podivně. Kopírujete z hlavního adresáře pg_xlog, aktivního adresáře pg_xlog slave nebo z archivního adresáře?

11
kgrittn

Měl jsem s tím také nějaké problémy, kromě toho, že jsem byl na 9,3, ne 9,1. Oprava se však ukázala jako celkem triviální:

Soubor postgresql.conf Byl zkopírován z pána na otroka a já jsem ho nechal na otroku nezměněný. Myslel jsem, že vše, co musíte udělat, bylo přidat soubor recovery.conf A všechno by fungovalo (dobře se to povedlo, ale nemohl jsem se přihlásit k replikovanému slave serveru, ale to se replikovalo).

Upravil jsem soubor postgresql.conf Otroka a:

  • okomentoval archive_mode=on
  • komentoval příkaz archive; a
  • komentoval hot_standby=on

To se podařilo: Podařilo se mi dostat databázi tak, aby byla serverem jen pro čtení a byla připravena přijímat dotazy pouze pro čtení.

Existuje skript s názvem pg_basebackup, Který vytvoří adresář bootstrap adresář pro slave.) Toto je datový adresář s databází v něm. Musíte upravit postgresql.conf soubor před tím, než může být použit jako otrok, jak je popsáno, něco docela jednoduchého pro post pg_basebackup skript.

8
Greg

Zajímavé je, že jsem to vyřešil opačným způsobem, jako Paul.

Přidal jsem:

hot_standby = on

nebo spíše změnil #hot_standby = off k výše uvedenému. (To bylo pomocí 9,5)

7
user41734

Dostal jsem to do protokolů:

MSK FATAL:  the database system is starting up

Chcete-li opravit nekonečný start serveru, postupujte takto: Zastavte službu (pokud existuje), zabijte proces „postgres“ (obvykle existuje). Spustit v konzoli:

pg_resetxlog.exe -D ../Data -f

Tento příkaz se objeví, protože adresář xLog obsahuje data, která nebudou zapsána před vypnutím služby. A pak se při spuštění služby snaží opravit tato data. Někdy zamrzne spuštění a nikdy nekončí .. Příkaz na začátku vyčistí tato neopravená data, která používají službu, která začíná pouze s pevnými daty. Možná budou ztraceny některé části neopravených dat, ale databázový server bude běžet normálně a bude k němu přistupovat aplikace.

1
Andrew Zolotarev