pg_restore tarda mucho más que pg_dump

9

Regularmente guardo y luego restauro una pequeña base de datos PostgreSQL, que se utiliza para las pruebas. Sus datos se actualizan regularmente como resultado de las pruebas, luego se debe realizar un nuevo volcado y los volcados se usan regularmente para recrear la base de datos en un estado bien definido.

Noté que el volcado (usando pg_dump -Fc database) solo toma unos segundos, pero la restauración ( pg_restore -d database) toma aproximadamente un minuto. Esto parece raro Hubiera esperado que ambos tomaran aproximadamente el mismo tiempo (suponiendo que ambas tareas estén vinculadas a E / S).

¿Hay algún problema con la restauración? ¿Tal vez podría hacerlo más rápido? ¿O es normal que la restauración tarde mucho más que el volcado? (Y si es así, ¿por qué?)

El archivo de volcado generalmente tiene alrededor de 3-4 MiB; el DBMS es PostgreSQL V8.4, que se ejecuta en un Pentium4 3GHz con 1GiB RAM en Ubuntu Linux.

sleske
fuente

Respuestas:

9

El contenido de un índice no es parte de la copia de seguridad, solo la definición del índice. Y eso solo tomará unos pocos bytes. Cuando se crea el índice durante la restauración y se indexan todos los datos, será mucho más grande. Esto llevará tiempo, pero depende de su situación cuánto tiempo.

pg_restore tiene una opción para restauración concurrente (a partir de la versión 8.4), use--jobs=number-of-jobs

Frank Heikens
fuente
Interesante, gracias. ¿Hay alguna manera de volcar el índice también, para acelerar la restauración (a costa de un archivo de volcado más grande)?
sleske
No, el contenido del índice no puede ser parte de la copia de seguridad. Para una base de datos muy pequeña como la suya (3-4 MiB), no debería ser un problema de todos modos.
Frank Heikens
Información adicional: pg_dump no tiene acceso al contenido de un índice. pg_dump usa sentencias SELECT para obtener todo el contenido de las tablas y el contenido de las tablas del sistema para crear la copia de seguridad. Es "simplemente" un contenedor alrededor de algunas instrucciones SELECT y algunas funciones para escribir los resultados en el disco.
Frank Heikens
@ Frank: Gracias. No sabía sobre la implementación de pg_dump. En nuestro caso, acelerar la restauración sería útil, ya que necesita ejecutarse repetidamente como parte de las pruebas automatizadas, por lo que sería útil reducirlo de 1 minuto a 10 segundos. Pero aparentemente eso no es factible. Tendré que encontrar una solución diferente ...
sleske
2
@sleske, puede probar con el enfoque de copia de seguridad del sistema de archivos . Esto debe preservar los índices y, además, probablemente, correr un poco más rápido, tanto para la copia de seguridad y restaurar
Stefano
4

Para una restauración, la base de datos tiene que hacer mucho trabajo adicional:

Algunas cosas me vienen a la mente de inmediato:

  • Escribir es más lento que leer
  • Analizar la entrada lleva tiempo
  • Actualización de índices y otras estructuras internas.
  • Mantener integridad referencial

Sin embargo, no estoy seguro de si esto equivale a esa diferencia horaria.

Sven
fuente