25.1. Volcado SQL #

25.1.1. Restauración del volcado
25.1.2. Uso de pg_dumpall
25.1.3. Manejo de bases de datos grandes

La idea detrás de este método de volcado es generar un archivo con comandos SQL que, cuando se envíen de vuelta al servidor, recrearán la base de datos en el mismo estado en que se encontraba en el momento del volcado. PostgreSQL proporciona el programa de utilidad pg_dump para este propósito. El uso básico de este comando es:

pg_dump dbname > dumpfile

Como puedes ver, pg_dump escribe su resultado en la salida estándar. Veremos más adelante cómo esto puede ser útil. Aunque el comando anterior crea un archivo de texto, pg_dump puede crear archivos en otros formatos que permiten el paralelismo y un control más detallado de la restauración de objetos.

pg_dump es una aplicación cliente normal de PostgreSQL (aunque una particularmente inteligente). Esto significa que puedes realizar este procedimiento de respaldo desde cualquier host remoto que tenga acceso a la base de datos. But recuerda que pg_dump no opera con permisos especiales. En particular, debe tener acceso de lectura a todas las tablas que quieras respaldar, por lo que para respaldar toda la base de datos casi siempre tendrás que ejecutarlo como superusuario de la base de datos. (Si no tienes suficientes privilegios para respaldar toda la base de datos, aún puedes respaldar partes de la base de datos a las que sí tengas acceso utilizando opciones como -n schema o -t table.)

Para especificar con qué servidor de base de datos debe comunicarse pg_dump, utiliza las opciones de línea de comandos -h host y -p port. El host por defecto es el host local o lo que especifique tu variable de entorno PGHOST. Del mismo modo, el puerto por defecto está indicado por la variable de entorno PGPORT o, en su defecto, por el valor por defecto compilado. (Convenientemente, el servidor normalmente tendrá el mismo valor por defecto compilado).

Al igual que cualquier otra aplicación cliente de PostgreSQL, pg_dump se conectará por defecto con el nombre de usuario de la base de datos que sea igual al nombre de usuario del sistema operativo actual. Para anular esto, especifica la opción -U o establece la variable de entorno PGUSER. Recuerda que las conexiones de pg_dump están sujetas a los mecanismos normales de autenticación de clientes (que se describen en Chapter 20).

Una ventaja importante de pg_dump sobre los otros métodos de respaldo descritos más adelante es que la salida de pg_dump generalmente se puede volver a cargar en versiones más nuevas de PostgreSQL, mientras que los respaldos a nivel de archivo y el archivado continuo son extremadamente específicos de la versión del servidor. pg_dump es también el único método que funcionará al transferir una base de datos a una arquitectura de máquina diferente, como pasar de un servidor de 32 bits a uno de 64 bits.

Los volcados creados por pg_dump son internamente consistentes, lo que significa que el volcado representa una instantánea de la base de datos en el momento en que comenzó a ejecutarse pg_dump. pg_dump no bloquea otras operaciones en la base de datos mientras está funcionando. (Las excepciones son aquellas operaciones que necesitan operar con un bloqueo exclusivo, como la mayoría de las formas de ALTER TABLE).

25.1.1. Restauración del volcado #

Los archivos de texto creados por pg_dump están destinados a ser leídos por el programa psql utilizando su configuración por defecto. La forma general del comando para restaurar un volcado de texto es

psql -X dbname < dumpfile

donde dumpfile es el archivo de salida del comando pg_dump. La base de datos dbname no será creada por este comando, por lo que debes crearla tú mismo a partir de template0 antes de ejecutar psql (por ejemplo, con createdb -T template0 dbname). Para asegurarte de que psql se ejecute con su configuración por defecto, utiliza la opción -X (--no-psqlrc). psql admite opciones similares a pg_dump para especificar el servidor de base de datos al que conectarse y el nombre de usuario a utilizar. Consulta la página de referencia de psql para obtener más información.

Los volcados de archivos que no son de texto deben restaurarse utilizando la utilidad pg_restore.

Antes de restaurar un volcado SQL, todos los usuarios que son propietarios de objetos o a los que se les concedieron permisos sobre objetos en la base de datos volcada ya deben existir. Si no es así, la restauración no podrá recrear los objetos con la propiedad y/o los permisos originales. (A veces esto es lo que quieres, pero normalmente no es así).

Por defecto, el script de psql continuará ejecutándose después de encontrar un error SQL. Es posible que desees ejecutar psql con la variable ON_ERROR_STOP establecida para alterar ese comportamiento y hacer que psql salga con un estado de salida de 3 si ocurre un error SQL:

psql -X --set ON_ERROR_STOP=on dbname < dumpfile

De cualquier manera, solo tendrás una base de datos parcialmente restaurada. Alternativamente, puedes especificar que todo el volcado se restaure como una sola transacción, de modo que la restauración se complete por completo o se revierta (rollback) por completo. Este modo se puede especificar pasando las opciones de línea de comandos -1 o --single-transaction a psql. Al utilizar este modo, ten en cuenta que incluso un error menor puede revertir una restauración que ya se ha ejecutado durante muchas horas. Sin embargo, eso podría ser preferible a limpiar manualmente una base de datos compleja después de un volcado parcialmente restaurado.

La capacidad de pg_dump y psql para escribir o leer desde tuberías (pipes) hace posible volcar una base de datos directamente de un servidor a otro, por ejemplo:

pg_dump -h host1 dbname | psql -X -h host2 dbname

Important

Los volcados producidos por pg_dump son relativos a template0. Esto significa que cualquier lenguaje, procedimiento, etc., añadido a través de template1 también será volcado por pg_dump. Como resultado, al restaurar, si estás utilizando un template1 personalizado, debes crear la base de datos vacía a partir de template0, como en el ejemplo anterior.

Después de restaurar un respaldo, es aconsejable ejecutar ANALYZE en cada base de datos para que el optimizador de consultas tenga estadísticas útiles; consulta Section 24.1.3 y Section 24.1.6 para obtener más información. Para obtener más consejos sobre cómo cargar grandes cantidades de datos en PostgreSQL de manera eficiente, consulta Section 14.4.

25.1.2. Uso de pg_dumpall #

pg_dump vuelca solo una base de datos a la vez, y no vuelca información sobre roles o tablespaces (porque estos son para todo el clúster y no por base de datos). Para permitir un volcado conveniente de todo el contenido de un clúster de bases de datos, se proporciona el programa pg_dumpall. pg_dumpall respalda cada base de datos en un clúster dado, y también preserva los datos globales de todo el clúster, como las definiciones de roles y tablespaces. El uso básico de este comando es:

pg_dumpall > dumpfile

El volcado resultante se puede restaurar con psql:

psql -X -f dumpfile postgres

(En realidad, puedes especificar cualquier nombre de base de datos existente para comenzar, pero si estás cargando en un clúster vacío, normalmente se debe usar postgres). Siempre es necesario tener acceso de superusuario de la base de datos al restaurar un volcado de pg_dumpall, ya que eso se requiere para restaurar la información de roles y tablespaces. Si utilizas tablespaces, asegúrate de que las rutas de los tablespaces en el volcado sean adecuadas para la nueva instalación.

pg_dumpall funciona emitiendo comandos para volver a crear roles, tablespaces y bases de datos vacías, y luego invocando pg_dump para cada base de datos. Esto significa que, aunque cada base de datos será internamente consistente, las instantáneas de diferentes bases de datos no están sincronizadas.

Los datos de todo el clúster se pueden volcar por separado utilizando la opción --globals-only de pg_dumpall. Esto es necesario para respaldar completamente el clúster si se ejecuta el comando pg_dump en bases de datos individuales.

25.1.3. Manejo de bases de datos grandes #

Algunos sistemas operativos tienen límites máximos de tamaño de archivo que causan problemas al crear archivos de salida grandes de pg_dump. Afortunadamente, pg_dump puede escribir en la salida estándar, por lo que puedes utilizar herramientas Unix estándar para evitar este problema potencial. Existen varios métodos posibles:

Utilizar volcados comprimidos.  Puedes usar tu programa de compresión favorito, por ejemplo gzip:

pg_dump dbname | gzip > filename.gz

Vuelve a cargar con:

gunzip -c filename.gz | psql dbname

o:

cat filename.gz | gunzip | psql dbname

Utilizar split El comando split te permite dividir la salida en archivos más pequeños que tengan un tamaño aceptable para el sistema de archivos subyacente. Por ejemplo, para hacer fragmentos de 2 gigabytes:

pg_dump dbname | split -b 2G - filename

Vuelve a cargar con:

cat filename* | psql dbname

Si estás utilizando la versión GNU de split, es posible utilizarla junto con gzip:

pg_dump dbname | split -b 2G --filter='gzip > $FILE.gz'

Se puede restaurar usando zcat.

Utilizar el formato de volcado personalizado de pg_dump Si PostgreSQL se compiló en un sistema con la biblioteca de compresión zlib instalada, el formato de volcado personalizado comprimirá los datos a medida que los escribe en el archivo de salida. Esto producirá tamaños de archivo de volcado similares a los de usar gzip, pero tiene la ventaja añadida de que las tablas se pueden restaurar de forma selectiva. El siguiente comando vuelca una base de datos utilizando el formato de volcado personalizado:

pg_dump -Fc dbname > filename

Un volcado de formato personalizado no es un script para psql, sino que debe restaurarse con pg_restore, por ejemplo:

pg_restore -d dbname filename

Consulta las páginas de referencia de pg_dump y pg_restore para obtener detalles.

Para bases de datos muy grandes, es posible que debas combinar split con uno de los otros dos enfoques.

Utilizar la función de volcado paralelo de pg_dump Para acelerar el volcado de una base de datos grande, puedes utilizar el modo paralelo de pg_dump. Esto volcará múltiples tablas al mismo tiempo. Puedes controlar el grado de paralelismo con el parámetro -j. Los volcados paralelos solo se admiten para el formato de archivo «directorio» (directory).

pg_dump -j num -F d -f out.dir dbname

Puedes utilizar pg_restore -j para restaurar un volcado en paralelo. Esto funcionará para cualquier archivo del modo de archivo «personalizado» (custom) o «directorio», se haya creado o no con pg_dump -j.