`PGError (no connection to the server ):` po restarcie bazy danych

Panowie z supportu, którzy obsługują serwer na którym stoi moja aplikacja codziennie w nocy wykonują backup bazy. Z jakiegoś powodu wymyślili sobie, że muszą na czas backupu wyłączać bazę (nie muszą, prawda?). Niestety po restarcie aplikacja nie nawiązuje ponownie połączenia i rzuca błędem 500. W logach natomiast:

[code]Started POST “/users/login” for 79.190.190.67 at 2011-08-26 08:40:45 +0200
Processing by Devise::SessionsController#create as HTML
Parameters: {“utf8”=>“✓”, “authenticity_token”=>“cJwisNE209l9CgTL5zwjwaqeyLJAfJ2x7ed/fJfx8k4=”, “user”=>{ (…) }, “commit”=>“Zaloguj”}
Redirected to http://prokliencki.eu/
Completed 302 Found in 360ms

Started GET “/” for 79.190.190.67 at 2011-08-26 08:40:45 +0200

PGError (no connection to the server):[/code]
Z tego co znalazłem, to w Railsach ~2.3 była opcja reconnect: true w database.yml. W Rails3 działa to dalej? Ustawiłem to, ale nie chcę czekać do następnego restartu żeby się przekonać :confused:

Spojrzałem w kod railsów i jest tam tylko jedna linijka, która by na to wskazywała, z tym, że w mysql adapterze:

@connection.reconnect = !!@config[:reconnect] if @connection.respond_to?(:reconnect=)

Dlatego wątpię, że zadziała. Ale sprawdź to, mogłem coś przeoczyć.

Polecam zmianę serwera, nie wiadomo w jakich jeszcze kwestiach mają jakieś wspaniałe pomysły.

Bardzo możliwe, że to tylko dla mysql (nie znalazłem żadnego przykładu z reconnect: true dla pg).

Niestety to nie mój wybór :wink: To firmowy serwer, który obsługuje zewnętrzna firma supportowa.
Ale generalnie dobrze mi się wydawało, że bez sensu restartują tą bazę? :stuck_out_tongue:

Tak, to zupełnie niepotrzebne, ja mam backupy co godzinę (+ WAL), jakbym miał zatrzymywać co godzinę aplikację, to bym już dawno zmienił bazę :wink:

Tak z ciekawości - jak masz to rozwiązane?

Podsunę im lepsze rozwiązanie, bo sami to się rok nie domyślą :confused:

Coś w tym stylu:

#!/bin/bash su - postgres -c ' pg_dumpall > /opt/postgres_backups/dumpall_`date +%s`_.sql'
zapisujesz to w jakimś backup.sh czy coś takiego i wrzucasz do crona.

A co z danymi, które pojawiłyby się w trakcie backupu? No chyba, że to działa tak szybko, że nie ma szans żeby się coś pojawiło :wink:

Na forum pg znalazłem coś takiego:

Brzmi to trochę bezpieczniej (mam na myśli dane, które pojawią się w trakcie trwania backupu), ale boję się że panowie z supportu sobie nie poradzą :smiley:

Jeśli nic się nie zmieniło, to na czas backupu tablice są lockowane, czyli wszystkie zapisy są odłożone póki backup się nie skończy. Skrypt Drogomira działa świetnie póki baza jest niewielka i czas trwania zrzutu jest liczony w sekundach :wink:

Kiedy masz dużą bazę, sporo weń zmian i nie możesz sobie pozwolić na jej blokowanie związane z wykonywaniem backupu (srsly, aplikacja ostro używana 24h na dobę?), to pewnym przemysłowym standardem jest po prostu replikacja w czasie rzeczywistym do drugiej, generalnie nieużywanej bazy (nazwijmy ją “slave” :wink: ) i robienie backupów wyłącznie z niej.

Jest jeden “myk”: aplikacja musi zadbać o spójność danych (jako że LOCK może się pojawić pomiędzy dowolnymi dwiema transakcjami). Mówiąc po ludzku oznacza to, że jeśli masz dwie-lub-więcej inwazyjne operacje (INSERT, UPDATE) które mają sens wyłącznie po wykonaniu w całym pakiecie… a zresztą, to nie jest wykład z podstaw baz danych, na pewno to już wiesz lub doczytasz :wink:

Backupom inkrementacyjnym (jak wspomniane przez Ciebie PITR) nie ufam, bo każda inkrementacja staje się zarazem single point of failure.

Tego się własnie obawiałem. Taki skrypcik wydawał się za prosty :wink:

Narazie nie. YAGNI oczywiście jest super, ale też nie lubię robić rozwiązań “na teraz”, jeżeli w niedalekiej przyszłości trzeba będzie wszystko przerabiać.

Spoko, tak gdzie są potrzebne są transakcje. Poza tym każdy save/update jest automatycznie w transakcji, tak?

@zlw: co do point in time recovery, poczytaj o logach WAL

No tak, zapomniałem napisać o tym, że mam drugi serwer, który jest replikowany :wink: W przypadku @zlw, założyłem po prostu, że skoro teraz serwer jest stopowany, to i tak lepiej mieć na chwilę locka niż restart.

@Tomash:

Używając WAL możesz wrócić się do dowolnego momentu.