Présentation de pg_dump

Le principe de cette technique est assez simple : générer un fichier de commandes SQL qui, lorsqu'elles sont exécutées sur une base de données vierge, permettent d'obtenir à l'identique la base de données sauvegardée.

Pour réussir cela, il sera d'abord nécessaire de se connecter à l'utilisateur postgres (sudo -i -u postgres) car il est nécessaire d'avoir les droits de super-utilisateur sur PostgreSQL pour que la sauvegarde se passe bien : le super-utilisateur est l'utilisateur dont on est sûr qu'il sera autorisé à lire toutes les tables de n'importe quelle base. Il est en effet nécessaire de lire les tables pour pouvoir les sauvegarder. Ainsi, nous connecter en tant que postgres nous garantit qu'on lira toutes les tables et que la sauvegarde sera complète.

Sauvegarde avec pg_dump

1
pg_dump -cC --file mon_fichier.dump nom_de_la_base

L'option -cC permettra de supprimer puis de récréer la base lors de la restauration, donc elle est à ne pas oublier.

Après avoir tapé cette commande, vous aurez donc un fichier de sauvegarde SQL.

Attention

Notons tout de même que si pendant la sauvegarde des changements sont faits sur la base de données, la sauvegarde ne les prendra pas en compte.

En revanche : « Les sauvegardes réalisées sont cohérentes, même lors d'accès concurrents à la base de données. pg_dump ne bloque pas l'accès des autres utilisateurs (ni en lecture ni en écriture). »

https://docs.postgresql.fr/current/app-pgdump.html

Remarque

Par convention on peut décider de mettre le fichier en .dump mais cela n'a aucune importance. Pour Unix, que vous mettiez .bak, .dump, .sql ou rien du tout, le système verra un fichier texte. Mettre .dump facilitera simplement la gestion des sauvegardes.

Exemple d'une sauvegarde

Si vous êtes familier au SQL, vous devez sûrement reconnaître, dans l'exemple ci-dessous, quelques commandes basiques telles que CREATE TABLE.

La lecture par PostgreSQL de l'ensemble de ces commandes permettra de faire qu'une base vierge devienne identique à la base sauvegardée.

Dans notre exemple, on voit la création de deux tables nommées array_int et pers.

1
--
2
-- PostgreSQL database dump
3
--
4
5
-- Dumped from database version 9.6.7
6
-- Dumped by pg_dump version 9.6.7
7
8
SET statement_timeout = 0;
9
SET lock_timeout = 0;
10
SET idle_in_transaction_session_timeout = 0;
11
SET client_encoding = 'UTF8';
12
SET standard_conforming_strings = on;
13
SET check_function_bodies = false;
14
SET client_min_messages = warning;
15
SET row_security = off;
16
17
--
18
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: 
19
--
20
21
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
22
23
24
--
25
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: 
26
--
27
28
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
29
30
31
SET search_path = public, pg_catalog;
32
33
SET default_tablespace = '';
34
35
SET default_with_oids = false;
36
37
--
38
-- Name: array_int; Type: TABLE; Schema: public; Owner: postgres
39
--
40
41
CREATE TABLE array_int (
42
    id integer[]
43
);
44
45
46
ALTER TABLE array_int OWNER TO postgres;
47
48
--
49
-- Name: pers; Type: TABLE; Schema: public; Owner: postgres
50
--
51
52
CREATE TABLE pers (
53
    test integer
54
);
55
56
57
ALTER TABLE pers OWNER TO postgres;
58
59
--
60
-- Data for Name: array_int; Type: TABLE DATA; Schema: public; Owner: postgres
61
--
62
63
COPY array_int (id) FROM stdin;
64
\.
65
66
67
--
68
-- Data for Name: pers; Type: TABLE DATA; Schema: public; Owner: postgres
69
--
70
71
COPY pers (test) FROM stdin;
72
\.
73
74
75
--
76
-- PostgreSQL database dump complete
77
--
78