2010-07-22 6 views
16

Ho il seguente problema e devo sapere se esiste un modo per risolverlo.Ripristino dei database PostgreSQL da file fisici non elaborati

Ho un cliente che è stato abbastanza economico da rifiutare l'acquisto di un piano di backup per i suoi database PostgreSQL sul sistema principale che gestisce la sua azienda e come pensavo sarebbe accaduto un giorno, alcuni file OS si sono bloccati durante un blackout e il sistema operativo ha bisogno di essere reinstallato.

Questo client non ha avuto alcun backup dei database ma sono riuscito a salvare la directory principale di PostgreSQL. Ho letto che i database sono memorizzati in qualche modo all'interno della directory dei dati della cartella principale di Postgres.

La mia domanda è: c'è un modo per recuperare i database solo dalla cartella dati? Sto lavorando in un ambiente Windows (XP Service Pack 2) con PostgreSQL 8.2 e ho bisogno di reinstallare PostgreSQL in un nuovo server. Avrei bisogno di ricreare i database nel nuovo ambiente e in qualche modo collegare i vecchi file alle nuove istanze del database. So che è possibile in SQL Server a causa del modo in cui il motore memorizza i database ma non ho idea di postgres.

Qualche idea? Sarebbero molto apprezzati.

risposta

14

Se si dispone dell'intera cartella di dati, si dispone di tutto ciò che è necessario (purché l'architettura sia la stessa). Prova a ripristinarlo su un altro computer prima di cancellarlo, nel caso in cui non hai copiato qualcosa.

Basta salvare la directory dei dati su disco. Quando si avvia Postgres, impostare il parametro indicando dove si trova la directory dei dati (vedere: wiki.postgresql.org). O rimuovere la directory dei dati originali della nuova installazione e posizionare la copia al suo posto.

+0

wow, sembra molto facile, provatelo domani e vi farò sapere il risultato. Grazie per la risposta rapida;) – Alvos

+0

L'ho provato e dovrebbe funzionare, ma penso che la cartella dei dati sia danneggiata perché non ha funzionato. Dovrebbe comunque quando la cartella dei dati è ok. Ho avuto i file delle transazioni come backup e mi ci vorrà più tempo per recuperare i dati storici, ma penso che sarò in grado di recuperare tutto. Ci vorrà solo più tempo di quanto speravo. Grazie per l'aiuto. Ho provato la tua soluzione in un ambiente di test e funziona. – Alvos

+0

Grazie :). Ha funzionato bene. Devi solo ricordare che le password per gli account sono quelle della vecchia installazione e non della nuova. – Nordes

5

Ciò è possibile, è sufficiente copiare la cartella "dati" (all'interno della cartella di installazione di Postgres) dal vecchio computer a quello nuovo, ma ci sono alcune cose da tenere a mente.

Prima di copiare i file, è necessario interrompere il servizio server Postgres. Quindi, Pannello di controllo-> Strumenti di amministrazione-> Servizi, trova il servizio Postgres e fermalo. Quando hai finito di copiare i file e impostare le autorizzazioni, ricominciare.

In secondo luogo, è necessario impostare le autorizzazioni per i file di dati. Poiché il server Postgres viene effettivamente eseguito su un altro account utente, non sarà in grado di accedere ai file se semplicemente li copi nella cartella dei dati, perché non avrà le autorizzazioni per farlo. Quindi è necessario cambiare la proprietà dei file all'utente "postgres". Ho dovuto usare subinacl per questo, installarlo prima, e poi usarlo da prompt dei comandi come questo (in primo luogo scorrere alla cartella in cui è stata installata):

subinacl /subdirectories "C:\Program Files\PostgreSQL\8.2\data\*" /setowner=postgres 

(Modifica proprietà dovrebbe anche essere possibile fare dalla explorer: per prima cosa devi disabilitare "Usa semplice condivisione file" nelle opzioni Cartella, quindi una scheda "Sicurezza" apparirà nella finestra di dialogo Proprietà della cartella, e ci sono delle opzioni per impostare le autorizzazioni e modificare la proprietà, ma non ero in grado di farlo in questo modo.)

Ora, se il servizio server non può essere avviato dopo averlo riavviato manualmente, di solito è possibile vedere il motivo nel Visualizzatore eventi (Strumenti di amministrazione-> Visualizzatore eventi). Postgres genererà un evento di errore e ispezionarlo ti darà un indizio su quale sia il problema (a volte si lamenterà di un file postmaster.pid, basta rimuoverlo, ecc.).

+0

Funziona davvero, ho avuto solo un problema con il file pg_hba.conf, ma commentare la linea IPv6 ha fatto il trucco, grazie e scusa per il mio pessimo inglese. – pabloferraz

0

lo faccio, ma la parte più difficile è stato quello di modificare l'autorizzazione proprietario:

  1. andare ai servizi da strumenti di amministrare dei
  2. trovare un servizio Postgres e fare doppio clic su di esso
  3. al registro sul cambiamento scheda al sistema locale
  4. quindi riavviare
0

La questione è molto vecchio, ma voglio condividere un metodo efficace t cappello ho trovato.

Se non si dispone di un backup con "pg_dump" ei dati precedenti sono in una cartella, provare i seguenti passaggi. Nel database Postgres, aggiungere record alla tabella "pg_database". Con un programma manager o "insert into". Effettuare il controllo necessario e modificare la seguente domanda di inserimento ed eseguirla.

La query restituirà un OID dopo che ha funzionato. Crea una cartella con il nome di questo numero. Dopo aver copiato i vecchi dati in questa cartella, l'utilizzo è ora pronto.



    /* 
    ------------------------------------------ 
    *** Recover From Folder *** 
    ------------------------------------------ 
    Check this table on your own system. 
    Change the differences below. 
    */ 
    INSERT INTO 
     pg_catalog.pg_catalog(
     datname, datdba, encoding, datcollate, datctype, datistemplate, datallowconn, 
     datconnlimit, datlastsysoid, datfrozenxid, datminmxid, dattablespace, datacl) 
    VALUES(
          -- Write Your collation 
     'NewDBname', 10, 6, 'Turkish_Turkey.1254', 'Turkish_Turkey.1254', 
     False, True, -1, 12400, '536', '1', 1663, Null); 

    /* 
    Create a folder in the Data directory under the name below New OID. 
    All old backup files in the directory "data\base\Old OID" are the directory with the new OID number 
    Copy. The database is now ready for use. 
    */ 
    select oid from pg_database a where a.datname = 'NewDBname'; 

+0

ok, eccetto il nome corretto della tabella: pg_catalog.pg_database – alijunior