postgresql - ¿Cómo puedo evitar que las vistas materializadas se actualicen durante pg_restore?
materialized-views postgresql-9.3 (3)
Como un anexo a la respuesta aceptada, una vez que todos los índices hayan finalizado y / o haya ejecutado ANALYZE, puede actualizar las vistas materializadas en el orden correcto (dependencia) usando:
pg_restore -l -Fd backup_dir | grep ''MATERIALIZED VIEW DATA'' > refresh.lst
pg_restore -L refresh.lst -Fd backup_dir mydatabase
He creado un volcado de la base de datos utilizando pg_dump en formato "personalizado" (-Fc). Este formato permite invocar pg_restore con la opción "trabajos" (-j8). Las opciones de trabajos inician 8 procesos y restauran la gran mayoría de las relaciones en mi base de datos en 10 minutos.
Me quedan 4 procesos. Uno de ellos es la actualización de una vista materializada, y los otros 3 son índices que se aplican a las 3 tablas que la vista materializada utiliza como fuentes de datos. Los índices están "en espera" de acuerdo con pg_stat_activity, probablemente debido a que REFRESH
de la vista materializada todavía está accediendo a las tablas de origen.
Cuando los índices están en su lugar, la actualización de la vista solo toma un par de minutos. Debido a que los índices no están en su lugar durante la REFRESH
, corté el proceso REFRESH
a las 17 horas, lo que hizo que pg_restore fallara.
Cómo puedo
- Forzar el orden de los elementos para que los índices se creen primero
- Desactivar la actualización de la vista materializada y hacerlo manualmente más tarde
- Manipule el archivo de volcado en formato personalizado para que diga "SIN DATOS"
- Intercepte la instrucción
REFRESH MATERIALIZED VIEW
y tírela a la basura
¿O alguna otra solución que haga el trabajo?
Una solución, podría intentarlo.
Tal vez pueda crear las MatViews en un esquema separado, dedicado a ellas. Para compatibilidad con versiones anteriores, podrías usar sinónimos.
pg_restore solo se puede usar por esquema.
David G Johnston publicó una respuesta para mí en la lista de correo de pgsql-hackers .
"¿Tienes / puedes probar las opciones ''-l (el) & -L'' para pg_restore?
http://www.postgresql.org/docs/9.3/static/app-pgrestore.html
(El ejemplo de uso es hacia la parte inferior de la página)
Básicamente, reordene la secuencia de comandos para que la materialización se ejecute lo más tarde posible, o simplemente desactívela por completo.
Se debe enseñar a pg_dump / pg_restore a manejar esto mejor, que es la razón principal por la que Craig le hizo publicar aquí lo antes posible, pero para hacerlo funcional por ahora será necesaria la intervención manual. En teoría, las capacidades de ''listado'' deberían permitirle hacer lo que necesita ".
Creo que esto (pg_restore -l | pg_restore -L) me llevará a donde necesito ir por el momento al insertar un pequeño script de shell entre los que empuja las vistas materializadas al final de la lista, pero luego también tendré que administrar mis propias dependencias para los elementos que reordeno (MatViews of MatViews). Esto limita bastante seriamente la utilidad de las vistas materializadas para mí. Para la versión 9.3.x, es probable que requiera las dependencias de MatView a una profundidad máxima de 1.
Edición: para dejar de materializar los datos en la restauración, comencé a hacer esto:
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
Esto elimina las sentencias REFRESH MATERIALIZED VIEW
de la restauración. Gracias a David G Johnston por los consejos.