2014-06-25 10 views
17

Ho creato un dump del database utilizzando pg_dump in formato "personalizzato" (-Fc). Questo formato consente di richiamare pg_restore con l'opzione "jobs" (-j8). Le opzioni di lavoro iniziano 8 processi e ripristina la maggior parte delle relazioni nel mio database entro 10 minuti.Come posso impedire l'aggiornamento delle viste materializzate durante pg_restore?

Sono rimasto con 4 processi. Uno di questi è l'aggiornamento di una vista materializzata e gli altri 3 sono indici da applicare a 3 tabelle che la vista materializzata utilizza come origini dati. Gli indici sono "in attesa" in base a pg_stat_activity, presumibilmente perché lo REFRESH della vista materializzata sta ancora accedendo alle tabelle di origine.

Quando gli indici sono a posto, l'aggiornamento della visualizzazione richiede solo un paio di minuti. Poiché gli indici non sono presenti durante lo REFRESH, ho interrotto il processo REFRESH a 17 ore, il che ha reso impossibile il fallimento di pg_restore.

Come posso

  1. Forza l'ordine degli elementi in modo dagli indici vengono creati prima
  2. Spegnere l'aggiornamento della vista materializzata e farlo manualmente in seguito
  3. manipolare il file di dump in formato personalizzato per dire "senza dati"
  4. Intercept la dichiarazione REFRESH MATERIALIZED VIEW e gettarlo nella spazzatura

O qualsiasi altra soluzione che porti a termine il lavoro?

+3

Si prega di segnalare questo problema sulla mailing list di pgsql-hackers APPENA POSSIBILE. Collegati a questa domanda, ma descrivi anche il problema. Se conveniente, un link qui al tuo post tramite archives.postgresql.org sarebbe fantastico. –

+0

Ok, l'ho fatto. Grazie per il consiglio. –

risposta

15

David G Johnston posted an answer for me on the pgsql-hackers mailing list.

"Hai/si può provare il '-l (el) & -L' opzioni per pg_restore?

http://www.postgresql.org/docs/9.3/static/app-pgrestore.html

(esempio di utilizzo è verso la parte inferiore della pagina)

fondamentalmente riordinare la sequenza di comando in modo che la materialize eseguito come tardi possibile, o semplicemente disattivare del tutto.

pg_dump/pg_restore dovrebbe insegnare a gestire meglio questo, che è il principale motivo per cui Craig ha dovuto postare qui al più presto, ma per farlo funzionare per ora l'intervento manuale sarà necessario. In teoria le funzionalità 'Sommario' dovrebbero permettere di fare ciò che è necessario "

Penso che questo (pg_restore -l | pg_restore -L). Otterrà me dove ho bisogno di andare per ora con l'inserimento di un piccolo guscio script in mezzo che spinge le viste materializzate alla fine dell'elenco, ma poi dovrò anche gestire le mie dipendenze per gli elementi che ri-ordiniamo (MatViews di Questo limita seriamente l'utilità di viste materializzate per me. Per la versione 9.3.x, è probabile che richieda delle dipendenze MatView non più di 1.1 profondità.

Edit: Per interrompere materializzando i dati sul ripristino, ho iniziato a fare questo:

pg_dump mydatabase -Fd backup_dir 
pg_restore -l -Fd backup_dir | sed '/MATERIALIZED VIEW DATA/d' > ordered.lst 
pg_restore -L ordered.lst -Fd backup_dir mydatabase 

Ciò elimina la REFRESH MATERIALIZED VIEW dichiarazioni del ripristino. Grazie a David G Johnston per i suggerimenti.

1

Una soluzione alternativa, si potrebbe provare.

forse è possibile creare le MatViews nello schema a parte, a loro dedicati. Per compatibilità con le versioni precedenti È possibile utilizzare i sinonimi.

pg_restore può essere utilizzato solo dallo schema.

+0

Questo potrebbe essere più utile * escludendo * lo schema per le viste mat dal pg_dump principale e scaricandole in un passaggio separato. Tuttavia, questa procedura in due passaggi richiederebbe l'aggiornamento degli script di backup che erano destinati a servire più database. –

+0

Vero, spero che aggiusteranno il pg_restore. :) – Aret

3

Come un addendum alla risposta accettata, una volta che tutti gli indici hanno finito e/o si è a corto analizzare, è possibile aggiornare le viste materializzate nell'ordine corretto (dipendenza) utilizzando:

pg_restore -l -Fd backup_dir | grep 'MATERIALIZED VIEW DATA' > refresh.lst 
pg_restore -L refresh.lst -Fd backup_dir mydatabase 
Problemi correlati