2010-01-19 28 views
62

Cuando comencé, usé pg_dump con el formato plano predeterminado. Yo no estaba iluminado.PostgreSQL: mejorando pg_dump, pg_restore performance

La investigación me reveló mejoras de tamaño de archivo y tiempo con pg_dump -Fc | gzip -9 -c > dumpfile.gz. Estaba iluminado.

Cuando llegó el momento de crear la base de datos de nuevo,

# create tablespace dbname location '/SAN/dbname'; 
# create database dbname tablespace dbname; 
# alter database dbname set temp_tablespaces = dbname; 

% gunzip dumpfile.gz    # to evaluate restore time without a piped uncompression 
% pg_restore -d dbname dumpfile # into a new, empty database defined above 

me sentí no iluminada: la restauración se tomó 12 horas para crear la base de datos que es sólo una fracción de lo que se convertirá en:

# select pg_size_pretty(pg_database_size('dbname')); 
47 GB 

Como hay predicciones de que esta base de datos será de unos pocos terabytes, necesito ver ahora cómo mejorar el rendimiento.

Por favor, ilumíname.

Respuesta

45

Primero compruebe que obtiene un rendimiento IO razonable de la configuración de su disco. Luego verifique que la instalación de PostgreSQL esté debidamente ajustada. En particular shared_buffers debe estar configurado correctamente, maintenance_work_mem debe aumentarse durante la restauración, full_page_writes debe estar apagado durante la restauración, wal_buffers debe aumentarse a 16 MB durante la restauración, checkpoint_segments debe aumentarse a algo así como 16 durante la restauración, no debe tiene cualquier inicio de sesión irrazonable (como el registro de cada instrucción ejecutada), auto_vacuum se debe deshabilitar durante la restauración.

Si está en 8.4 también experimenta con restauración paralela, la opción --jobs para pg_restore.

+0

Si tiene un esclavo conectado, y la carga en el maestro ya es considerable, entonces quizás quiera hacer la copia de seguridad en el esclavo. Especialmente dado que el esclavo es de solo lectura, imagino que también puede ayudar en cierto grado. En un clúster grande, puede ser útil tener uno o más esclavos dedicados a copias de seguridad escalonadas si las copias de seguridad tardan mucho tiempo. Para que no te pierdas nada, querrás que estos recursos en espera estén conectados a través de la replicación de transmisión para que se escriban desde el WAL en el maestro. –

+5

'shared_buffers debería estar configurado correctamente' ¿qué significa eso? –

3

Como puede haber adivinado simplemente por el hecho de que la compresión de los resultados de la copia de seguridad en un rendimiento más rápido, su copia de seguridad está vinculada a E/S. Esto no debería ser una sorpresa, ya que las copias de seguridad casi siempre van a estar vinculadas a E/S. Al comprimir los datos, se intercambia la carga de E/S para la carga de la CPU y, dado que la mayoría de las CPU están inactivas durante las transferencias de datos monstruosas, la compresión sale como una ganancia neta.

Por lo tanto, para acelerar los tiempos de copia de seguridad/restauración, necesita E/S más rápidas. Más allá de reorganizar la base de datos para que no sea una gran instancia única, eso es todo lo que puedes hacer.

+0

Si optimizando el momento pg_dump, con volcado en paralelo a partir de v9.3, compresión> 0 puede doler mucho! Esto se debe a que los procesos pg_dump y postmaster ya acaparan la CPU lo suficiente como para que la adición de compresión> = 1 haga que la tarea general se una significativamente a la CPU en lugar de a la de E/S. Básicamente, la suposición más antigua de que las CPU están inactivas sin compresión no es válida con el volcado paralelo. –

13

dos temas/ideas:

  1. Al especificar Fc, la salida pg_dump ya está comprimido. La compresión no es máxima, por lo que puede ahorrar algo de espacio al usar "gzip -9", pero apostaría que no es suficiente para garantizar el tiempo adicional (y E/S) utilizado para comprimir y descomprimir la versión -Fc de la copia de seguridad .

  2. Si está utilizando PostgreSQL 8.4.x, puede acelerar la restauración de una copia de seguridad de .Fc con la nueva opción de línea de comando pg_restore "-j n" donde n = número de conexiones paralelas para usar para la restauración. Esto permitirá que pg_restore cargue más de los datos de una tabla o genere más de un índice al mismo tiempo.

+0

Actualmente estamos en 8.3; nueva razón para actualizar –

+0

Puede usar la versión 8.4 de pg_restore con una versión 8.3 del servidor. Solo asegúrate de usar pg_dump desde 8.3. –

+0

Bah. Estamos atascados en 8.3 porque utilizamos la instalación del paquete Solaris10 de Postgres y, "no hay un plan para integrar PG8.4 en S10 en este momento". [Árbitro. http://www.mail-archive.com/[email protected]/msg136829.html] Tendría que asumir la tarea de instalar y mantener el código abierto postgres. No estoy seguro si podemos hacer eso aquí ... Feh. –

8

Supongo que necesita una copia de seguridad, no una actualización importante de la base de datos.

Para la copia de seguridad de bases de datos grandes, debe configurar continuous archiving en lugar de pg_dump.

  1. Set up WAL archiving.

  2. Hacer copias de seguridad de base, por ejemplo, todos los días mediante el uso de
    psql template1 -c "select pg_start_backup(' `date +% F% T`` ')" rsync -a --delete/var/lib/pgsql/data// var/copias de seguridad/pgsql/base/ psql template1 -c "seleccionar pg_stop_backup()" `

Una restauración sería tan simple como la restauración de base de datos y registra WAL no mayores de pg_start_backup tiempo desde la ubicación de copia de seguridad y puesta en Postgres. y será mucho más rápido.

+1

No miramos a PITR (archivo WAL) porque el sistema no es muy pesado en cuanto a las transacciones pero conservará muchos registros históricos en su lugar. Sin embargo, ahora que lo pienso, una copia de seguridad más "incremental" puede ayudar. Investigaré. Gracias. –

-1

Además del o sus sugerencias, no olvide ajustar su configuración, incluidos los cambios a maintenance_work_mem y checkpoint_segments.

Consulte this page para obtener sugerencias de rendimiento para la inserción masiva de datos en PostgreSQL.

8
zcat dumpfile.gz | pg_restore -d db_name 

Elimina la escritura completa de los datos descomprimidos en el disco, que es actualmente su cuello de botella.

4

Mejorar volcado pg & restaurar

pg_dump | utilice siempre el formato de directorio con -j opción

time pg_dump -j 8 -Fd -f /tmp/newout.dir fsdcm_external 

pg_restore | utilice siempre la sintonización de postgres.conf con formato de directorio Con -j opción

work_mem = 32MB 
shared_buffers = 4GB 
maintenance_work_mem = 2GB 
full_page_writes = off 
autovacuum = off 
wal_buffers = -1 

time pg_restore -j 8 --format=d -C -d postgres /tmp/newout.dir/` 

Para obtener más información

https://github.com/YanarAssaf/PostgreSQL/wiki/Improve-pg-dump%7Crestore