Przywracanie PITR PostgreSQL

9

Mam serwer PostgreSQL 9.1 działający na 32-bitowym systemie operacyjnym CentOS 5.8 i włączyłem archiwizację WAL. Na tym serwerze są trzy bazy danych: baza danych A, baza danych B i baza danych C. Ktoś usuwa tabelę o 12 po południu w bazie danych B i chcę przywrócić bazę danych B tuż przed momentem usunięcia tabeli. Czas jest teraz 3 po południu.

Jak mogę przywrócić bazę danychB do 12 po południu bez utraty danych z trzech godzin w pozostałych dwóch bazach danych?

postgresql.conf

wal_level = archive             
archive_mode = on               
archive_command = 'test ! -f /opt/pgsql/logs/%f && cp %p /opt/pgsql/logs/%f'
max_wal_senders = 100

recovery.conf

restore_command = 'cp /opt/pgsql/logs/%f %p'
recovery_target_time = '2012-06-29 11:59:59 CEST'

Kopię zapasową bazy uruchomiłem o 9 rano

pg_basebackup -h 127.0.0.1 -D /opt/pgsql/backup

Usługa PostgreSQL została zamknięta o godzinie 15.00.

Craig Efrein
źródło

Odpowiedzi:

6

Zrobiłbym momentalne odzyskiwanie do innej lokalizacji, przywracając do pożądanego czasu i pg_dump bazę danych problemów. Upuściłbym jedną bazę danych w normalnej lokalizacji, utworzyłbym ją ponownie i załadował dane wyjściowe pg_dump.

Upewnij się, że wykonałeś i zapisałeś kopię drzewa katalogów klastra na poziomie systemu plików, zanim zaczniesz coś takiego.

kgrittn
źródło
Dziękuję +1 za odpowiedź. Czy możesz dodać kroki niezbędne do odzyskania w innej lokalizacji, a następnie przywrócić za pomocą pg_restore? Po twojej odpowiedzi myślę o użyciu rzeczywistej podstawowej lokalizacji kopii zapasowej do wykonania PITR.
Craig Efrein
0

Aby rozwinąć odpowiedź kgrittn, możesz także wykonać jedną pg_dumpz tabeli, która została usunięta i odbudować ją w istniejącej bazie danych B, aby nie trzeba było tracić 6 godzin danych w innych tabelach.

Aryeh Leib Taurog
źródło
dziękuję za odpowiedź, ale wszystkie różne ograniczenia i relacje między tabelami uniemożliwiłyby mi przywrócenie tylko jednego.
Craig Efrein