# Sistemas de copia (backup)

---

# Resumen

* Copia y restauración tradicional
    * pg_dump, pg_dumpall, pg_restore
* Utilidad de chequeo de copia y replicación
* Copia completa física
    * pg_basebackup
* Copia continua (archiving)
    * Introducción y configuración
    * Opciones: Artesanal, Barman, WAL-E
    * Recuperación de un punto en el tiempo

---

# Copia y restauración tradicional

---

# Copia y restauración tradicional

* Copia o backup con **pg_dump**
* Uso y **ejemplos pg_dump**
* Copia o backup con **pg_dumpall**
* **Script** todas las bases de datos
* Restauración con **psql**
* Restauración con **pg_restore**
* Uso y **ejemplos pg_restore**

---

# Copia o backup (pg_dump)
* Comando **pg_dump**
* Por base de datos
* Backup consistente
* No bloqueante
* Dos formatos:
    * **Script SQL** -> Archivo con sentencias SQL y se restaurará con psql
        * **Selección a priori**
    * **Archive file** -> Archivo/s con un formato para restaurar con    pg_restore
        * **Selección a posteriori**
        * Permitirá operar sobre que queremos que sea restaurado
        * Permitirá reordenar los elementos antes de restaurar
        * Está diseñado para ser portable entre arquitecturas
    

--- 

# Copia o backup (pg_dump)
* **Parámetros interesantes**:
    * **-a** : solo datos, sin el esquema.
    * **-c** : añadir comandos para limpiar los objetos antes de crearlos (drop)
        * Solo tiene sentido en el backup Script SQL
    * **-F** : formato en el cual generar la copia, aplican los operadores:
        * **p** : plain, SQL script (es el valor por defecto)
        * **c** : custom, formato archive file 
        * **d** : directory, crea un directorio, con un archivo por tabla
        * **t** : tar, crea un archivo tar
        * **c, d, t** son formatos que acepta **pg_restore** para restaurar
    * **-j** : número de jobs en paralelo del formato directory (más carga y menos tiempo)
    * **-s** : solo el esquema
    * Y muchos más en 'man pg_dump'

--- 

# Copia o backup (uso y ejemplos pg_dump)
    !bash
    # Uso
    pg_dump [connection-option...] [option...] [dbname]
    # Con salida hacia la salida estandard
    
    # Copia formato script sql
    pg_dump pruebadb > pruebadb.sql
    
    # Copia formato archive file
    pg_dump -Fc pruebadb > pruebadb.dump
    
    # Copia formato archive file y comprimiendo con gzip
    pg_dump -Fc pruebadb | gzip > pruebadb.dump.gz
    
    # Copia formato directory con 10 procesos en paralelo, (siempre uno por tabla)
    pg_dump -Fd pruebadb -j 10 -f pruebadbdir
    
[Más ejemplos en la documentación de postgres](http://www.postgresql.org/docs/9.3/static/app-pgdump.html)

---

# Copia o backup (pg_dumpall)

* Copia todas las bases de datos a un script SQL 
* No se podrá restaurar con pg_restore
* Copia **objetos globales que no copia pg_dump** (usuarios, permisos, tablespaces, ...)
* Se debería lanzar como **superusuario**:
    * Privilegios con permisos sobre objetos globales
    * Validación por contraseña la pediría para cada base de datos
    * Parámetros interesantes que difieran de pg_dump:
        * -g : solo objetos globales
        * -r : solo roles de usuario

---

# Copia o backup (ejemplos pg_dumpall)

Ejemplos

    !bash
    # Clásico de todas las bases de datos y objetos globales
    pg_dumpall > db.out

    # Solo objetos globales
    pg_dumpall -g > db.out
    
    # Solo roles de usuario
    pg_dumpall -r > db.out

[Más en la documentación de postgres](http://www.postgresql.org/docs/9.3/static/app-pg-dumpall.html)

--- 

# Copia o backup (script todas las bases de datos)

    !bash
    #!/bin/bash
    # Hace un backup de todas las bases de datos en el servidor postgresql por defecto
    # A incluir en el cron del usuario postgres
    
    DIR=/var/lib/postgresql/backups
    LANG=en_US LIST=$(psql -l | awk '{ print $1}' | grep -vE '^-|^List|^Name|template[0|1]|^\(')
    
    for db in $LIST
    do
        pg_dump -Fc $db | gzip >  $DIR/$db.gz
    done

---

# Restauración (psql)

* Restauración con **psql**
* En caso de que tengamos un backup en **script SQL**
* Ejecutaremos el script en una **base de datos limpia**
* O haber creado el script con el paramentro -c "Clean" que añade los **DROP**
* Podemos cargar el script de **dos maneras**:
    * Con el **comando psql**: *psql -d newdb -f db.sql*
    * Dentro de la consola psql con el operador **\i sqlfile.sql**
        * Estando conectado a la base de datos correspondiente  

---

# Restauración (pg_restore)

* Restauración con **pg_restore**
* En caso de que tengamos un backup en formato **Archive file**
* Le especificamos a pg_restore lo que queremos restaurar:
    * En que base de datos
    * Con que usuario
    * Si queremos que nos recree la base de datos
    * Solo esquema
    * Solo datos
    * Solo una tabla

---

# Restauración (pg_restore)
* **Parámetros interesantes**:
    * **-a** : solo datos, sin el esquema.
    * **-c** : borrar los objetos antes de crearlos
    * **-j N** : N, número de procesos a utilizar para la restauración (¿número de CPUS?)
        * Tiene sentido si es una base de datos grande
    * **-l** : listar el contenido de un dump, sin aplicar nada.
    * **-s** : solo el esquema
    * **-O** : no restuaurar la información de propietario de objetos
        * Muy útil si restauras en otro entorno con otro nombre usuario
    * **-t** : restaurar solo una tabla
    * **-x** : no restaurar los permisos de acceso
    * Y muchos más en 'man pg_restore'

---

# Restauración (uso y ejemplos pg_restore)

    !bash
    # Uso
    pg_restore [connection-option...] [option...] [filename]
    
    # Listar un resumen del contenido de un dump
    pg_restore -l pruebadb.dump
    
    # Restaurar solo una tabla
    pg_restore -t tabla -d pruebadb pruebadbold.dump
    
    # Restaurando desde un archivo comprimido gzip, con otro usuario, opciones extra
    zcat pruebadbold.dump.gz | pg_restore -U unew -O -x -d pruebadb
    
[Más ejemplos en la documentación de postgres](http://www.postgresql.org/docs/9.3/static/app-pgrestore.html)

# Presenter Notes

    !bash
    postgres@apsl-edu:~$ pg_restore -l htvdb.dump 
    ;
    ; Archive created at Wed Oct 22 15:29:20 2014
    ;     dbname: htvdb
    ;     TOC Entries: 467
    ;     Compression: -1
    ;     Dump Version: 1.12-0
    ;     Format: CUSTOM
    ;     Integer: 4 bytes
    ;     Offset: 8 bytes
    ;     Dumped from database version: 9.3.5
    ;     Dumped by pg_dump version: 9.3.5
    ;
    ;
    ; Selected TOC Entries:
    ;
    2655; 1262 19641 DATABASE - htvdb uhtv
    6; 2615 30461 SCHEMA - public postgres
    2656; 0 0 COMMENT - SCHEMA public postgres
    2657; 0 0 ACL - public postgres
    260; 3079 30462 EXTENSION - plpgsql 
    2658; 0 0 COMMENT - EXTENSION plpgsql 
    170; 1259 30467 TABLE public admin_tools_dashboard_preferences uhtv
    171; 1259 30473 SEQUENCE public admin_tools_das
    ... informacion de todos los objetos ...
