| 1 |
<?xml version="1.0" encoding="ISO-8859-15"?> |
|---|
| 2 |
<!-- Dernière modification |
|---|
| 3 |
le $Date$ |
|---|
| 4 |
par $Author$ |
|---|
| 5 |
révision $Revision$ --> |
|---|
| 6 |
|
|---|
| 7 |
<chapter id="backup"> |
|---|
| 8 |
<title>Sauvegardes et restaurations</title> |
|---|
| 9 |
|
|---|
| 10 |
<indexterm zone="backup"><primary>backup</primary></indexterm> |
|---|
| 11 |
|
|---|
| 12 |
<para> |
|---|
| 13 |
Comme tout ce qui contient des données importantes, les bases de données |
|---|
| 14 |
<productname>PostgreSQL</productname> doivent être sauvegardées régulièrement. |
|---|
| 15 |
Bien que la procédure soit assez simple, il est important de comprendre les |
|---|
| 16 |
techniques et hypothèses sous-jacentes. |
|---|
| 17 |
</para> |
|---|
| 18 |
|
|---|
| 19 |
<para> |
|---|
| 20 |
Il y a trois approches fondamentalement différentes pour sauvegarder les |
|---|
| 21 |
données de <productname>PostgreSQL</productname> : |
|---|
| 22 |
<itemizedlist> |
|---|
| 23 |
<listitem><para><acronym>la sauvegarde SQL ;</acronym></para></listitem> |
|---|
| 24 |
<listitem><para>la sauvegarde au niveau du système de |
|---|
| 25 |
fichiers ;</para></listitem> |
|---|
| 26 |
<listitem><para>l'archivage continu.</para></listitem> |
|---|
| 27 |
</itemizedlist> |
|---|
| 28 |
Chacune a ses avantages et ses inconvénients. |
|---|
| 29 |
Elles sont toutes analysées, chacune leur tour. |
|---|
| 30 |
</para> |
|---|
| 31 |
|
|---|
| 32 |
<sect1 id="backup-dump"> |
|---|
| 33 |
<title>Sauvegarde <acronym>SQL</acronym></title> |
|---|
| 34 |
|
|---|
| 35 |
<para> |
|---|
| 36 |
Le principe est de produire un fichier texte de commandes SQL (appelé |
|---|
| 37 |
<quote>fichier dump</quote>), qui, si on le renvoie au serveur, recrée une |
|---|
| 38 |
base de données identique à celle sauvegardée. |
|---|
| 39 |
<productname>PostgreSQL</productname> propose pour cela le programme utilitaire |
|---|
| 40 |
<xref linkend="app-pgdump"/>. L'usage basique est : |
|---|
| 41 |
<synopsis>pg_dump <replaceable class="parameter">base_de_donnees</replaceable> > <replaceable class="parameter">fichier_de_sortie</replaceable></synopsis> |
|---|
| 42 |
<application>pg_dump</application> écrit son résultat sur la |
|---|
| 43 |
sortie standard. Son utilité est expliqué plus loin. |
|---|
| 44 |
</para> |
|---|
| 45 |
|
|---|
| 46 |
<para> |
|---|
| 47 |
<application>pg_dump</application> est un programme client |
|---|
| 48 |
<productname>PostgreSQL</productname> |
|---|
| 49 |
classique (mais plutôt intelligent). Cela signifie que la |
|---|
| 50 |
sauvegarde peut être effectuée depuis n'importe quel ordinateur ayant accès à la base. |
|---|
| 51 |
Mais <application>pg_dump</application> n'a pas de droits spéciaux. |
|---|
| 52 |
Il doit, en particulier, avoir accès en lecture à toutes les tables |
|---|
| 53 |
à sauvegarder, si bien qu'il doit être lancé pratiquement |
|---|
| 54 |
toujours en tant que superutilisateur de la base. |
|---|
| 55 |
</para> |
|---|
| 56 |
|
|---|
| 57 |
<para> |
|---|
| 58 |
Pour préciser le serveur de bases de données que |
|---|
| 59 |
<application>pg_dump</application> doit |
|---|
| 60 |
contacter, on utilise les options de ligne de commande |
|---|
| 61 |
<option>-h <replaceable>serveur</replaceable></option> et |
|---|
| 62 |
<option>-p <replaceable>port</replaceable></option>. |
|---|
| 63 |
Le serveur par défaut est le serveur local ou celui indiqué par la |
|---|
| 64 |
variable d'environnement <envar>PGHOST</envar>. |
|---|
| 65 |
De la même façon, le port par défaut est indiqué par la variable d'environnement |
|---|
| 66 |
<envar>PGPORT</envar> ou, en son absence, par la valeur par défaut précisée |
|---|
| 67 |
à la compilation. Le serveur a normalement reçu les mêmes valeurs par |
|---|
| 68 |
défaut à la compilation. |
|---|
| 69 |
</para> |
|---|
| 70 |
|
|---|
| 71 |
<para> |
|---|
| 72 |
Comme tout programme client <productname>PostgreSQL</productname>, |
|---|
| 73 |
<application>pg_dump</application> |
|---|
| 74 |
se connecte par défaut avec l'utilisateur de base de données de même nom que |
|---|
| 75 |
l'utilisateur système courant. L'utilisation de l'option |
|---|
| 76 |
<option>-U</option> ou de la variable d'environnement |
|---|
| 77 |
<envar>PGUSER</envar> permettent de |
|---|
| 78 |
modifier le comportement par défaut. Les connexions de |
|---|
| 79 |
<application>pg_dump</application> sont soumises aux mécanismes normaux |
|---|
| 80 |
d'authentification des programmes clients (décrits dans le |
|---|
| 81 |
<xref linkend="client-authentication"/>). |
|---|
| 82 |
</para> |
|---|
| 83 |
|
|---|
| 84 |
<para> |
|---|
| 85 |
Les sauvegardes créées par <application>pg_dump</application> sont |
|---|
| 86 |
cohérentes, ce qui signifie que la sauvegarde représente une image de la |
|---|
| 87 |
base de données au moment où commence l'exécution de |
|---|
| 88 |
<application>pg_dump</application>. |
|---|
| 89 |
<application>pg_dump</application> ne bloque pas les autres opérations sur la base |
|---|
| 90 |
lorsqu'il fonctionne (sauf celles qui nécessitent un verrou exclusif, comme |
|---|
| 91 |
la plupart des formes d'<command>ALTER TABLE</command>.) |
|---|
| 92 |
</para> |
|---|
| 93 |
|
|---|
| 94 |
<important> |
|---|
| 95 |
<para> |
|---|
| 96 |
Si la base de données utilise les OID (par exemple en tant que clés |
|---|
| 97 |
étrangères), il est impératif d'indiquer à |
|---|
| 98 |
<application>pg_dump</application> de sauvegarder |
|---|
| 99 |
aussi les OID. Pour cela, on utilise l'option <option>-o</option> sur la ligne |
|---|
| 100 |
de commande. |
|---|
| 101 |
</para> |
|---|
| 102 |
</important> |
|---|
| 103 |
|
|---|
| 104 |
<sect2 id="backup-dump-restore"> |
|---|
| 105 |
<title>Restaurer la sauvegarde</title> |
|---|
| 106 |
|
|---|
| 107 |
<para> |
|---|
| 108 |
Les fichiers texte créés par <application>pg_dump</application> peuvent être |
|---|
| 109 |
lus par le programme <application>psql</application>. La syntaxe générale |
|---|
| 110 |
d'une commande de restauration est |
|---|
| 111 |
<synopsis>psql <replaceable class="parameter">base_de_donnees</replaceable> < <replaceable class="parameter">fichier_d_entree</replaceable></synopsis> |
|---|
| 112 |
où <replaceable class="parameter">fichier_d_entree</replaceable> est |
|---|
| 113 |
celui précisé comme <replaceable class="parameter">fichier_de_sortie</replaceable> |
|---|
| 114 |
à la commande <application>pg_dump</application>. La base de données |
|---|
| 115 |
<replaceable class="parameter">base_de_donnees</replaceable> n'est pas créée par cette |
|---|
| 116 |
commande. Elle doit être créée à partir de <literal>template0</literal> |
|---|
| 117 |
avant d'exécuter <application>psql</application> (par exemple avec <literal>createdb -T |
|---|
| 118 |
template0 <replaceable class="parameter">base_de_donnees</replaceable></literal>). |
|---|
| 119 |
<application>psql</application> propose des options similaires à celles de |
|---|
| 120 |
<application>pg_dump</application> pour indiquer le serveur de bases de |
|---|
| 121 |
données sur lequel se connecter et le nom d'utilisateur à utiliser. La |
|---|
| 122 |
page de référence de <xref linkend="app-psql"/> donne plus d'informations. |
|---|
| 123 |
</para> |
|---|
| 124 |
|
|---|
| 125 |
<para> |
|---|
| 126 |
Tous les utilisateurs possédant des |
|---|
| 127 |
objets ou ayant certains droits sur les objets de la base sauvegardée |
|---|
| 128 |
doivent exister préalablement à la restauration de la sauvegarde. S'ils |
|---|
| 129 |
n'existent pas, la |
|---|
| 130 |
restauration échoue pour la création des objets dont ils sont |
|---|
| 131 |
propriétaires ou sur lesquels ils ont des droits (quelque fois, cela |
|---|
| 132 |
est souhaitable mais ce n'est habituellement pas le cas). |
|---|
| 133 |
</para> |
|---|
| 134 |
|
|---|
| 135 |
<para> |
|---|
| 136 |
Par défaut, le script <application>psql</application> continue de |
|---|
| 137 |
s'exécuter après la détection d'une erreur SQL. La commande suivante |
|---|
| 138 |
peut être placée au début du script pour modifier ce comportement. |
|---|
| 139 |
<application>psql</application> quitte alors avec un |
|---|
| 140 |
code d'erreur 3 si une erreur SQL survient : |
|---|
| 141 |
<programlisting>\set ON_ERROR_STOP |
|---|
| 142 |
</programlisting> |
|---|
| 143 |
Dans tous les cas, une sauvegarde partiellement restaurée est obtenue. |
|---|
| 144 |
Si cela n'est pas souhaitable, il est possible d'indiquer que la sauvegarde |
|---|
| 145 |
complète doit être restaurée au cours d'une transaction unique. De ce |
|---|
| 146 |
fait, soit la restauration est validée dans son ensemble, soit elle est |
|---|
| 147 |
entièrement annulée. Ce mode est choisi |
|---|
| 148 |
en passant l'option <option>-1</option> ou <option>--single-transaction</option> |
|---|
| 149 |
en ligne de commande à <application>psql</application>. Dans ce mode, |
|---|
| 150 |
la plus petite erreur peut annuler une restauration en cours depuis |
|---|
| 151 |
plusieurs heures. Néanmoins, c'est probablement |
|---|
| 152 |
préférable au nettoyage manuel d'une base rendue complexe par une |
|---|
| 153 |
sauvegarde partiellement restaurée. |
|---|
| 154 |
</para> |
|---|
| 155 |
|
|---|
| 156 |
<para> |
|---|
| 157 |
La capacité de <application>pg_dump</application> et |
|---|
| 158 |
<application>psql</application> à écrire |
|---|
| 159 |
et à lire dans des tubes permet de sauvegarder une base de données |
|---|
| 160 |
directement d'un serveur sur un autre. Par exemple : |
|---|
| 161 |
<programlisting>pg_dump -h <replaceable>serveur1</replaceable> <replaceable>base_de_donnees</replaceable> | psql -h <replaceable>serveur2</replaceable> <replaceable>base_de_donnees</replaceable></programlisting> |
|---|
| 162 |
</para> |
|---|
| 163 |
|
|---|
| 164 |
<important> |
|---|
| 165 |
<para> |
|---|
| 166 |
Les fichiers de sauvegarde produits par <application>pg_dump</application> sont |
|---|
| 167 |
relatifs à <literal>template0</literal>. Cela signifie que chaque langage, |
|---|
| 168 |
procédure, etc. ajouté à <literal>template1</literal> est aussi sauvegardé |
|---|
| 169 |
par <application>pg_dump</application>. En conséquence, si une base |
|---|
| 170 |
<literal>template1</literal> modifiée est utilisée lors de la |
|---|
| 171 |
restauration, il faut créer la base vide à partir de |
|---|
| 172 |
<literal>template0</literal>, comme dans l'exemple précédent. |
|---|
| 173 |
</para> |
|---|
| 174 |
</important> |
|---|
| 175 |
|
|---|
| 176 |
<para> |
|---|
| 177 |
Après la restauration d'une sauvegarde, il est conseillé d'exécuter |
|---|
| 178 |
<xref linkend="sql-analyze" endterm="sql-analyze-title"/> sur chaque base de |
|---|
| 179 |
données pour que l'optimiseur de requêtes dispose de statistiques utiles. |
|---|
| 180 |
Un moyen simple de le faire est d'exécuter <command>vacuumdb -a -z</command> ; |
|---|
| 181 |
c'est équivalent à exécuter manuellement <command>VACUUM ANALYZE</command> sur chaque |
|---|
| 182 |
base. |
|---|
| 183 |
Pour plus de conseils sur le chargement efficace de grosses quantités de |
|---|
| 184 |
données dans <productname>PostgreSQL</productname>, on peut se référer à la |
|---|
| 185 |
<xref linkend="populate"/>. |
|---|
| 186 |
</para> |
|---|
| 187 |
|
|---|
| 188 |
</sect2> |
|---|
| 189 |
|
|---|
| 190 |
<sect2 id="backup-dump-all"> |
|---|
| 191 |
<title>Utilisation de <application>pg_dumpall</application></title> |
|---|
| 192 |
|
|---|
| 193 |
<para> |
|---|
| 194 |
<application>pg_dump</application> ne sauvegarde qu'une seule base à la |
|---|
| 195 |
fois, et ne sauvegarde pas les informations relatives aux rôles et |
|---|
| 196 |
<foreignphrase>tablespaces</foreignphrase> (parce que ceux-ci portent |
|---|
| 197 |
sur l'ensemble des bases du cluster, et non sur une base particulière). |
|---|
| 198 |
Pour permettre une sauvegarde aisée de tout le contenu d'un cluster, le |
|---|
| 199 |
programme <xref linkend="app-pg-dumpall"/> est fourni. |
|---|
| 200 |
<application>pg_dumpall</application> sauvegarde toutes les bases de données d'un |
|---|
| 201 |
cluster (ensemble des bases d'une instance) <productname>PostgreSQL</productname> et |
|---|
| 202 |
préserve les données communes au cluster, telles que les rôles et tablespaces. |
|---|
| 203 |
L'utilisation basique de cette commande est : |
|---|
| 204 |
<synopsis>pg_dumpall > <replaceable>fichier_de_sortie</replaceable></synopsis> |
|---|
| 205 |
Le fichier de sauvegarde résultant peut être restauré avec |
|---|
| 206 |
<application>psql</application> : |
|---|
| 207 |
<synopsis>psql -f <replaceable class="parameter">fichier_d_entree</replaceable> postgres</synopsis> |
|---|
| 208 |
(N'importe quelle base de données peut être utilisée pour la connexion |
|---|
| 209 |
mais si le rechargement est exécuté sur un cluster vide, il est |
|---|
| 210 |
préférable d'utiliser <literal>postgres</literal>.) |
|---|
| 211 |
Il faut obligatoirement avoir le profil superutilisateur pour restaurer |
|---|
| 212 |
une sauvegarde faite avec <application>pg_dumpall</application>, afin de |
|---|
| 213 |
pouvoir restaurer les informations sur les rôles et les tablespaces. |
|---|
| 214 |
Si les <foreignphrase>tablespaces</foreignphrase> sont utilisés, il faut |
|---|
| 215 |
s'assurer que leurs chemins sauvegardés sont appropriés à la nouvelle |
|---|
| 216 |
installation. |
|---|
| 217 |
</para> |
|---|
| 218 |
|
|---|
| 219 |
<para> |
|---|
| 220 |
<application>pg_dumpall</application> fonctionne en émettant des |
|---|
| 221 |
commandes pour re-créer des rôles, des tablespaces et des bases vides, puis |
|---|
| 222 |
en invoquant <application>pg_dump</application> pour chaque base de |
|---|
| 223 |
données. Cela signifie que, bien que chaque base de données est |
|---|
| 224 |
cohérente en interne, les images des différentes bases de données peuvent |
|---|
| 225 |
ne pas être tout à fait synchronisées. |
|---|
| 226 |
</para> |
|---|
| 227 |
</sect2> |
|---|
| 228 |
|
|---|
| 229 |
<sect2 id="backup-dump-large"> |
|---|
| 230 |
<title>Gérer les grosses bases de données</title> |
|---|
| 231 |
|
|---|
| 232 |
<para> |
|---|
| 233 |
Comme <productname>PostgreSQL</productname> autorise des tables plus |
|---|
| 234 |
volumineuses que la taille maximale d'un fichier sur le système de fichiers, |
|---|
| 235 |
sauvegarder une telle table en fichier peut poser des problèmes. |
|---|
| 236 |
Puisque <application>pg_dump</application> peut écrire sur la sortie |
|---|
| 237 |
standard, les outils standard d'Unix peuvent être utilisés pour contourner |
|---|
| 238 |
ce problème éventuel. |
|---|
| 239 |
Il existe plusieurs façon de procéder : |
|---|
| 240 |
</para> |
|---|
| 241 |
|
|---|
| 242 |
<formalpara> |
|---|
| 243 |
<title>Compresser le fichier de sauvegarde</title> |
|---|
| 244 |
<para> |
|---|
| 245 |
Tout programme de compression habituel est utilisable. Par exemple |
|---|
| 246 |
<application>gzip</application> : |
|---|
| 247 |
|
|---|
| 248 |
<programlisting>pg_dump <replaceable class="parameter">base_de_donnees</replaceable> | gzip > <replaceable class="parameter">nom_fichier</replaceable>.gz</programlisting> |
|---|
| 249 |
|
|---|
| 250 |
Pour restaurer : |
|---|
| 251 |
|
|---|
| 252 |
<programlisting>gunzip -c <replaceable class="parameter">nom_fichier</replaceable>.gz | psql <replaceable class="parameter">base_de_donnees</replaceable></programlisting> |
|---|
| 253 |
|
|---|
| 254 |
ou |
|---|
| 255 |
|
|---|
| 256 |
<programlisting>cat <replaceable class="parameter">nom_fichier</replaceable>.gz | gunzip | psql <replaceable class="parameter">base_de_donnees</replaceable></programlisting> |
|---|
| 257 |
</para> |
|---|
| 258 |
</formalpara> |
|---|
| 259 |
|
|---|
| 260 |
<formalpara> |
|---|
| 261 |
<title>Couper le fichier avec <command>split</command></title> |
|---|
| 262 |
<para> |
|---|
| 263 |
La commande <command>split</command> permet de découper le fichier en |
|---|
| 264 |
morceaux de taille acceptable par le système de fichiers sous-jacent. |
|---|
| 265 |
Par exemple, pour faire des morceaux de 1 Mo : |
|---|
| 266 |
|
|---|
| 267 |
<programlisting>pg_dump <replaceable class="parameter">base_de_donnees</replaceable> | split -b 1m - <replaceable class="parameter">nom_fichier</replaceable></programlisting> |
|---|
| 268 |
|
|---|
| 269 |
Pour restaurer : |
|---|
| 270 |
|
|---|
| 271 |
<programlisting>cat <replaceable class="parameter">nom_fichier</replaceable>* | psql <replaceable class="parameter">base_de_donnees</replaceable></programlisting> |
|---|
| 272 |
</para> |
|---|
| 273 |
</formalpara> |
|---|
| 274 |
|
|---|
| 275 |
<formalpara> |
|---|
| 276 |
<title>Utilisation du format de sauvegarde personnalisé de |
|---|
| 277 |
<application>pg_dump</application></title> |
|---|
| 278 |
<para> |
|---|
| 279 |
Si <productname>PostgreSQL</productname> est installé sur un système où la |
|---|
| 280 |
bibliothèque de compression <application>zlib</application> est |
|---|
| 281 |
disponible, le format de sauvegarde personnalisé peut être utilisé pour |
|---|
| 282 |
compresser les données à la volée. Pour les bases de données |
|---|
| 283 |
volumineuses, |
|---|
| 284 |
cela produit un fichier de sauvegarde d'une taille comparable à celle |
|---|
| 285 |
du fichier produit par |
|---|
| 286 |
<command>gzip</command>, avec l'avantage supplémentaire de permettre de |
|---|
| 287 |
restaurer des tables sélectivement. La commande qui suit sauvegarde une |
|---|
| 288 |
base de données en utilisant ce format de sauvegarde : |
|---|
| 289 |
|
|---|
| 290 |
<programlisting>pg_dump -Fc <replaceable class="parameter">base_de_donnees</replaceable> > <replaceable class="parameter">nom_fichier</replaceable></programlisting> |
|---|
| 291 |
|
|---|
| 292 |
Le format de sauvegarde personnalisé ne produit pas un script |
|---|
| 293 |
utilisable par |
|---|
| 294 |
<application>psql</application>. Ce script doit être restauré avec |
|---|
| 295 |
<application>pg_restore</application>, par exemple : |
|---|
| 296 |
|
|---|
| 297 |
<programlisting> |
|---|
| 298 |
pg_restore -d <replaceable class="parameter">nom_base</replaceable> <replaceable class="parameter">nom_fichier</replaceable> |
|---|
| 299 |
</programlisting> |
|---|
| 300 |
|
|---|
| 301 |
Voir les pages de référence de |
|---|
| 302 |
<xref linkend="app-pgdump"/> et <xref linkend="app-pgrestore"/> pour plus de |
|---|
| 303 |
détails. |
|---|
| 304 |
</para> |
|---|
| 305 |
</formalpara> |
|---|
| 306 |
|
|---|
| 307 |
<para> |
|---|
| 308 |
Pour les très grosses bases de données, il peut être nécessaire de combiner |
|---|
| 309 |
<command>split</command> avec une des deux autres approches. |
|---|
| 310 |
</para> |
|---|
| 311 |
|
|---|
| 312 |
</sect2> |
|---|
| 313 |
</sect1> |
|---|
| 314 |
|
|---|
| 315 |
<sect1 id="backup-file"> |
|---|
| 316 |
<title>Sauvegarde de niveau système de fichiers</title> |
|---|
| 317 |
|
|---|
| 318 |
<para> |
|---|
| 319 |
Une autre stratégie de sauvegarde consiste à copier les fichiers |
|---|
| 320 |
utilisés par <productname>PostgreSQL</productname> pour le stockage des données. |
|---|
| 321 |
Dans la <xref linkend="creating-cluster"/>, l'emplacement de ces |
|---|
| 322 |
fichiers est précisé mais quiconque s'intéresse à cette méthode les a |
|---|
| 323 |
probablement déjà localisés. N'importe quelle |
|---|
| 324 |
méthode de sauvegarde peut être utilisée, par exemple : |
|---|
| 325 |
|
|---|
| 326 |
<programlisting>tar -cf sauvegarde.tar /usr/local/pgsql/data</programlisting> |
|---|
| 327 |
</para> |
|---|
| 328 |
|
|---|
| 329 |
<para> |
|---|
| 330 |
Cependant, deux restrictions rendent cette méthode peu pratique |
|---|
| 331 |
ou en tout cas inférieure à la méthode <application>pg_dump</application>. |
|---|
| 332 |
|
|---|
| 333 |
<orderedlist> |
|---|
| 334 |
<listitem> |
|---|
| 335 |
<para> |
|---|
| 336 |
Le serveur de base de données <emphasis>doit</emphasis> être arrêté pour obtenir |
|---|
| 337 |
une sauvegarde utilisable. Toutes les demi-mesures, comme la |
|---|
| 338 |
suppression des connexions, ne fonctionnent <emphasis>pas</emphasis> |
|---|
| 339 |
(principalement parce que <command>tar</command> et les outils similaires |
|---|
| 340 |
ne font pas une image atomique de l'état du système de fichiers, |
|---|
| 341 |
mais aussi à cause du tampon interne du serveur). Les informations concernant la façon d'arrêter |
|---|
| 342 |
le serveur <productname>PostgreSQL</productname> se trouvent dans la |
|---|
| 343 |
<xref linkend="server-shutdown"/>. |
|---|
| 344 |
</para> |
|---|
| 345 |
|
|---|
| 346 |
<para> |
|---|
| 347 |
Le serveur doit également être arrêté avant de restaurer les données. |
|---|
| 348 |
</para> |
|---|
| 349 |
</listitem> |
|---|
| 350 |
|
|---|
| 351 |
<listitem> |
|---|
| 352 |
<para> |
|---|
| 353 |
Quiconque s'est aventuré dans les détails de l'organisation de la |
|---|
| 354 |
base de données peut être tenté de ne sauvegarder et |
|---|
| 355 |
restaurer que certaines tables ou bases de données particulières. |
|---|
| 356 |
Cela ne fonctionne <emphasis>pas</emphasis> parce que les informations |
|---|
| 357 |
contenues dans ces fichiers ne représentent que la moitité de la |
|---|
| 358 |
vérité. L'autre moitié est dans les fichiers journaux de validation |
|---|
| 359 |
<filename>pg_clog/*</filename> qui |
|---|
| 360 |
contiennent l'état de la validation de chaque transaction. Un fichier de |
|---|
| 361 |
table n'est utilisable qu'avec cette information. Bien entendu, il est |
|---|
| 362 |
impossible de ne restaurer qu'une table et les données <filename>pg_clog</filename> |
|---|
| 363 |
associées car cela rendrait toutes les autres tables du serveur |
|---|
| 364 |
inutilisables. Les sauvegardes du système de fichiers fonctionnent, |
|---|
| 365 |
de ce fait, uniquement pour les sauvegardes et restaurations complètes d'un cluster |
|---|
| 366 |
de bases de données. |
|---|
| 367 |
</para> |
|---|
| 368 |
</listitem> |
|---|
| 369 |
</orderedlist> |
|---|
| 370 |
</para> |
|---|
| 371 |
|
|---|
| 372 |
<para> |
|---|
| 373 |
Une autre approche à la sauvegarde du système de fichiers consiste à réaliser |
|---|
| 374 |
une <quote>image cohérente</quote> (<foreignphrase>consistent |
|---|
| 375 |
snapshot</foreignphrase>) du répertoire des données. Il faut |
|---|
| 376 |
pour cela que le système |
|---|
| 377 |
de fichiers supporte cette fonctionnalité (et qu'il puisse lui être fait |
|---|
| 378 |
confiance). La procédure typique consiste à réaliser une |
|---|
| 379 |
<quote>image gelée</quote> (<foreignphrase>frozen snapshot</foreignphrase>) |
|---|
| 380 |
du volume contenant la base de données et |
|---|
| 381 |
ensuite de copier entièrement le répertoire de données (pas seulement |
|---|
| 382 |
quelques parties, |
|---|
| 383 |
voir ci-dessus) de l'image sur un périphérique de sauvegarde, puis de |
|---|
| 384 |
libérer l'image gelée. Ceci fonctionne même si le serveur de la base de |
|---|
| 385 |
données est en cours d'exécution. Néanmoins, une telle sauvegarde |
|---|
| 386 |
copie les fichiers de la base de données dans un état où le |
|---|
| 387 |
serveur n'est pas correctement arrêté ; du coup, au lancement du |
|---|
| 388 |
serveur à partir des données sauvegardées, PostgreSQL peut penser que le |
|---|
| 389 |
serveur s'est stoppé brutalement et rejouer les journaux WAL. Ce n'est |
|---|
| 390 |
pas un problème, mais il faut en être conscient (et s'assurer d'inclure les |
|---|
| 391 |
fichiers WAL dans la sauvegarde). |
|---|
| 392 |
</para> |
|---|
| 393 |
|
|---|
| 394 |
<para> |
|---|
| 395 |
Si la base de données est répartie sur plusieurs systèmes de fichiers, |
|---|
| 396 |
il n'est peut-être pas possible d'obtenir des images gelées |
|---|
| 397 |
exactement simultanées de tous les disques. Si les fichiers |
|---|
| 398 |
de données et les journaux WAL sont sur des disques différents, par |
|---|
| 399 |
exemple, ou si les |
|---|
| 400 |
tablespaces sont sur des systèmes de fichiers différents, une |
|---|
| 401 |
sauvegarde par images n'est probablement pas utilisable parce que ces |
|---|
| 402 |
dernières <emphasis>doivent</emphasis> être simultanées. |
|---|
| 403 |
La documentation du système de fichiers doit être étudiée avec attention |
|---|
| 404 |
avant de faire confiance à la technique d'images |
|---|
| 405 |
cohérentes dans de telles situations. L'approche la plus sûre est d'arrêter |
|---|
| 406 |
le serveur de bases de données assez longtemps pour créer toutes les images |
|---|
| 407 |
gelées. |
|---|
| 408 |
</para> |
|---|
| 409 |
|
|---|
| 410 |
<para> |
|---|
| 411 |
Une autre option consiste à utiliser <application>rsync</application> pour réaliser une |
|---|
| 412 |
sauvegarde du système de fichiers. Ceci se fait tout d'abord en lançant |
|---|
| 413 |
<application>rsync</application> alors que le serveur de bases de données est en cours |
|---|
| 414 |
d'exécution, puis en arrêtant le serveur juste assez longtemps pour lancer |
|---|
| 415 |
<application>rsync</application> une deuxième fois. Le deuxième |
|---|
| 416 |
<application>rsync</application> est beaucoup plus rapide que le premier car il a |
|---|
| 417 |
relativement peu de données à transférer et le résultat final est |
|---|
| 418 |
cohérent, le serveur étant arrêté. Cette méthode permet de réaliser une |
|---|
| 419 |
sauvegarde du système de fichiers avec un arrêt minimal. |
|---|
| 420 |
</para> |
|---|
| 421 |
|
|---|
| 422 |
<para> |
|---|
| 423 |
Une sauvegarde des fichiers de données n'est pas forcément |
|---|
| 424 |
moins volumineuse qu'une sauvegarde SQL. Au contraire, elle l'est très |
|---|
| 425 |
certainement plus (<application>pg_dump</application> ne sauvegarde pas le |
|---|
| 426 |
contenu des index, mais la commande pour les recréer). Cependant, une |
|---|
| 427 |
sauvegarde des fichiers de données peut être plus rapide. |
|---|
| 428 |
</para> |
|---|
| 429 |
|
|---|
| 430 |
</sect1> |
|---|
| 431 |
|
|---|
| 432 |
<sect1 id="continuous-archiving"> |
|---|
| 433 |
<title>Archivage continu et récupération d'un instantané (PITR)</title> |
|---|
| 434 |
|
|---|
| 435 |
<indexterm zone="backup"> |
|---|
| 436 |
<primary>archivage en continue</primary> |
|---|
| 437 |
</indexterm> |
|---|
| 438 |
|
|---|
| 439 |
<indexterm zone="backup"> |
|---|
| 440 |
<primary>récupération d'un instantané</primary> |
|---|
| 441 |
</indexterm> |
|---|
| 442 |
|
|---|
| 443 |
<indexterm zone="backup"> |
|---|
| 444 |
<primary>PITR</primary> |
|---|
| 445 |
</indexterm> |
|---|
| 446 |
|
|---|
| 447 |
<para> |
|---|
| 448 |
<productname>PostgreSQL</productname> maintient en permanence des journaux WAL |
|---|
| 449 |
(<firstterm>write ahead log</firstterm>) dans le sous-répertoire |
|---|
| 450 |
<filename>pg_xlog/</filename> du répertoire de données du cluster. Ces journaux |
|---|
| 451 |
décrivent chaque modification effectuée sur les fichiers de données des |
|---|
| 452 |
bases. Ils existent principalement pour se prémunir des suites d'un |
|---|
| 453 |
arrêt brutal : si le système s'arrête brutalement, la base de données |
|---|
| 454 |
peut être restaurée dans un état cohérent en |
|---|
| 455 |
<quote>rejouant</quote> les entrées des journaux enregistrées depuis le dernier |
|---|
| 456 |
point de vérification. Néanmoins, l'existence de ces journaux rend possible |
|---|
| 457 |
l'utilisation d'une troisième stratégie pour la sauvegarde des bases de |
|---|
| 458 |
données : la combinaison d'une sauvegarde de niveau système de |
|---|
| 459 |
fichiers avec la sauvegarde des fichiers WAL. Si la récupération est |
|---|
| 460 |
nécessaire, la sauvegarde est restaurée, puis les fichiers WAL sauvegardés |
|---|
| 461 |
sont rejoués pour amener la sauvegarde jusqu'à la date |
|---|
| 462 |
actuelle. Cette approche est plus complexe à administrer que toutes les |
|---|
| 463 |
autres approches mais elle apporte des bénéfices significatifs : |
|---|
| 464 |
<itemizedlist> |
|---|
| 465 |
<listitem> |
|---|
| 466 |
<para> |
|---|
| 467 |
Il n'est pas nécessaire de disposer d'une sauvegarde parfaitement cohérente |
|---|
| 468 |
comme point de départ. Toute incohérence dans la sauvegarde est corrigée |
|---|
| 469 |
par la ré-exécution des journaux (ceci n'est pas significativement |
|---|
| 470 |
différent de ce qu'il se passe lors d'une récupération après un arrêt |
|---|
| 471 |
brutal). La fonctionnalité d'image du système de fichiers n'est alors |
|---|
| 472 |
pas nécessaire, <application>tar</application> ou tout |
|---|
| 473 |
autre outil d'archivage est suffisant. |
|---|
| 474 |
</para> |
|---|
| 475 |
</listitem> |
|---|
| 476 |
<listitem> |
|---|
| 477 |
<para> |
|---|
| 478 |
Puisqu'une longue séquence de fichiers WAL peut être assemblée pour |
|---|
| 479 |
être rejouée, une sauvegarde continue est obtenue en continuant |
|---|
| 480 |
simplement à archiver les fichiers WAL. C'est particulièrement |
|---|
| 481 |
intéressant pour les grosses bases de données dont une sauvegarde |
|---|
| 482 |
complète fréquente est difficilement réalisable. |
|---|
| 483 |
</para> |
|---|
| 484 |
</listitem> |
|---|
| 485 |
<listitem> |
|---|
| 486 |
<para> |
|---|
| 487 |
Les entrées WAL ne doivent pas obligatoirement être rejouées |
|---|
| 488 |
intégralement. La ré-exécution peut être stoppée en tout point, tout en |
|---|
| 489 |
garantissant une image cohérente de la base de données telle qu'elle |
|---|
| 490 |
était à ce moment-là. Ainsi, cette technique autorise la |
|---|
| 491 |
<firstterm>récupération d'un instantané</firstterm> (PITR) : il est |
|---|
| 492 |
possible de restaurer l'état de la base de données telle qu'elle était |
|---|
| 493 |
en tout point dans le temps depuis la dernière sauvegarde de base. |
|---|
| 494 |
</para> |
|---|
| 495 |
</listitem> |
|---|
| 496 |
<listitem> |
|---|
| 497 |
<para> |
|---|
| 498 |
Si la série de fichiers WAL est fournie en continu à une autre |
|---|
| 499 |
machine chargée avec le même fichier de sauvegarde de base, |
|---|
| 500 |
on obtient un système <quote>de reprise intermédiaire</quote> |
|---|
| 501 |
(<foreignphrase>warm standby</foreignphrase>) : à tout |
|---|
| 502 |
moment, la deuxième machine peut être montée et disposer d'une copie |
|---|
| 503 |
quasi-complète de la base de données. |
|---|
| 504 |
</para> |
|---|
| 505 |
</listitem> |
|---|
| 506 |
</itemizedlist> |
|---|
| 507 |
</para> |
|---|
| 508 |
|
|---|
| 509 |
<para> |
|---|
| 510 |
Tout comme la technique de sauvegarde standard du système de fichiers, |
|---|
| 511 |
cette méthode ne supporte que la restauration d'un cluster de bases de données |
|---|
| 512 |
complet, pas d'un sous-ensemble. De plus, un espace d'archivage important |
|---|
| 513 |
est requis : la sauvegarde de la base peut être volumineuse et un |
|---|
| 514 |
système très utilisé engendre un trafic WAL à archiver de plusieurs Mo. |
|---|
| 515 |
Malgré tout, c'est la technique de sauvegarde préférée dans de nombreuses |
|---|
| 516 |
situations où une haute fiabilité est requise. |
|---|
| 517 |
</para> |
|---|
| 518 |
|
|---|
| 519 |
<para> |
|---|
| 520 |
Une récupération fructueuse à partir de l'archivage continu |
|---|
| 521 |
(aussi appelé <quote>sauvegarde à chaud</quote> par certains vendeurs de SGBD) nécessite |
|---|
| 522 |
une séquence ininterrompue de fichiers WAL archivés qui |
|---|
| 523 |
s'étend au moins jusqu'au point de départ de la sauvegarde. Pour |
|---|
| 524 |
commencer, il faut configurer et tester la procédure d'archivage |
|---|
| 525 |
des journaux WAL <emphasis>avant</emphasis> d'effectuer la première sauvegarde de |
|---|
| 526 |
base. C'est pourquoi la suite du document commence par présenter les mécanismes |
|---|
| 527 |
d'archivage des fichiers WAL. |
|---|
| 528 |
</para> |
|---|
| 529 |
|
|---|
| 530 |
<sect2 id="backup-archiving-wal"> |
|---|
| 531 |
<title>Configurer l'archivage WAL</title> |
|---|
| 532 |
|
|---|
| 533 |
<para> |
|---|
| 534 |
Au sens abstrait, un système <productname>PostgreSQL</productname> fonctionnel |
|---|
| 535 |
produit une séquence infinie d'enregistrements WAL. Le système |
|---|
| 536 |
divise physiquement cette séquence en <firstterm>fichiers de segment</firstterm> |
|---|
| 537 |
WAL de 16 Mo chacun (en général, mais cette taille peut |
|---|
| 538 |
être modifiée lors de la construction de <productname>PostgreSQL</productname>). Les |
|---|
| 539 |
fichiers segment reçoivent des noms numériques pour refléter leur |
|---|
| 540 |
position dans la séquence abstraite des WAL. Lorsque le système n'utilise |
|---|
| 541 |
pas l'archivage des WAL, il ne crée que quelques fichiers segment, |
|---|
| 542 |
qu'il <quote>recycle</quote> en renommant les fichiers devenus inutiles. |
|---|
| 543 |
Un fichier segment dont le contenu précède le |
|---|
| 544 |
dernier point de vérification est supposé inutile et peut être recyclé. |
|---|
| 545 |
</para> |
|---|
| 546 |
|
|---|
| 547 |
<para> |
|---|
| 548 |
Lors de l'archivage des données WAL, le contenu de |
|---|
| 549 |
chaque fichier de segment doit être capturé dès qu'il est rempli pour |
|---|
| 550 |
sauvegarder les données ailleurs avant son recyclage. |
|---|
| 551 |
En fonction de l'application et du matériel disponible, |
|---|
| 552 |
<quote>sauvegarder les données ailleurs</quote> peut se faire de plusieurs |
|---|
| 553 |
façons : les fichiers segment peuvent être copiés dans un répertoire |
|---|
| 554 |
NFS monté sur une autre machine, être écrits sur une cartouche (après |
|---|
| 555 |
s'être assuré qu'il existe un moyen d'identifier le nom d'origine de chaque |
|---|
| 556 |
fichier) ou être groupés pour gravage sur un CD, ou toute autre chose. |
|---|
| 557 |
Pour fournir autant de flexibilité que possible à l'administrateur de la |
|---|
| 558 |
base de données, <productname>PostgreSQL</productname> essaie de ne faire aucune |
|---|
| 559 |
supposition sur la façon dont l'archivage est réalisé. À la place, |
|---|
| 560 |
<productname>PostgreSQL</productname> permet de préciser la commande |
|---|
| 561 |
shell à exécuter pour copier le fichier de segment complet à l'endroit |
|---|
| 562 |
désiré. La commande peut être aussi simple qu'un |
|---|
| 563 |
<literal>cp</literal> ou impliquer un shell complexe — |
|---|
| 564 |
c'est l'utilisateur qui décide. |
|---|
| 565 |
</para> |
|---|
| 566 |
|
|---|
| 567 |
<para> |
|---|
| 568 |
Pour activer l'archivage des journaux de transaction, on positionne le |
|---|
| 569 |
paramètre <xref linkend="guc-archive-mode"/> à <literal>on</literal>, |
|---|
| 570 |
et on précise la commande shell à utiliser dans le paramètre |
|---|
| 571 |
<xref linkend="guc-archive-command"/> de la configuration. En fait, ces |
|---|
| 572 |
paramètres seront toujours placés dans le fichier |
|---|
| 573 |
<filename>postgresql.conf</filename>. Dans cette chaîne, un |
|---|
| 574 |
<literal>%p</literal> est remplacé par le chemin absolu de |
|---|
| 575 |
l'archive alors qu'un <literal>%f</literal> n'est remplacé que par le |
|---|
| 576 |
nom du fichier. (Le nom du chemin est relatif au répertoire de travail du |
|---|
| 577 |
serveur, c'est-à-dire le répertoire des données du cluster.) |
|---|
| 578 |
<literal>%%</literal> est utilisé pour écrire le |
|---|
| 579 |
caractère <literal>%</literal> dans la commande. La commande la plus |
|---|
| 580 |
simple ressemble à : |
|---|
| 581 |
<programlisting>archive_command = 'cp -i %p /mnt/serveur/repertoire_archive/%f </dev/null'</programlisting> |
|---|
| 582 |
qui copie les segments WAL archivables dans le répertoire |
|---|
| 583 |
<filename>/mnt/serveur/repertoire_archive</filename>. (Ceci est un exemple, pas |
|---|
| 584 |
une recommandation, et peut ne pas fonctionner sur toutes les |
|---|
| 585 |
plateformes.) Après le remplacement des paramètres <literal>%p</literal> |
|---|
| 586 |
et <literal>%f</literal>, la commande réellement exécutée peut ressembler |
|---|
| 587 |
à : |
|---|
| 588 |
<programlisting>cp -i pg_xlog/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065 </dev/null |
|---|
| 589 |
</programlisting> |
|---|
| 590 |
Une commande similaire est produite pour chaque nouveau fichier à archiver. |
|---|
| 591 |
</para> |
|---|
| 592 |
|
|---|
| 593 |
<para> |
|---|
| 594 |
La commande d'archivage est exécutée sous l'identité de l'utilisateur |
|---|
| 595 |
propriétaire du serveur <productname>PostgreSQL</productname>. La série de |
|---|
| 596 |
fichiers WAL en cours d'archivage contient absolument tout ce qui se |
|---|
| 597 |
trouve dans la base de données, il convient donc de s'assurer que les |
|---|
| 598 |
données archivées sont protégées des autres utilisateurs ; on peut, |
|---|
| 599 |
par exemple, archiver dans un répertoire sur lequel les droits de lecture |
|---|
| 600 |
ne sont positionnés ni pour le groupe ni pour le reste du monde. |
|---|
| 601 |
</para> |
|---|
| 602 |
|
|---|
| 603 |
<para> |
|---|
| 604 |
Il est important que la commande d'archivage ne renvoie le code de sortie |
|---|
| 605 |
zéro que si, et seulement si, l'exécution a réussi. En obtenant un résultat |
|---|
| 606 |
zéro, <productname>PostgreSQL</productname> suppose que le fichier segment WAL a |
|---|
| 607 |
été archivé avec succès et qu'il peut le supprimer ou le recycler. |
|---|
| 608 |
Un statut différent de zéro indique à |
|---|
| 609 |
<productname>PostgreSQL</productname> que le fichier n'a pas été archivé ; il |
|---|
| 610 |
essaie alors périodiquement jusqu'à la réussite de l'archivage. |
|---|
| 611 |
</para> |
|---|
| 612 |
|
|---|
| 613 |
<para> |
|---|
| 614 |
La commande d'archivage doit en général être conçue pour refuser |
|---|
| 615 |
d'écraser tout fichier archive qui existe déjà. C'est une fonctionnalité |
|---|
| 616 |
de sécurité importante pour préserver l'intégrité de l'archive dans le |
|---|
| 617 |
cas d'une erreur de l'administrateur (comme l'envoi de la sortie de deux |
|---|
| 618 |
serveurs différents dans le même répertoire d'archivage). Il est |
|---|
| 619 |
conseillé de tester la commande d'archivage proposée pour |
|---|
| 620 |
s'assurer qu'en effet elle n'écrase pas un fichier existant <emphasis>et |
|---|
| 621 |
qu'elle retourne un statut différent de zéro dans ce cas</emphasis>. |
|---|
| 622 |
Il a été découvert |
|---|
| 623 |
que <literal>cp -i</literal> travaille correctement sur certaines plateformes, |
|---|
| 624 |
mais pas sur toutes. Si la commande choisie ne gère pas elle-même ce |
|---|
| 625 |
cas, il convient d'ajouter une commande pour tester l'existence du fichier |
|---|
| 626 |
d'archivage. Par exemple, quelque chose comme : |
|---|
| 627 |
<programlisting>archive_command = 'test ! -f .../%f && cp %p .../%f'</programlisting> |
|---|
| 628 |
fonctionne correctement sur la plupart des variantes Unix. |
|---|
| 629 |
</para> |
|---|
| 630 |
|
|---|
| 631 |
<para> |
|---|
| 632 |
Lors de la conception de la configuration d'archivage, il faut |
|---|
| 633 |
considérer ce qui arrive si la commande d'archivage échoue de façon |
|---|
| 634 |
répétée, parce |
|---|
| 635 |
que certains aspects demandent une intervention de l'opérateur ou |
|---|
| 636 |
par manque d'espace dans le répertoire d'archivage. |
|---|
| 637 |
Ceci peut arriver, par exemple, lors de l'écriture sur une cartouche sans changeur |
|---|
| 638 |
automatique ; quand la cartouche est pleine, rien ne peut être |
|---|
| 639 |
archivé tant que la cassette n'est pas changée. |
|---|
| 640 |
Toute erreur ou requête à un opérateur humain doit être rapportée de façon |
|---|
| 641 |
appropriée pour que la situation puisse être résolue |
|---|
| 642 |
rapidement. Le répertoire <filename>pg_xlog/</filename> continue à se remplir |
|---|
| 643 |
de fichiers de segment WAL jusqu'à la résolution de la situation. |
|---|
| 644 |
(Si le système de fichiers contenant <filename>pg_xlog/</filename> se |
|---|
| 645 |
remplit, <productname>PostgreSQL</productname> s'arrête en mode PANIC. |
|---|
| 646 |
Aucune transaction antérieure n'est perdue mais la base de données est |
|---|
| 647 |
indisponible le temps pour l'utilisateur de retrouver de l'espace.) |
|---|
| 648 |
</para> |
|---|
| 649 |
|
|---|
| 650 |
<para> |
|---|
| 651 |
La vitesse de la commande d'archivage n'est pas importante, tant qu'elle |
|---|
| 652 |
suit le rythme que la génération de données WAL du serveur. Les |
|---|
| 653 |
opérations normales continuent même si le processus d'archivage est un peu |
|---|
| 654 |
plus lent. Si l'archivage est significativement plus lent, alors la |
|---|
| 655 |
quantité de données qui peut être perdue croît. Cela signifie |
|---|
| 656 |
aussi que le répertoire <filename>pg_xlog/</filename> contient un grand nombre |
|---|
| 657 |
de fichiers segment non archivés, qui peuvent finir par |
|---|
| 658 |
dépasser l'espace disque disponible. Il est conseillé de surveiller |
|---|
| 659 |
le processus d'archivage pour s'assurer que tout fonctionne |
|---|
| 660 |
normalement. |
|---|
| 661 |
</para> |
|---|
| 662 |
|
|---|
| 663 |
<para> |
|---|
| 664 |
Lors de l'écriture de la commande d'archivage, il faut garder à l'esprit que les |
|---|
| 665 |
noms de fichier à archiver peuvent contenir jusqu'à 64 caractères et |
|---|
| 666 |
être composés de toute combinaison de lettres ASCII, de chiffres et de points. |
|---|
| 667 |
Il n'est pas nécessaire de retenir le chemin relatif original |
|---|
| 668 |
(<literal>%p</literal>) mais il est nécessaire de rappeler le nom du fichier |
|---|
| 669 |
(<literal>%f</literal>). |
|---|
| 670 |
</para> |
|---|
| 671 |
|
|---|
| 672 |
<para> |
|---|
| 673 |
Bien que l'archivage WAL autorise à restaurer toute |
|---|
| 674 |
modification réalisée sur les données de la base |
|---|
| 675 |
<productname>PostgreSQL</productname>, il ne restaure pas les modifications |
|---|
| 676 |
effectuées sur les fichiers de configuration (c'est-à-dire |
|---|
| 677 |
<filename>postgresql.conf</filename>, <filename>pg_hba.conf</filename> et |
|---|
| 678 |
<filename>pg_ident.conf</filename>) car ceux-ci sont édités manuellement |
|---|
| 679 |
et non au travers d'opérations SQL. Il est souhaitable de conserver les |
|---|
| 680 |
fichiers de configuration à un endroit où ils sont sauvegardés par les |
|---|
| 681 |
procédures standard de sauvegarde du système de fichiers. Voir la |
|---|
| 682 |
<xref linkend="runtime-config-file-locations"/> pour savoir comment |
|---|
| 683 |
modifier l'emplacement des fichiers de configuration. |
|---|
| 684 |
</para> |
|---|
| 685 |
|
|---|
| 686 |
<para> |
|---|
| 687 |
La commande d'archivage n'est appelée que sur les segments WAL complets. |
|---|
| 688 |
Du coup, si le serveur engendre peu de trafic WAL (ou qu'il y a des périodes |
|---|
| 689 |
de calme où le trafic WAL est léger), il peut y avoir une longue période |
|---|
| 690 |
entre la fin d'une transaction et son enregistrement sûr dans le stockage |
|---|
| 691 |
d'archive. Pour placer une limite sur l'ancienneté des données archivées, |
|---|
| 692 |
on configure <xref linkend="guc-archive-timeout"/> qui force le |
|---|
| 693 |
serveur à changer de fichier segment WAL passé ce délai. Les |
|---|
| 694 |
fichiers archivés lors d'un tel forçage ont toujours |
|---|
| 695 |
la même taille que les fichiers complets. Il est donc déconseillé de configurer |
|---|
| 696 |
un délai <varname>archive_timeout</varname> trop court — cela fait |
|---|
| 697 |
grossir anormalement le stockage. Une minute pour <varname>archive_timeout</varname> |
|---|
| 698 |
est généralement raisonnable. |
|---|
| 699 |
</para> |
|---|
| 700 |
|
|---|
| 701 |
<para> |
|---|
| 702 |
De plus, le changement d'un segment peut être forcé manuellement avec |
|---|
| 703 |
<function>pg_switch_xlog</function>. Cela permet de s'assurer qu'une |
|---|
| 704 |
transaction tout juste terminée est archivée aussi vite que possible. |
|---|
| 705 |
D'autres fonctions utilitaires relatives à la gestion des WAL sont |
|---|
| 706 |
disponibles dans <xref linkend="functions-admin-backup-table"/>. |
|---|
| 707 |
</para> |
|---|
| 708 |
|
|---|
| 709 |
<para> |
|---|
| 710 |
Quand <varname>archive_mode</varname> est désactivé |
|---|
| 711 |
(<literal>off</literal>), certaines commandes SQL sont optimisées pour |
|---|
| 712 |
éviter la journalisation des transactions, de la façon décrite dans |
|---|
| 713 |
<xref linkend="populate-pitr"/>. Si l'archivage est activé lors de |
|---|
| 714 |
l'exécution d'une de ces instructions, les journaux de transaction ne |
|---|
| 715 |
contiennent pas d'informations suffisantes pour une récupération via les |
|---|
| 716 |
archives mais la récupération après un arrêt brutal n'est pas affectée. |
|---|
| 717 |
Pour cette raison, <varname>archive_mode</varname> ne peut être |
|---|
| 718 |
modifié qu'au lancement du serveur. Néanmoins, |
|---|
| 719 |
<varname>archive_command</varname> peut être modifié avec un |
|---|
| 720 |
rechargement du fichier de configuration. Pour arrêter |
|---|
| 721 |
temporairement l'archivage, on peut placer une |
|---|
| 722 |
chaîne vide (<literal>''</literal>) pour |
|---|
| 723 |
<varname>archive_command</varname>. Les journaux de transaction sont alors |
|---|
| 724 |
accumulés dans <filename>pg_xlog/</filename> jusqu'au rétablissement |
|---|
| 725 |
d'un paramètre <varname>archive_command</varname> fonctionnel. |
|---|
| 726 |
</para> |
|---|
| 727 |
</sect2> |
|---|
| 728 |
|
|---|
| 729 |
<sect2 id="backup-base-backup"> |
|---|
| 730 |
<title>Réaliser une sauvegarde de base</title> |
|---|
| 731 |
|
|---|
| 732 |
<para> |
|---|
| 733 |
La procédure pour réaliser une sauvegarde de base est relativement |
|---|
| 734 |
simple : |
|---|
| 735 |
<orderedlist> |
|---|
| 736 |
<listitem> |
|---|
| 737 |
<para> |
|---|
| 738 |
S'assurer que l'archivage WAL est activé et fonctionnel. |
|---|
| 739 |
</para> |
|---|
| 740 |
</listitem> |
|---|
| 741 |
<listitem> |
|---|
| 742 |
<para> |
|---|
| 743 |
Se connecter à la base de données en tant que superutilisateur et |
|---|
| 744 |
lancer la commande : |
|---|
| 745 |
<programlisting>SELECT pg_start_backup('label');</programlisting> |
|---|
| 746 |
où <literal>label</literal> est une chaîne utilisée pour |
|---|
| 747 |
identifier de façon unique l'opération de sauvegarde (une bonne pratique |
|---|
| 748 |
est d'utiliser le chemin complet du |
|---|
| 749 |
fichier de sauvegarde). <function>pg_start_backup</function> crée un fichier |
|---|
| 750 |
<firstterm>de label de sauvegarde</firstterm> nommé |
|---|
| 751 |
<filename>backup_label</filename> dans |
|---|
| 752 |
le répertoire du cluster. Ce fichier contient les informations de la sauvegarde. |
|---|
| 753 |
</para> |
|---|
| 754 |
|
|---|
| 755 |
<para> |
|---|
| 756 |
La base de données de connexion utilisée pour lancer |
|---|
| 757 |
cette commande n'a aucune importance. Le résultat de la fonction peut |
|---|
| 758 |
être ignoré, mais il faut gérer l'erreur éventuelle avant |
|---|
| 759 |
de continuer. |
|---|
| 760 |
</para> |
|---|
| 761 |
|
|---|
| 762 |
<para> |
|---|
| 763 |
<function>pg_start_backup</function> peut prendre beaucoup de temps |
|---|
| 764 |
pour arriver à son terme. Ceci est dû au fait qu'il réalise un |
|---|
| 765 |
point de retournement, et que les entrées/sorties pour l'établissement |
|---|
| 766 |
de ce point de retournement seront réparties sur une grande période |
|---|
| 767 |
de temps, par défaut la moitié de l'intervalle d'un point de |
|---|
| 768 |
retournement (voir le paramètre de configuration |
|---|
| 769 |
<xref linkend="guc-checkpoint-completion-target"/>). Habituellement, |
|---|
| 770 |
ce comportement est appréciable car il minimise l'impact du traitement |
|---|
| 771 |
des requêtes. Pour commencer la sauvegarde aussi rapidement |
|---|
| 772 |
que possible, on exécute la commande <command>CHECKPOINT</command> (qui |
|---|
| 773 |
déclenche un point de vérification dès que possible), puis |
|---|
| 774 |
on exécute immédiatement <function>pg_start_backup</function>. Le point |
|---|
| 775 |
de vérification de <function>pg_start_backup</function> n'a alors plus |
|---|
| 776 |
grand chose à faire, et s'exécute donc rapidement. |
|---|
| 777 |
</para> |
|---|
| 778 |
</listitem> |
|---|
| 779 |
<listitem> |
|---|
| 780 |
<para> |
|---|
| 781 |
Effectuer la sauvegarde à l'aide de tout outil de sauvegarde du |
|---|
| 782 |
système de fichiers, tel <application>tar</application> ou |
|---|
| 783 |
<application>cpio</application>. Il |
|---|
| 784 |
n'est ni nécessaire ni désirable de stopper les opérations normales de |
|---|
| 785 |
la base de données pour cela. |
|---|
| 786 |
</para> |
|---|
| 787 |
</listitem> |
|---|
| 788 |
<listitem> |
|---|
| 789 |
<para> |
|---|
| 790 |
Se connecter à nouveau à la base de données en tant que |
|---|
| 791 |
superutilisateur et lancer la commande : |
|---|
| 792 |
<programlisting>SELECT pg_stop_backup();</programlisting> |
|---|
| 793 |
Cela met fin au processus de sauvegarde et réalise un basculement |
|---|
| 794 |
automatique vers le prochain segment WAL. Ce basculement est nécessaire |
|---|
| 795 |
pour permettre au dernier fichier de segment WAL écrit pendant la |
|---|
| 796 |
sauvegarde d'être immédiatement archivable. |
|---|
| 797 |
</para> |
|---|
| 798 |
</listitem> |
|---|
| 799 |
<listitem> |
|---|
| 800 |
<para> |
|---|
| 801 |
Une fois que les fichiers des segments WAL utilisés lors de la sauvegarde |
|---|
| 802 |
sont archivés, c'est terminé. Le fichier identifié par le résultat de |
|---|
| 803 |
<function>pg_stop_backup</function> est le dernier segment à archiver pour |
|---|
| 804 |
terminer la sauvegarde. L'archivage de ces fichiers intervient automatiquement |
|---|
| 805 |
car <varname>archive_command</varname> est déjà configuré. Dans de |
|---|
| 806 |
nombreux cas, c'est assez rapide mais il est conseillé de |
|---|
| 807 |
surveiller le système d'archivage pour s'assurer que celui-ci s'effectue |
|---|
| 808 |
correctement et que la sauvegarde est complète. |
|---|
| 809 |
</para> |
|---|
| 810 |
</listitem> |
|---|
| 811 |
</orderedlist> |
|---|
| 812 |
</para> |
|---|
| 813 |
|
|---|
| 814 |
<para> |
|---|
| 815 |
Certains outils de sauvegarde émettent des |
|---|
| 816 |
messages d'avertissements ou d'erreurs si les fichiers qu'ils essaient de |
|---|
| 817 |
copier sont modifiés au cours de la copie. Cette situation, normale lors |
|---|
| 818 |
de la sauvegarde d'une base active, ne doit pas être considérée comme |
|---|
| 819 |
une erreur ; il suffit de s'assurer que ces messages peuvent être |
|---|
| 820 |
distingués des autres messages. Certaines versions de |
|---|
| 821 |
<application>rsync</application>, par exemple, renvoient un code de sortie |
|---|
| 822 |
distinct en cas de <quote>disparition de fichiers source</quote>. Il est |
|---|
| 823 |
possible d'écrire un script qui considère ce code de sortie comme normal. |
|---|
| 824 |
</para> |
|---|
| 825 |
|
|---|
| 826 |
<para> |
|---|
| 827 |
De plus, certaines versions de GNU <application>tar</application> |
|---|
| 828 |
retournent un code d'erreur qu'on peut confondre avec une erreur fatale si |
|---|
| 829 |
le fichier a été tronqué pendant sa copie par |
|---|
| 830 |
<application>tar</application>. Heureusement, les versions 1.16 et |
|---|
| 831 |
suivantes de GNU <application>tar</application> retournent |
|---|
| 832 |
<literal>1</literal> si le fichier a été modifié pendant la sauvegarde et |
|---|
| 833 |
<literal>2</literal> pour les autres erreurs. |
|---|
| 834 |
</para> |
|---|
| 835 |
|
|---|
| 836 |
<para> |
|---|
| 837 |
Il n'est pas utile d'accorder de l'importance au temps passé entre |
|---|
| 838 |
<function>pg_start_backup</function> et le début réel de la sauvegarde, pas |
|---|
| 839 |
plus qu'entre la fin de la sauvegarde et |
|---|
| 840 |
<function>pg_stop_backup</function> ; un délai de quelques minutes ne |
|---|
| 841 |
pose pas de problème. (Néanmoins, si le serveur est normalement utilisé |
|---|
| 842 |
alors que <varname>full_page_writes</varname> est désactivé, une perte de |
|---|
| 843 |
performances entre <function>pg_start_backup</function> et |
|---|
| 844 |
<function>pg_stop_backup</function> peut être constatée car l'activation du |
|---|
| 845 |
paramètre <varname>full_page_writes</varname> est forcée lors du mode de |
|---|
| 846 |
sauvegarde.) Il convient toutefois de s'assurer que ces étapes sont |
|---|
| 847 |
effectuées séquentiellement, sans chevauchement. Dans le cas contraire, la |
|---|
| 848 |
sauvegarde est invalidée. |
|---|
| 849 |
</para> |
|---|
| 850 |
|
|---|
| 851 |
<para> |
|---|
| 852 |
La sauvegarde doit inclure tous les fichiers du répertoire |
|---|
| 853 |
du groupe de bases de données |
|---|
| 854 |
(<filename>/usr/local/pgsql/data</filename>, par exemple). Si des |
|---|
| 855 |
<foreignphrase>tablespace</foreignphrase> |
|---|
| 856 |
qui ne se trouvent pas dans ce répertoire sont utilisés, il ne faut pas |
|---|
| 857 |
oublier de les inclure (et s'assurer également que la sauvegarde archive les liens |
|---|
| 858 |
symboliques comme des liens, sans quoi la restauration des |
|---|
| 859 |
<foreignphrase>tablespace</foreignphrase> sera problématique). |
|---|
| 860 |
</para> |
|---|
| 861 |
|
|---|
| 862 |
<para> |
|---|
| 863 |
Néanmoins, les fichiers du sous-répertoire |
|---|
| 864 |
<filename>pg_xlog/</filename>, |
|---|
| 865 |
contenu dans le répertoire du cluster, peuvent être omis. Cette petite |
|---|
| 866 |
complication permet de réduire le risque d'erreurs lors de la restauration. |
|---|
| 867 |
C'est facile à réaliser si <filename>pg_xlog/</filename> est un lien |
|---|
| 868 |
symbolique vers quelque endroit extérieur au répertoire du cluster, |
|---|
| 869 |
ce qui est toutefois une configuration courante, pour des raisons de performance. |
|---|
| 870 |
</para> |
|---|
| 871 |
|
|---|
| 872 |
<para> |
|---|
| 873 |
La sauvegarde n'est utilisable que si les fichiers de segment WAL |
|---|
| 874 |
engendrés pendant ou après cette sauvegarde sont préservés. |
|---|
| 875 |
Pour faciliter cela, la fonction |
|---|
| 876 |
<function>pg_stop_backup</function> crée un <firstterm>fichier d'historique de la |
|---|
| 877 |
sauvegarde</firstterm> immédiatement stocké dans la zone d'archivage des WAL. |
|---|
| 878 |
Ce fichier est nommé d'après le nom du premier fichier segment WAL |
|---|
| 879 |
nécessaire à l'utilisation de la sauvegarde. Ainsi, si le fichier |
|---|
| 880 |
WAL de démarrage est <literal>0000000100001234000055CD</literal>, le nom |
|---|
| 881 |
du fichier d'historique ressemble à |
|---|
| 882 |
<literal>0000000100001234000055CD.007C9330.backup</literal> (le deuxième nombre |
|---|
| 883 |
dans le nom de ce fichier contient la position exacte à l'intérieur du fichier |
|---|
| 884 |
WAL et peut en général être ignoré). Une fois que la sauvegarde du |
|---|
| 885 |
système de fichiers et des segments WAL utilisés |
|---|
| 886 |
pendant celle-ci (comme précisé dans le fichier d'historique des sauvegardes) |
|---|
| 887 |
est archivée de façon sûre, |
|---|
| 888 |
tous les segments WAL archivés de noms numériquement plus |
|---|
| 889 |
petits ne sont plus nécessaires à la récupération de la sauvegarde du |
|---|
| 890 |
système de fichiers et peuvent être supprimés. Toutefois, il est |
|---|
| 891 |
préférable de conserver plusieurs jeux de sauvegarde pour être absolument |
|---|
| 892 |
certain de pouvoir récupérer les données. |
|---|
| 893 |
</para> |
|---|
| 894 |
|
|---|
| 895 |
<para> |
|---|
| 896 |
Le fichier d'historique de la sauvegarde est un simple fichier texte. Il |
|---|
| 897 |
contient le label passé à <function>pg_start_backup</function>, |
|---|
| 898 |
l'heure et les segments WAL de début et de fin de la sauvegarde. |
|---|
| 899 |
Si le label est utilisé pour identifier l'endroit où le fichier de sauvegarde associé |
|---|
| 900 |
est conservé, alors le fichier d'historique archivé est suffisant pour |
|---|
| 901 |
savoir quel fichier de sauvegarde restaurer, en cas de besoin. |
|---|
| 902 |
</para> |
|---|
| 903 |
|
|---|
| 904 |
<para> |
|---|
| 905 |
Puisqu'il faut conserver tous les fichiers WAL archivés depuis la |
|---|
| 906 |
dernière sauvegarde de base, l'intervalle entre les sauvegardes de base |
|---|
| 907 |
est habituellement choisi en fonction de l'espace de stockage qu'on |
|---|
| 908 |
accepte de consommer en fichiers d'archives WAL. Il faut également |
|---|
| 909 |
considérer le temps à dépenser pour la |
|---|
| 910 |
récupération, si celle-ci s'avère nécessaire — le système doit rejouer |
|---|
| 911 |
tous les segments WAL et ceci peut prendre beaucoup de temps si la |
|---|
| 912 |
dernière sauvegarde de base est ancienne. |
|---|
| 913 |
</para> |
|---|
| 914 |
|
|---|
| 915 |
<para> |
|---|
| 916 |
La fonction |
|---|
| 917 |
<function>pg_start_backup</function> crée un fichier nommé |
|---|
| 918 |
<filename>backup_label</filename> dans le répertoire du cluster de bases |
|---|
| 919 |
de données. Ce fichier est ensuite supprimé par |
|---|
| 920 |
<function>pg_stop_backup</function>. Ce fichier est bien sûr archivé |
|---|
| 921 |
comme faisant parti du fichier de |
|---|
| 922 |
sauvegarde. Le fichier de label de la sauvegarde inclut la chaîne de label |
|---|
| 923 |
passée à <function>pg_start_backup</function>, l'heure à |
|---|
| 924 |
laquelle <function>pg_start_backup</function> a été exécuté et le nom du fichier |
|---|
| 925 |
WAL initial. En cas de confusion, il est ainsi possible de regarder |
|---|
| 926 |
dans le fichier sauvegarde et de déterminer avec précision de quelle session |
|---|
| 927 |
de sauvegarde provient ce fichier. |
|---|
| 928 |
</para> |
|---|
| 929 |
|
|---|
| 930 |
<para> |
|---|
| 931 |
Il est aussi possible de faire une sauvegarde alors que le serveur est |
|---|
| 932 |
arrêté. Dans ce cas, <function>pg_start_backup</function> et |
|---|
| 933 |
<function>pg_stop_backup</function> ne peuvent évidemment pas être |
|---|
| 934 |
utilisés. L'utilisateur doit alors se débrouiller pour identifier les |
|---|
| 935 |
fichiers de sauvegarde et déterminer jusqu'où remonter avec les fichiers |
|---|
| 936 |
WAL associés. Il est généralement préférable de |
|---|
| 937 |
suivre la procédure d'archivage en ligne décrite ci-dessus. |
|---|
| 938 |
</para> |
|---|
| 939 |
</sect2> |
|---|
| 940 |
|
|---|
| 941 |
<sect2 id="backup-pitr-recovery"> |
|---|
| 942 |
<title>Récupération d'une sauvegarde en ligne</title> |
|---|
| 943 |
|
|---|
| 944 |
<para> |
|---|
| 945 |
Le pire est arrivé et il faut maintenant repartir d'une sauvegarde. |
|---|
| 946 |
Voici la procédure : |
|---|
| 947 |
<orderedlist> |
|---|
| 948 |
<listitem> |
|---|
| 949 |
<para> |
|---|
| 950 |
Arrêter le serveur s'il est en cours d'exécution. |
|---|
| 951 |
</para> |
|---|
| 952 |
</listitem> |
|---|
| 953 |
<listitem> |
|---|
| 954 |
<para> |
|---|
| 955 |
Si la place nécessaire est disponible, copier le répertoire complet de |
|---|
| 956 |
données du cluster et tous les <foreignphrase>tablespaces</foreignphrase> |
|---|
| 957 |
dans un emplacement temporaire en prévision d'un éventuel besoin |
|---|
| 958 |
ultérieur. Cette précaution nécessite qu'un espace suffisant sur le |
|---|
| 959 |
système soit disponible pour contenir deux copies de la base de données |
|---|
| 960 |
existante. S'il n'y a pas assez de place disponible, il faut au minimum |
|---|
| 961 |
copier le contenu du sous-répertoire <filename>pg_xlog</filename> du |
|---|
| 962 |
répertoire des données du cluster car il peut contenir des journaux |
|---|
| 963 |
qui n'ont pas été archivés avant l'arrêt du serveur. |
|---|
| 964 |
</para> |
|---|
| 965 |
</listitem> |
|---|
| 966 |
<listitem> |
|---|
| 967 |
<para> |
|---|
| 968 |
Effacer tous les fichiers et sous-répertoires existant sous le |
|---|
| 969 |
répertoire des données du cluster et sous les répertoires racines des |
|---|
| 970 |
<foreignphrase>tablespaces</foreignphrase>. |
|---|
| 971 |
</para> |
|---|
| 972 |
</listitem> |
|---|
| 973 |
<listitem> |
|---|
| 974 |
<para> |
|---|
| 975 |
Restaurer les fichiers de la base de données à partir de la |
|---|
| 976 |
sauvegarde. Il faut veiller à ce qu'ils soient restaurés avec le bon |
|---|
| 977 |
propriétaire (l'utilisateur système de la base de données, et non pas |
|---|
| 978 |
<literal>root</literal> !) et avec les bons droits. Si des |
|---|
| 979 |
<foreignphrase>tablespaces</foreignphrase> sont utilisés, il faut |
|---|
| 980 |
s'assurer que les liens symboliques dans |
|---|
| 981 |
<filename>pg_tblspc/</filename> ont été correctement restaurés. |
|---|
| 982 |
</para> |
|---|
| 983 |
</listitem> |
|---|
| 984 |
<listitem> |
|---|
| 985 |
<para> |
|---|
| 986 |
Supprimer tout fichier présent dans <filename>pg_xlog/</filename> ; |
|---|
| 987 |
ils proviennent de la sauvegarde et sont du coup probablement obsolètes. |
|---|
| 988 |
Si <filename>pg_xlog/</filename> n'a pas été archivé, il suffit de |
|---|
| 989 |
recréer ce répertoire en faisant attention à le créer en tant que |
|---|
| 990 |
lien symbolique si c'était le cas auparavant. |
|---|
| 991 |
Le sous-répertoire |
|---|
| 992 |
<filename>pg_xlog/archive_status/</filename> doit aussi être créé. |
|---|
| 993 |
</para> |
|---|
| 994 |
</listitem> |
|---|
| 995 |
&l |
|---|