| 1 |
<!-- |
|---|
| 2 |
$Header: /var/lib/cvs/pgsql-fr/sgml/backup.sgml,v 1.16 2005/07/15 06:14:20 guillaume Exp $ |
|---|
| 3 |
--> |
|---|
| 4 |
<chapter id="backup"> |
|---|
| 5 |
<title>Sauvegardes et restaurations</title> |
|---|
| 6 |
|
|---|
| 7 |
<indexterm zone="backup"><primary>backup</></> |
|---|
| 8 |
|
|---|
| 9 |
<para> |
|---|
| 10 |
Comme avec tout ce qui contient des données importantes, les bases de données |
|---|
| 11 |
<productname>PostgreSQL</> doivent être sauvegardées régulièrement. |
|---|
| 12 |
Bien que la procédure soit plutôt simple, il est important de comprendre les |
|---|
| 13 |
techniques sous-jacentes ainsi que les hypothèses prises. |
|---|
| 14 |
</para> |
|---|
| 15 |
|
|---|
| 16 |
<para> |
|---|
| 17 |
Il y a trois approches fondamentalement différentes pour sauvegarder les |
|---|
| 18 |
données de <productname>PostgreSQL</> : |
|---|
| 19 |
<itemizedlist> |
|---|
| 20 |
<listitem><para><acronym>La sauvegarde SQL ;</></para></listitem> |
|---|
| 21 |
<listitem><para>La sauvegarde de niveau système de |
|---|
| 22 |
fichiers ;</para></listitem> |
|---|
| 23 |
<listitem><para>La sauvegarde à chaud (ou en ligne).</para></listitem> |
|---|
| 24 |
</itemizedlist> |
|---|
| 25 |
Chacune a ses avantages et inconvénients. |
|---|
| 26 |
</para> |
|---|
| 27 |
|
|---|
| 28 |
<sect1 id="backup-dump"> |
|---|
| 29 |
<title>Sauvegarde <acronym>SQL</></title> |
|---|
| 30 |
|
|---|
| 31 |
<para> |
|---|
| 32 |
Le principe est de générer un fichier texte de commandes SQL (appelé |
|---|
| 33 |
<quote>fichier dump</quote>), qui, si on le renvoie au serveur, recrée une |
|---|
| 34 |
base de données identique à celle sauvegardée. |
|---|
| 35 |
<productname>PostgreSQL</> propose pour cela le programme utilitaire |
|---|
| 36 |
<xref linkend="app-pgdump">. L'usage basique est : |
|---|
| 37 |
<synopsis> |
|---|
| 38 |
pg_dump <replaceable class="parameter">base_de_donnees</replaceable> > <replaceable class="parameter">fichier_de_sortie</replaceable> |
|---|
| 39 |
</synopsis> |
|---|
| 40 |
Comme vous le voyez, <application>pg_dump</> écrit son résultat sur la sortie standard. |
|---|
| 41 |
Nous verrons plus loin que cela peut être pratique. |
|---|
| 42 |
</para> |
|---|
| 43 |
|
|---|
| 44 |
<para> |
|---|
| 45 |
<application>pg_dump</> est un programme client <productname>PostgreSQL</> |
|---|
| 46 |
classique (mais plutôt intelligent). Ceci veut dire que vous pouvez |
|---|
| 47 |
faire une sauvegarde depuis n'importe quel ordinateur ayant accès à la base. |
|---|
| 48 |
Mais rappelez-vous que <application>pg_dump</> n'a pas de droits spéciaux. |
|---|
| 49 |
En particulier, il doit avoir accès en lecture à toutes les tables que |
|---|
| 50 |
vous voulez sauvegarder, si bien qu'il doit être lancé pratiquement |
|---|
| 51 |
toujours en tant que super-utilisateur de la base. |
|---|
| 52 |
</para> |
|---|
| 53 |
|
|---|
| 54 |
<para> |
|---|
| 55 |
Pour préciser quel serveur de bases de données <application>pg_dump</> doit |
|---|
| 56 |
contacter, utilisez les options de ligne de commande <option>-h |
|---|
| 57 |
<replaceable>serveur</></> et <option>-p <replaceable>port</></>. |
|---|
| 58 |
Le serveur par défaut est le serveur local, ou bien celui spécifié par la |
|---|
| 59 |
variable d'environnement <envar>PGHOST</envar>. |
|---|
| 60 |
De la même façon, le port par défaut est indiqué par la variable d'environnement |
|---|
| 61 |
<envar>PGPORT</envar> ou, en son absence, par la valeur par défaut précisée |
|---|
| 62 |
à la compilation. Heureusement, la serveur a normalement la même valeur par |
|---|
| 63 |
défaut à la compilation. |
|---|
| 64 |
</para> |
|---|
| 65 |
|
|---|
| 66 |
<para> |
|---|
| 67 |
Comme tout programme client <productname>PostgreSQL</>, <application>pg_dump</> |
|---|
| 68 |
se connecte par défaut avec l'utilisateur de base de données de même nom que |
|---|
| 69 |
l'utilisateur système courant. Pour passer outre, précisez l'option |
|---|
| 70 |
<option>-U</option> ou donnez une valeur à la variable d'environnement |
|---|
| 71 |
<envar>PGUSER</envar>. Rappelez-vous que les connexions de |
|---|
| 72 |
<application>pg_dump</> sont soumises aux mécanismes normaux |
|---|
| 73 |
d'authentification des programmes clients (qui sont décrits dans le <xref |
|---|
| 74 |
linkend="client-authentication">). |
|---|
| 75 |
</para> |
|---|
| 76 |
|
|---|
| 77 |
<para> |
|---|
| 78 |
Les sauvegardes créées par <application>pg_dump</> sont cohérentes, ce |
|---|
| 79 |
qui veut dire que les modifications effectuées alors que <application>pg_dump</> |
|---|
| 80 |
est en cours de fonctionnement ne sont pas dans le fichier de résultat. |
|---|
| 81 |
<application>pg_dump</> ne bloque pas les autres opérations sur la base |
|---|
| 82 |
lorsqu'il fonctionne (sauf celles qui ont besoin d'un verrou exclusif, comme |
|---|
| 83 |
<command>VACUUM FULL</command>.) |
|---|
| 84 |
</para> |
|---|
| 85 |
|
|---|
| 86 |
<important> |
|---|
| 87 |
<para> |
|---|
| 88 |
Lorsque votre base de données dépend des OID (par exemple en tant que clés |
|---|
| 89 |
étrangères), vous devez indiquer à <application>pg_dump</> de sauvegarder |
|---|
| 90 |
aussi les OID. Pour cela, utilisez l'option <option>-o</option> sur la ligne |
|---|
| 91 |
de commande. |
|---|
| 92 |
Les <quote>gros objets</> ne sont pas non plus sauvegardés par défaut. |
|---|
| 93 |
Consultez la page de référence de la commande <xref linkend="app-pgdump"> si |
|---|
| 94 |
vous utilisez les <quote>gros objets</>. |
|---|
| 95 |
</para> |
|---|
| 96 |
</important> |
|---|
| 97 |
|
|---|
| 98 |
<sect2 id="backup-dump-restore"> |
|---|
| 99 |
<title>Restaurer la sauvegarde</title> |
|---|
| 100 |
|
|---|
| 101 |
<para> |
|---|
| 102 |
Les fichiers texte créés par <application>pg_dump</> sont prévus pour être |
|---|
| 103 |
lus par le programme <application>psql</application>. La syntaxe générale |
|---|
| 104 |
d'une commande de restauration est |
|---|
| 105 |
<synopsis> |
|---|
| 106 |
psql <replaceable class="parameter">base_de_donnees</replaceable> < <replaceable class="parameter">fichier_d_entree</replaceable> |
|---|
| 107 |
</synopsis> |
|---|
| 108 |
où <replaceable class="parameter">fichier_d_entree</replaceable> est ce que |
|---|
| 109 |
vous avez précisé comme <replaceable class="parameter">fichier_de_sortie</replaceable> |
|---|
| 110 |
à la commande <application>pg_dump</>. La base de données |
|---|
| 111 |
<replaceable class="parameter">base_de_donnees</replaceable> n'est pas créée par cette |
|---|
| 112 |
commande. Vous devez la créer vous-même à partir de <literal>template0</> |
|---|
| 113 |
avant d'exécuter <application>psql</> (par exemple avec <literal>createdb -T |
|---|
| 114 |
template0 <replaceable class="parameter">base_de_donnees</></literal>). |
|---|
| 115 |
<application>psql</> propose des options similaires à celles de |
|---|
| 116 |
<application>pg_dump</> pour contrôler l'emplacement du serveur de bases de |
|---|
| 117 |
données et le nom d'utilisateur. Voyez la page de référence de <xref |
|---|
| 118 |
linkend="app-psql"> pour plus d'informations. |
|---|
| 119 |
</para> |
|---|
| 120 |
|
|---|
| 121 |
<para> |
|---|
| 122 |
La base de données cible doit déjà exister avant de lancer la restauration, |
|---|
| 123 |
ainsi que les utilisateurs possédant les objets dans la base de données |
|---|
| 124 |
sauvegardée ou ayant des droits sur ces objets. S'ils n'existent pas, la |
|---|
| 125 |
restauration échouera pour la création des objets dont ils sont |
|---|
| 126 |
propriétaires ou pour lesquels ils ont des droits (quelque fois, cela |
|---|
| 127 |
correspond à ce que vous souhaitez mais ce n'est pas le cas habituellement). |
|---|
| 128 |
</para> |
|---|
| 129 |
|
|---|
| 130 |
<para> |
|---|
| 131 |
Une fois restauré, il est recommandé de lancer <xref linkend="sql-analyze" |
|---|
| 132 |
endterm="sql-analyze-title"> sur chacune des bases de données afin que |
|---|
| 133 |
l'optimiseur de requêtes dispose de statistiques utiles. Une façon aisée de |
|---|
| 134 |
le faire est de lancer la commande <command>vacuumdb -a -z</> pour lancer |
|---|
| 135 |
<command>ANALYZE</> sur toutes les bases de données ; ceci est |
|---|
| 136 |
équivalent à lancer <command>VACUUM ANALYZE</command> manuellement. |
|---|
| 137 |
</para> |
|---|
| 138 |
|
|---|
| 139 |
<para> |
|---|
| 140 |
La capacité de <application>pg_dump</> et <application>psql</> à écrire |
|---|
| 141 |
et à lire dans des tubes permet de sauvegarder une base de données |
|---|
| 142 |
directement d'un serveur sur un autre. Par exemple : |
|---|
| 143 |
<programlisting> |
|---|
| 144 |
pg_dump -h <replaceable>serveur1</> <replaceable>base_de_donnees</> | psql -h <replaceable>serveur2</> <replaceable>base_de_donnees</> |
|---|
| 145 |
</programlisting> |
|---|
| 146 |
</para> |
|---|
| 147 |
|
|---|
| 148 |
<important> |
|---|
| 149 |
<para> |
|---|
| 150 |
Les fichiers de sauvegarde produits par <application>pg_dump</> sont |
|---|
| 151 |
relatifs à <literal>template0</>. Cela signifie que chaque langage, |
|---|
| 152 |
procédure, etc. ajoutés à <literal>template1</> seront aussi sauvegardés |
|---|
| 153 |
par <application>pg_dump</>. En conséquence, si vous utilisez une base |
|---|
| 154 |
<literal>template1</> modifiée, vous devez créer la base vide à partir de |
|---|
| 155 |
<literal>template0</>, comme dans l'exemple précédent. |
|---|
| 156 |
</para> |
|---|
| 157 |
</important> |
|---|
| 158 |
|
|---|
| 159 |
<para> |
|---|
| 160 |
Pour des conseils sur le chargement efficace de grosses quantités de |
|---|
| 161 |
données dans <productname>PostgreSQL</productname>, référez-vous à la <xref |
|---|
| 162 |
linkend="populate">. |
|---|
| 163 |
</para> |
|---|
| 164 |
|
|---|
| 165 |
</sect2> |
|---|
| 166 |
|
|---|
| 167 |
<sect2 id="backup-dump-all"> |
|---|
| 168 |
<title>Utilisation de <application>pg_dumpall</></title> |
|---|
| 169 |
|
|---|
| 170 |
<para> |
|---|
| 171 |
Le mécanisme précédent est peu pratique pour sauvegarder un serveur de bases |
|---|
| 172 |
de données complet. <xref linkend="app-pg-dumpall"> est prévu pour cela. |
|---|
| 173 |
<application>pg_dumpall</> sauvegarde toutes les bases de données d'un |
|---|
| 174 |
groupe de bases de données <productname>PostgreSQL</> (appelé cluster) et |
|---|
| 175 |
préserve les données communes au groupe de bases comme les utilisateurs et |
|---|
| 176 |
les groupes. L'utilisation basique de cette commande est : |
|---|
| 177 |
<synopsis> |
|---|
| 178 |
pg_dumpall > <replaceable>fichier_de_sortie</> |
|---|
| 179 |
</synopsis> |
|---|
| 180 |
Le fichier de sauvegarde résultant peut être restauré avec <application>psql</> : |
|---|
| 181 |
<synopsis> |
|---|
| 182 |
psql -f <replaceable class="parameter">fichier_d_entree</replaceable> template1 |
|---|
| 183 |
</synopsis> |
|---|
| 184 |
(Vous pouvez utiliser n'importe quelle base de données pour vous |
|---|
| 185 |
connecter mais si vous êtes en train de recharger un serveur vide, |
|---|
| 186 |
<literal>template1</> est la seule base de données disponible.) |
|---|
| 187 |
Il faut obligatoirement être le super-utilisateur de la base pour restaurer |
|---|
| 188 |
une sauvegarde faite avec <application>pg_dumpall</>, pour pouvoir restaurer |
|---|
| 189 |
les informations sur les utilisateurs et les groupes. |
|---|
| 190 |
</para> |
|---|
| 191 |
</sect2> |
|---|
| 192 |
|
|---|
| 193 |
<sect2 id="backup-dump-large"> |
|---|
| 194 |
<title>Gérer les grosses bases de données</title> |
|---|
| 195 |
|
|---|
| 196 |
<para> |
|---|
| 197 |
Comme <productname>PostgreSQL</productname> permet que des tables soient plus |
|---|
| 198 |
grandes que la taille maximale d'un fichier sur votre système de fichiers, |
|---|
| 199 |
sauvegarder une telle table en fichier peut poser des problèmes. |
|---|
| 200 |
Comme <application>pg_dump</> peut écrire sur la sortie standard, vous pouvez |
|---|
| 201 |
utiliser des outils standard d'Unix pour contourner ce problème éventuel. |
|---|
| 202 |
</para> |
|---|
| 203 |
|
|---|
| 204 |
<formalpara> |
|---|
| 205 |
<title>Compresser le fichier de sauvegarde</title> |
|---|
| 206 |
<para> |
|---|
| 207 |
Vous pouvez utiliser votre programme de compression habituel. Par exemple |
|---|
| 208 |
<application>gzip</application>. |
|---|
| 209 |
|
|---|
| 210 |
<programlisting> |
|---|
| 211 |
pg_dump <replaceable class="parameter">base_de_donnees</replaceable> | gzip > <replaceable class="parameter">nom_fichier</replaceable>.gz |
|---|
| 212 |
</programlisting> |
|---|
| 213 |
|
|---|
| 214 |
Pour restaurer : |
|---|
| 215 |
|
|---|
| 216 |
<programlisting> |
|---|
| 217 |
createdb <replaceable class="parameter">base_de_donnees</replaceable> |
|---|
| 218 |
gunzip -c <replaceable class="parameter">nom_fichier</replaceable>.gz | psql <replaceable class="parameter">base_de_donnees</replaceable> |
|---|
| 219 |
</programlisting> |
|---|
| 220 |
|
|---|
| 221 |
ou |
|---|
| 222 |
|
|---|
| 223 |
<programlisting> |
|---|
| 224 |
cat <replaceable class="parameter">nom_fichier</replaceable>.gz | gunzip | psql <replaceable class="parameter">base_de_donnees</replaceable> |
|---|
| 225 |
</programlisting> |
|---|
| 226 |
</para> |
|---|
| 227 |
</formalpara> |
|---|
| 228 |
|
|---|
| 229 |
<formalpara> |
|---|
| 230 |
<title>Couper le fichier avec <command>split</></title> |
|---|
| 231 |
<para> |
|---|
| 232 |
La commande <command>split</command> vous permet de découper le fichier en |
|---|
| 233 |
morceaux d'une taille acceptable pour le système de fichiers sous-jacent. |
|---|
| 234 |
Par exemple, pour faire des morceaux de 1 Mo : |
|---|
| 235 |
|
|---|
| 236 |
<programlisting> |
|---|
| 237 |
pg_dump <replaceable class="parameter">base_de_donnees</replaceable> | split -b 1m - <replaceable class="parameter">nom_fichier</replaceable> |
|---|
| 238 |
</programlisting> |
|---|
| 239 |
|
|---|
| 240 |
Pour restaurer : |
|---|
| 241 |
|
|---|
| 242 |
<programlisting> |
|---|
| 243 |
createdb <replaceable class="parameter">base_de_donnees</replaceable> |
|---|
| 244 |
cat <replaceable class="parameter">nom_fichier</replaceable>* | psql <replaceable class="parameter">base_de_donnees</replaceable> |
|---|
| 245 |
</programlisting> |
|---|
| 246 |
</para> |
|---|
| 247 |
</formalpara> |
|---|
| 248 |
|
|---|
| 249 |
<formalpara> |
|---|
| 250 |
<title>Utilisation du format de sauvegarde spécial</title> |
|---|
| 251 |
<para> |
|---|
| 252 |
Si <productname>PostgreSQL</productname> est installé sur un système où la |
|---|
| 253 |
bibliothèque de compression <application>zlib</> est disponible, ce format |
|---|
| 254 |
de sauvegarde spécial peut être utilisé. Pour les grandes bases de données, |
|---|
| 255 |
cela produira un fichier de sauvegarde d'une taille comparable à celle de |
|---|
| 256 |
<command>gzip</command>, avec l'avantage supplémentaire de permettre de |
|---|
| 257 |
restaurer des tables sélectivement. La commande qui suit sauvegarde une |
|---|
| 258 |
base de données en utilisant le format de sauvegarde spécial : |
|---|
| 259 |
|
|---|
| 260 |
<programlisting> |
|---|
| 261 |
pg_dump -Fc <replaceable class="parameter">base_de_donnees</replaceable> > <replaceable class="parameter">nom_fichier</replaceable> |
|---|
| 262 |
</programlisting> |
|---|
| 263 |
|
|---|
| 264 |
Un format personnalisé de la sauvegarde n'est pas un script pour |
|---|
| 265 |
<application>psql</> mais doit, à la place, être restauré avec |
|---|
| 266 |
<application>pg_restore</>. Voir les pages de référence de <xref |
|---|
| 267 |
linkend="app-pgdump"> et <xref linkend="app-pgrestore"> pour quelques |
|---|
| 268 |
détails. |
|---|
| 269 |
</para> |
|---|
| 270 |
</formalpara> |
|---|
| 271 |
|
|---|
| 272 |
</sect2> |
|---|
| 273 |
|
|---|
| 274 |
<sect2 id="backup-dump-caveats"> |
|---|
| 275 |
<title>Limitations</title> |
|---|
| 276 |
|
|---|
| 277 |
<para> |
|---|
| 278 |
Pour des raisons de compatibilité avec les versions précédentes, |
|---|
| 279 |
<application>pg_dump</> ne sauvegarde pas les gros objets par défaut. |
|---|
| 280 |
<indexterm><primary>gros |
|---|
| 281 |
objets</primary><secondary>sauvegarde</secondary></indexterm> Pour |
|---|
| 282 |
les sauvegarder, vous devez utiliser soit le format de sauvegarde |
|---|
| 283 |
spécial soit le format TAR, et passer l'option <option>-b</> à |
|---|
| 284 |
<application>pg_dump</>. Voyez la page de référence de <xref |
|---|
| 285 |
linkend="app-pgdump"> pour plus de détails. |
|---|
| 286 |
Le répertoire <filename>contrib/pg_dumplo</> des fichiers sources de <productname>PostgreSQL</> |
|---|
| 287 |
contient aussi un programme qui peut sauvegarder les gros objets. |
|---|
| 288 |
</para> |
|---|
| 289 |
|
|---|
| 290 |
<para> |
|---|
| 291 |
Merci de vous familiariser avec la page de référence de |
|---|
| 292 |
<xref linkend="app-pgdump">. |
|---|
| 293 |
</para> |
|---|
| 294 |
</sect2> |
|---|
| 295 |
</sect1> |
|---|
| 296 |
|
|---|
| 297 |
<sect1 id="backup-file"> |
|---|
| 298 |
<title>Sauvegarde de niveau système de fichiers</title> |
|---|
| 299 |
|
|---|
| 300 |
<para> |
|---|
| 301 |
Une autre stratégie de sauvegarde est de copier les fichiers |
|---|
| 302 |
utilisés par <productname>PostgreSQL</> pour enregistrer les données. |
|---|
| 303 |
Dans la <xref linkend="creating-cluster">, l'emplacement de ces |
|---|
| 304 |
fichiers sont donnés mais vous les avez probablement déjà trouvés si vous |
|---|
| 305 |
vous intéressez à cette méthode. Vous pouvez utiliser n'importe quelle |
|---|
| 306 |
méthode de sauvegarde, par exemple : |
|---|
| 307 |
|
|---|
| 308 |
<programlisting> |
|---|
| 309 |
tar -cf sauvegarde.tar /usr/local/pgsql/data |
|---|
| 310 |
</programlisting> |
|---|
| 311 |
</para> |
|---|
| 312 |
|
|---|
| 313 |
<para> |
|---|
| 314 |
Cependant, il y a deux restrictions qui rendent cette méthode inutilisable |
|---|
| 315 |
ou en tout cas inférieure à la méthode <application>pg_dump</>. |
|---|
| 316 |
|
|---|
| 317 |
<orderedlist> |
|---|
| 318 |
<listitem> |
|---|
| 319 |
<para> |
|---|
| 320 |
Le serveur de base de données <emphasis>doit</> être arrêté pour obtenir |
|---|
| 321 |
une sauvegarde utilisable. Toutes les demi-mesures, comme supprimer |
|---|
| 322 |
toutes les connections, ne fonctionneront <emphasis>pas</emphasis> |
|---|
| 323 |
(principalement parce que <command>tar</command> et les outils similaires |
|---|
| 324 |
ne font pas une image atomique de l'état du système de fichiers à un |
|---|
| 325 |
moment spécifique). Vous trouverez des informations sur la façon d'arrêter |
|---|
| 326 |
le serveur <productname>PostgreSQL</> dans la <xref |
|---|
| 327 |
linkend="postmaster-shutdown">. |
|---|
| 328 |
</para> |
|---|
| 329 |
|
|---|
| 330 |
<para> |
|---|
| 331 |
Il va sans dire que vous devez aussi éteindre le serveur avant de |
|---|
| 332 |
restaurer les données. |
|---|
| 333 |
</para> |
|---|
| 334 |
</listitem> |
|---|
| 335 |
|
|---|
| 336 |
<listitem> |
|---|
| 337 |
<para> |
|---|
| 338 |
Si vous vous êtes aventurés dans les détails de l'organisation de la |
|---|
| 339 |
base de données, vous pouvez être tentés de ne sauvegarder et |
|---|
| 340 |
de ne restaurer que certaines tables ou bases de données particulières. |
|---|
| 341 |
Ceci ne fonctionnera <emphasis>pas</> parce que les informations |
|---|
| 342 |
contenues dans ces fichiers ne sont qu'à moitié vraies. L'autre moitié |
|---|
| 343 |
est dans les fichiers journaux de validation |
|---|
| 344 |
<filename>pg_clog/*</filename>, qui |
|---|
| 345 |
contiennent l'état de la validation de chaque transaction. Un fichier de |
|---|
| 346 |
table n'est utilisable qu'avec cette information. Bien entendu, il est |
|---|
| 347 |
impossible de ne restaurer qu'une table et les données <filename>pg_clog</filename> |
|---|
| 348 |
associées car cela rendrait toutes les autres tables du serveur |
|---|
| 349 |
inutilisables. Donc, les sauvegardes du système de fichiers fonctionnent |
|---|
| 350 |
seulement pour les restaurations complètes d'un groupe entier de bases de |
|---|
| 351 |
données. |
|---|
| 352 |
</para> |
|---|
| 353 |
</listitem> |
|---|
| 354 |
</orderedlist> |
|---|
| 355 |
</para> |
|---|
| 356 |
|
|---|
| 357 |
<para> |
|---|
| 358 |
Une autre approche à la sauvegarde du système de fichiers est de réaliser |
|---|
| 359 |
une <quote>image cohérente</quote> du répertoire des données si le système |
|---|
| 360 |
de fichiers supporte cette fonctionnalité (et que vous avez confiance |
|---|
| 361 |
en sa bonne implémentation). La procédure typique est de faire une |
|---|
| 362 |
<quote>image gelée</> du volume contenant la base de données, et enfin de |
|---|
| 363 |
copier le répertoire data complètement (pas seulement quelques parties, |
|---|
| 364 |
voir ci-dessus) de l'image sur un périphérique de sauvegarde, puis de |
|---|
| 365 |
libérer l'image gelé. Ceci fonctionnera même si le serveur de la base de |
|---|
| 366 |
données est en cours d'exécution. Néanmoins, une sauvegarde créée de cette |
|---|
| 367 |
façon sauvegarde les fichiers de la base de données dans un état où le |
|---|
| 368 |
serveur n'était pas correctement arrêté ; du coup, au lancement du |
|---|
| 369 |
serveur à partir des données sauvegardées, PostgreSQL pensera que le |
|---|
| 370 |
serveur s'est stoppé brutalement et rejouera les journaux WAL. Ceci n'est |
|---|
| 371 |
pas un problème, soyez-en juste conscient (et assurez-vous d'inclure les |
|---|
| 372 |
fichiers WAL dans votre sauvegarde). |
|---|
| 373 |
</para> |
|---|
| 374 |
|
|---|
| 375 |
<para> |
|---|
| 376 |
Si votre base de données est répartie sur plusieurs systèmes de fichiers, |
|---|
| 377 |
il pourrait ne pas y avoir de moyens pour obtenir des images gelées |
|---|
| 378 |
exactement simultanément de tous les disques. Par exemple, si vos fichiers |
|---|
| 379 |
de données et vos journaux WAL sont sur des disques différents ou si les |
|---|
| 380 |
tablespaces sont sur des systèmes de fichiers différents, il pourrait |
|---|
| 381 |
ne pas être possible d'utiliser une sauvegarde par image parce que ces |
|---|
| 382 |
dernières doivent être simultanées. |
|---|
| 383 |
Lisez la documentation de votre système |
|---|
| 384 |
de fichiers avec attention avant de faire confiance à la technique d'images |
|---|
| 385 |
cohérentes dans de telles situations. L'approche la plus sûre est d'arrêter |
|---|
| 386 |
le serveur de bases de données assez longtemps pour créer toutes les images |
|---|
| 387 |
gelées. |
|---|
| 388 |
</para> |
|---|
| 389 |
|
|---|
| 390 |
<para> |
|---|
| 391 |
Une autre option est d'utiliser <application>rsync</> pour réaliser une |
|---|
| 392 |
sauvegarde du système de fichiers. Ceci se fait tout d'abord en lançant |
|---|
| 393 |
<application>rsync</> alors que le serveur de bases de données est en cours |
|---|
| 394 |
d'exécution, puis en arrêtant le serveur juste assez longtemps pour lancer |
|---|
| 395 |
<application>rsync</> une deuxième fois. Le deuxième |
|---|
| 396 |
<application>rsync</> sera beaucoup plus rapide que le premier car il aura |
|---|
| 397 |
relativement peu de données à transférer et le résultat final sera cohérent |
|---|
| 398 |
parce que le serveur était arrêté. Cette méthode permet de réaliser une |
|---|
| 399 |
sauvegarde du système de fichiers avec un arrêt minimal. |
|---|
| 400 |
</para> |
|---|
| 401 |
|
|---|
| 402 |
<para> |
|---|
| 403 |
Notez aussi qu'une sauvegarde des fichiers de données ne sera pas forcément |
|---|
| 404 |
moins grosse qu'une sauvegarde SQL. Au contraire, elle sera très certainement |
|---|
| 405 |
plus grande (<application>pg_dump</application> ne sauvegarde pas le |
|---|
| 406 |
contenu des index, mais la commande pour les recréer). |
|---|
| 407 |
</para> |
|---|
| 408 |
|
|---|
| 409 |
</sect1> |
|---|
| 410 |
|
|---|
| 411 |
<sect1 id="backup-online"> |
|---|
| 412 |
<title>Sauvegardes à chaud et récupération à un instant (PITR)</title> |
|---|
| 413 |
|
|---|
| 414 |
<indexterm zone="backup"> |
|---|
| 415 |
<primary>sauvegarde à chaud</primary> |
|---|
| 416 |
</indexterm> |
|---|
| 417 |
|
|---|
| 418 |
<indexterm zone="backup"> |
|---|
| 419 |
<primary>récupération à un instant</primary> |
|---|
| 420 |
</indexterm> |
|---|
| 421 |
|
|---|
| 422 |
<indexterm zone="backup"> |
|---|
| 423 |
<primary>PITR</primary> |
|---|
| 424 |
</indexterm> |
|---|
| 425 |
|
|---|
| 426 |
<para> |
|---|
| 427 |
En permanence, <productname>PostgreSQL</> maintient des journaux WAL |
|---|
| 428 |
(<firstterm>write ahead log</>) dans le sous-répertoire |
|---|
| 429 |
<filename>pg_xlog/</> du répertoire des données du groupe. Ces journaux |
|---|
| 430 |
décrivent chaque modification effectuée sur les fichiers de données des |
|---|
| 431 |
bases. Ils existent principalement pour des raisons de sécurité suite à un |
|---|
| 432 |
arrêt brutal : si le système s'arrête brutalement, la base de données |
|---|
| 433 |
peut être restaurée pour avoir une cohérence des données en |
|---|
| 434 |
<quote>rejouant</> les entrées des journaux enregistrées depuis le dernier |
|---|
| 435 |
point de vérification. Néanmoins, l'existence de ces journaux rend possible |
|---|
| 436 |
l'utilisation d'une troisième stratégie pour la sauvegarde des bases de |
|---|
| 437 |
données : nous pouvons combiner une sauvegarde au niveau système de |
|---|
| 438 |
fichiers avec la sauvegarde des fichiers WAL. Si la récupération est |
|---|
| 439 |
nécessaire, nous restaurons la sauvegarde, puis rejouons à partir des |
|---|
| 440 |
fichiers WAL sauvegardés pour amener la sauvegarde jusqu'à la date |
|---|
| 441 |
actuelle. Cette approche est plus complexe à administrer que toutes les |
|---|
| 442 |
autres approches mais elle apporte des bénéfices significatifs : |
|---|
| 443 |
<itemizedlist> |
|---|
| 444 |
<listitem> |
|---|
| 445 |
<para> |
|---|
| 446 |
Nous n'avons pas besoin de faire une sauvegarde parfaitement cohérente |
|---|
| 447 |
comme point de départ. Toute incohérence dans la sauvegarde sera corrigée |
|---|
| 448 |
par la ré-exécution des journaux (ceci n'est pas significativement |
|---|
| 449 |
différent de ce qu'il se passe lors d'une récupération après un arrêt |
|---|
| 450 |
brutal). Donc, nous n'avons pas besoin d'une fonctionnalité d'image |
|---|
| 451 |
système du système de fichiers, simplement <application>tar</> ou un |
|---|
| 452 |
autre outil d'archivage. |
|---|
| 453 |
</para> |
|---|
| 454 |
</listitem> |
|---|
| 455 |
<listitem> |
|---|
| 456 |
<para> |
|---|
| 457 |
Comme nous pouvons assembler une longue séquence de fichiers à WAL pour |
|---|
| 458 |
les rejouer, la sauvegarde continue est possible en continuant |
|---|
| 459 |
simplement d'archiver les fichiers WAL. Ceci est particulièrement |
|---|
| 460 |
intéressant pour les grosses bases de données où il pourrait ne pas |
|---|
| 461 |
être facile de réaliser une sauvegarde complète fréquemment. |
|---|
| 462 |
</para> |
|---|
| 463 |
</listitem> |
|---|
| 464 |
<listitem> |
|---|
| 465 |
<para> |
|---|
| 466 |
Rien ne dit que nous devons rejouer les entrées WAL jusqu'à la fin. Nous |
|---|
| 467 |
pouvons stopper la ré-exécution à un certain point et avoir une image |
|---|
| 468 |
cohérente de la base de données à ce moment-là. Du coup, cette technique |
|---|
| 469 |
supporte la <firstterm>récupération à un instant t</> (PITR) : il est |
|---|
| 470 |
possible de restaurer la base de données à n'importe quel point dans le |
|---|
| 471 |
temps depuis la dernière sauvegarde de base. |
|---|
| 472 |
</para> |
|---|
| 473 |
</listitem> |
|---|
| 474 |
<listitem> |
|---|
| 475 |
<para> |
|---|
| 476 |
Si nous remplissons en continue la série de fichiers WAL dans une autre |
|---|
| 477 |
machine qui a été chargée avec le même fichier de sauvegarde de base, |
|---|
| 478 |
nous avons un système <quote>à jour en permanence</> : à tout |
|---|
| 479 |
moment, nous pouvons monter la deuxième machine et avoir une copie quasi |
|---|
| 480 |
complète de la base de données. |
|---|
| 481 |
</para> |
|---|
| 482 |
</listitem> |
|---|
| 483 |
</itemizedlist> |
|---|
| 484 |
</para> |
|---|
| 485 |
|
|---|
| 486 |
<para> |
|---|
| 487 |
Comme avec la technique de sauvegarde standard du système de fichiers, |
|---|
| 488 |
cette méthode supporte la restauration d'un groupe de bases de données |
|---|
| 489 |
complet, pas un sous-ensemble. De plus, il requiert beaucoup d'espace |
|---|
| 490 |
d'archivage : la sauvegarde de base peut être légère mais un système |
|---|
| 491 |
très utilisé générera beaucoup de mégaoctets de trafic WAL qui seront à |
|---|
| 492 |
archiver. Malgré tout, c'est la technique de sauvegarde préférée dans |
|---|
| 493 |
beaucoup de situations où la haute fiabilité est nécessaire. |
|---|
| 494 |
</para> |
|---|
| 495 |
|
|---|
| 496 |
<para> |
|---|
| 497 |
Pour récupérer avec succès suite à l'utilisation d'une sauvegarde à chaud, |
|---|
| 498 |
vous avez besoin d'une séquence continue de fichiers WAL archivés qui |
|---|
| 499 |
s'étendent au moins jusqu'au point de départ de votre sauvegarde. Pour |
|---|
| 500 |
commencer, vous devriez configurer et tester votre procédure d'archivage |
|---|
| 501 |
des journaux WAL <emphasis>avant</> de faire votre première sauvegarde de |
|---|
| 502 |
base. Il nous faut donc commencer par vous présenter les mécanismes |
|---|
| 503 |
d'archivage des fichiers WAL. |
|---|
| 504 |
</para> |
|---|
| 505 |
|
|---|
| 506 |
<sect2 id="backup-archiving-wal"> |
|---|
| 507 |
<title>Configurer l'archivage WAL</title> |
|---|
| 508 |
|
|---|
| 509 |
<para> |
|---|
| 510 |
Dans un sens abstrait, un système <productname>PostgreSQL</> fonctionnel |
|---|
| 511 |
produit une séquence indéfiniment longue d'enregistrements WAL. Le système |
|---|
| 512 |
divise physiquement cette séquence en <firstterm>fichiers segment</> |
|---|
| 513 |
WAL, qui font normalement 16 Mo chaque (bien que la taille puisse |
|---|
| 514 |
être modifiée lors de la construction de <productname>PostgreSQL</>). Les |
|---|
| 515 |
fichiers segment se voient donnés des noms numériques pour refléter leur |
|---|
| 516 |
position dans la séquence abstraite des WAL. Lorsque le système n'utilise |
|---|
| 517 |
pas l'archivage des WAL, il crée seulement quelques fichiers segment, puis |
|---|
| 518 |
les <quote>recycle</> en renommant les fichiers segment devenus inutiles. |
|---|
| 519 |
Il est supposé qu'un fichier segment dont le contenu précède le |
|---|
| 520 |
dernier point de vérification n'a plus d'intérêt et peut être recyclé. |
|---|
| 521 |
</para> |
|---|
| 522 |
|
|---|
| 523 |
<para> |
|---|
| 524 |
Lors de l'archivage des données WAL, nous voulons capturer le contenu de |
|---|
| 525 |
chaque fichier segment une fois qu'il est rempli et sauvegarder les |
|---|
| 526 |
données quelque part avant que le fichier segment ne soit recyclé pour |
|---|
| 527 |
être réutilisé. Suivant l'application et le matériel disponible, |
|---|
| 528 |
<quote>sauvegarder les données quelque part</> peut se faire de plusieurs |
|---|
| 529 |
façons : nous pouvons copier les fichiers segment dans un répertoire |
|---|
| 530 |
NFS monté sur une autre machine, les écrire sur une cartouche (en vous |
|---|
| 531 |
assurant que vous avez un moyen de restaurer le fichier avec son nom |
|---|
| 532 |
d'origine) ou le grouper pour les graver sur un CD, ou encore autre chose. |
|---|
| 533 |
Pour fournir autant de flexibilité que possible à l'administrateur de la |
|---|
| 534 |
base de données, <productname>PostgreSQL</> essaie de ne faire aucune |
|---|
| 535 |
supposition sur la façon dont l'archivage est réalisé. À la place, |
|---|
| 536 |
<productname>PostgreSQL</> vous laisse spécifier une commande |
|---|
| 537 |
shell à exécuter pour copier le fichier segment rempli là où vous le |
|---|
| 538 |
souhaitez. La commande pourrait être aussi simple qu'un |
|---|
| 539 |
<application>cp</> ou il pourrait impliquer un shell complexe — |
|---|
| 540 |
à vous de voir. |
|---|
| 541 |
</para> |
|---|
| 542 |
|
|---|
| 543 |
<para> |
|---|
| 544 |
La commande shell à utiliser est spécifiée par le paramètre de |
|---|
| 545 |
configuration <xref linkend="guc-archive-command"> qui, en pratique, sera |
|---|
| 546 |
toujours placé dans le fichier <filename>postgresql.conf</filename>. Dans |
|---|
| 547 |
cette chaîne, tout <literal>%p</> est remplacé par le chemin absolu de |
|---|
| 548 |
l'archive alors que tout <literal>%f</> est remplacé seulement par le |
|---|
| 549 |
nom du fichier. Écrivez <literal>%%</> si vous avez besoin d'écrire le |
|---|
| 550 |
vrai caractère <literal>%</> dans la commande. La commande utile la plus |
|---|
| 551 |
simple est quelque chose comme |
|---|
| 552 |
<programlisting> |
|---|
| 553 |
archive_command = 'cp -i %p /mnt/serveur/repertoire_archive/%f </dev/null' |
|---|
| 554 |
</programlisting> |
|---|
| 555 |
qui copiera les segments WAL archivables dans le répertoire |
|---|
| 556 |
<filename>/mnt/serveur/repertoire_archive</>. (Ceci est un exemple, pas |
|---|
| 557 |
une recommandation, et pourrait ne pas fonctionner sur toutes les |
|---|
| 558 |
plateformes.) |
|---|
| 559 |
</para> |
|---|
| 560 |
|
|---|
| 561 |
<para> |
|---|
| 562 |
La commande d'archivage sera exécutée en tant qu'utilisateur |
|---|
| 563 |
propriétaire du serveur <productname>PostgreSQL</>. Comme la série de |
|---|
| 564 |
fichiers WAL en cours d'archivage contient réellement tout ce qui se |
|---|
| 565 |
trouve dans votre base de données, vous vous assurerez que les |
|---|
| 566 |
données archivées sont protégées des autres utilisateurs ; par |
|---|
| 567 |
exemple, si les archives sont stockées dans un répertoire où se trouvent |
|---|
| 568 |
des droits de lecture pour le groupe ou pour les autres. |
|---|
| 569 |
</para> |
|---|
| 570 |
|
|---|
| 571 |
<para> |
|---|
| 572 |
Il est important que la commande d'archivage renvoie le code de sortie |
|---|
| 573 |
zéro si et seulement si l'exécution a réussi. En obtenant un résultat |
|---|
| 574 |
zéro, <productname>PostgreSQL</> supposera que le fichier segment WAL a |
|---|
| 575 |
été archivé avec succès et qu'il peut le supprimer ou le recycler. |
|---|
| 576 |
Néanmoins, un statut différent de zéro indique à |
|---|
| 577 |
<productname>PostgreSQL</> que le fichier n'a pas été archivé ; il |
|---|
| 578 |
essaiera périodiquement jusqu'à ce qu'il y arrive. |
|---|
| 579 |
</para> |
|---|
| 580 |
|
|---|
| 581 |
<para> |
|---|
| 582 |
La commande d'archivage devrait être généralement conçue pour refuser |
|---|
| 583 |
d'écraser tout fichier archive déjà existant. Ceci est une fonctionnalité |
|---|
| 584 |
de sécurité importante pour préserver l'intégrité de votre archive dans le |
|---|
| 585 |
cas d'une erreur de l'administrateur (comme l'envoi de la sortie de deux |
|---|
| 586 |
serveurs différents dans le même répertoire d'archivage). Il est |
|---|
| 587 |
conseillé de tester votre commande d'archivage proposée pour vous |
|---|
| 588 |
assurer qu'en effet il n'écrase pas un fichier existant <emphasis>et qu'il |
|---|
| 589 |
renvoie un statut différent de zéro dans ce cas</>. Nous avons découvert |
|---|
| 590 |
que <literal>cp -i</> travaille correctement sur certaines plateformes, |
|---|
| 591 |
mais pas sur toutes. Si la commande choisie ne gère pas elle-même ce |
|---|
| 592 |
cas, vous pouvez ajouter une commande pour tester l'existence du fichier |
|---|
| 593 |
d'archivage. Par exemple, quelque chose comme |
|---|
| 594 |
<programlisting> |
|---|
| 595 |
archive_command = 'test ! -f .../%f && cp %p .../%f' |
|---|
| 596 |
</programlisting> |
|---|
| 597 |
fonctionne correctement sur la plupart des variantes Unix. |
|---|
| 598 |
</para> |
|---|
| 599 |
|
|---|
| 600 |
<para> |
|---|
| 601 |
Lors de la conception de votre configuration d'archivage, considérez ce |
|---|
| 602 |
qui se passerait si la commande d'archivage échouait de façon répétée parce |
|---|
| 603 |
que certains aspects demanderaient une intervention de l'opérateur ou |
|---|
| 604 |
à cause d'un manque d'espace dans le répertoire d'archivage. Par exemple, |
|---|
| 605 |
ceci pourrait arriver si vous écrivez sur une cartouche sans changeur |
|---|
| 606 |
automatique ; quand la cartouche est remplie, rien ne peut être |
|---|
| 607 |
archivé tant que la cassette n'est pas changée. Vous devez vous assurer |
|---|
| 608 |
que toute erreur ou requête à un opérateur humain est rapportée de façon |
|---|
| 609 |
approprié pour que la situation puisse être résolue relativement |
|---|
| 610 |
rapidement. Le répertoire <filename>pg_xlog/</> continuera à se remplir |
|---|
| 611 |
de fichiers segment WAL jusqu'à la résolution de la situation. |
|---|
| 612 |
</para> |
|---|
| 613 |
|
|---|
| 614 |
<para> |
|---|
| 615 |
La vitesse de la commande d'archivage n'est pas importante, tant qu'elle |
|---|
| 616 |
est au même rythme que la génération de données WAL du serveur. Les |
|---|
| 617 |
opérations normales continuent même si le processus d'archivage est un peu |
|---|
| 618 |
plus lent. Si l'archivage est significativement plus lent, alors la |
|---|
| 619 |
quantité de données qui pourrait être perdue va croître. Cela signifie |
|---|
| 620 |
aussi que le répertoire <filename>pg_xlog/</> contiendra un grand nombre |
|---|
| 621 |
de fichiers segment non archivés, qui finiront éventuellement par |
|---|
| 622 |
dépasser l'espace disque disponible. Il vous est conseillé de surveiller |
|---|
| 623 |
le processus d'archivage pour vous assurer que tout fonctionne |
|---|
| 624 |
normalement. |
|---|
| 625 |
</para> |
|---|
| 626 |
|
|---|
| 627 |
<para> |
|---|
| 628 |
Si vous êtes encore inquiet sur votre capacité à récupérer tout à |
|---|
| 629 |
l'instant présent, vous devriez prendre quelques actions supplémentaires |
|---|
| 630 |
pour vous assurer que les fichiers segments WAL partiellement remplis sont |
|---|
| 631 |
aussi copiés quelque part. Ceci est particulièrement important si votre |
|---|
| 632 |
serveur génère peu de trafic WAL (ou que seules certaines périodes sont |
|---|
| 633 |
dans ce cas) car cela prendra beaucoup de temps avant qu'un fichier |
|---|
| 634 |
segment WAL soit complètement remplis et prêt à archiver. Une façon |
|---|
| 635 |
possible de gérer ceci est de configurer un job <application>cron</> qui, |
|---|
| 636 |
périodiquement (une fois par minute, peut-être), identifie le fichier |
|---|
| 637 |
segment WAL en cours et le sauvegarde à un endroit sûr. Ensuite, la |
|---|
| 638 |
combinaison des segments WAL archivés et du segment courant sauvegardé |
|---|
| 639 |
seront suffisant pour vous assurer de pouvoir toujours restaurer à une |
|---|
| 640 |
minute près. Ce comportement n'est pas actuellement construit dans |
|---|
| 641 |
<productname>PostgreSQL</> parce que nous ne voulions pas compliquer la |
|---|
| 642 |
définition de <xref linkend="guc-archive-command"> en lui demandant de |
|---|
| 643 |
garder trace des différentes copies archivées successivement du même |
|---|
| 644 |
fichier WAL. <xref linkend="guc-archive-command"> est seulement |
|---|
| 645 |
appelée sur des segments WAL complets. Sauf dans le cas d'un échec, il |
|---|
| 646 |
sera appelé seulement une fois pour un nom de fichier donné. |
|---|
| 647 |
</para> |
|---|
| 648 |
|
|---|
| 649 |
<para> |
|---|
| 650 |
En écrivant votre commande d'archivage, vous devez vous assurer que les |
|---|
| 651 |
noms de fichier à archiver auront 64 caractères maximum et peuvent |
|---|
| 652 |
contenir toute combinaison de lettres ASCII, de chiffres et de points. |
|---|
| 653 |
Il n'est pas nécessaire de rappeler le chemin complet original |
|---|
| 654 |
(<literal>%p</>) mais il est nécessaire de rappeler le nom du fichier |
|---|
| 655 |
(<literal>%f</>). |
|---|
| 656 |
</para> |
|---|
| 657 |
|
|---|
| 658 |
<para> |
|---|
| 659 |
Notez que, bien que l'archivage WAL vous autorisera à restaurer toute |
|---|
| 660 |
modification réalisée sur les données de votre base |
|---|
| 661 |
<productname>PostgreSQL</>, il ne restaurera pas les modifications |
|---|
| 662 |
effectuées sur les fichiers de configuration (c'est-à-dire |
|---|
| 663 |
<filename>postgresql.conf</>, <filename>pg_hba.conf</> et |
|---|
| 664 |
<filename>pg_ident.conf</>) car ceux-ci sont édités manuellement plutôt |
|---|
| 665 |
qu'au travers d'opérations SQL. Vous pourriez souhaiter conserver les |
|---|
| 666 |
fichiers de configuration à un endroit où ils seront sauvegardés avec vos |
|---|
| 667 |
procédures standards de sauvegarde du système de fichiers. Voir la |
|---|
| 668 |
<xref linkend="runtime-config-file-locations"> pour savoir comment |
|---|
| 669 |
modifier l'emplacement des fichiers de configuration. |
|---|
| 670 |
</para> |
|---|
| 671 |
</sect2> |
|---|
| 672 |
|
|---|
| 673 |
<sect2 id="backup-base-backup"> |
|---|
| 674 |
<title>Réaliser une sauvegarde de base</title> |
|---|
| 675 |
|
|---|
| 676 |
<para> |
|---|
| 677 |
La procédure pour réaliser une sauvegarde de base est relativement |
|---|
| 678 |
simple : |
|---|
| 679 |
<orderedlist> |
|---|
| 680 |
<listitem> |
|---|
| 681 |
<para> |
|---|
| 682 |
Assurez-vous que l'archivage WAL est activée et fonctionnelle. |
|---|
| 683 |
</para> |
|---|
| 684 |
</listitem> |
|---|
| 685 |
<listitem> |
|---|
| 686 |
<para> |
|---|
| 687 |
Connectez-vous à la base de données en tant que superutilisateur et |
|---|
| 688 |
lancez la commande |
|---|
| 689 |
<programlisting> |
|---|
| 690 |
SELECT pg_start_backup('label'); |
|---|
| 691 |
</programlisting> |
|---|
| 692 |
où <literal>label</> est toute chaîne que vous voulez utiliser pour |
|---|
| 693 |
identifier de façon unique l'opération de sauvegarde (une bonne pratique |
|---|
| 694 |
est d'utiliser le chemin complet où vous avez l'intention de placer le |
|---|
| 695 |
fichier de sauvegarde). <function>pg_start_backup</> crée un fichier |
|---|
| 696 |
<firstterm>label de sauvegarde</> nommé <filename>backup_label</> dans |
|---|
| 697 |
le répertoire du groupe avec des informations sur votre sauvegarde. |
|---|
| 698 |
</para> |
|---|
| 699 |
|
|---|
| 700 |
<para> |
|---|
| 701 |
Peu importe la base de données à laquelle vous vous connectez pour lancer |
|---|
| 702 |
cette commande. Vous pouvez ignorer le résultat renvoyé par la |
|---|
| 703 |
fonction mais, si elle rapporte une erreur, gérez-la avant de |
|---|
| 704 |
continuer. |
|---|
| 705 |
</para> |
|---|
| 706 |
</listitem> |
|---|
| 707 |
<listitem> |
|---|
| 708 |
<para> |
|---|
| 709 |
Lancez la sauvegarde en utilisant n'importe quel outil de sauvegarde du |
|---|
| 710 |
système de fichiers comme <application>tar</> ou <application>cpio</>. Il |
|---|
| 711 |
n'est ni nécessaire ni désirable de stopper les opérations normales de |
|---|
| 712 |
la base de données lorsque vous faites cela. |
|---|
| 713 |
</para> |
|---|
| 714 |
</listitem> |
|---|
| 715 |
<listitem> |
|---|
| 716 |
<para> |
|---|
| 717 |
Connectez-vous de nouveau sur la base de données en tant que |
|---|
| 718 |
superutilisateur et lancez la commande |
|---|
| 719 |
<programlisting> |
|---|
| 720 |
SELECT pg_stop_backup(); |
|---|
| 721 |
</programlisting> |
|---|
| 722 |
Elle devrait réussir. |
|---|
| 723 |
</para> |
|---|
| 724 |
</listitem> |
|---|
| 725 |
<listitem> |
|---|
| 726 |
<para> |
|---|
| 727 |
Une fois que les fichiers des segments WAL utilisées lors de la sauvegarde |
|---|
| 728 |
sont archivées de la même façon qu'une partie de l'activité normale de |
|---|
| 729 |
sauvegarde de la base de données, vous avez terminé. |
|---|
| 730 |
</para> |
|---|
| 731 |
</listitem> |
|---|
| 732 |
</orderedlist> |
|---|
| 733 |
</para> |
|---|
| 734 |
|
|---|
| 735 |
<para> |
|---|
| 736 |
Il n'est pas nécessaire d'être très concerné sur le temps passé entre |
|---|
| 737 |
<function>pg_start_backup</> et le début réel de la sauvegarde, pas plus |
|---|
| 738 |
qu'entre la fin de la sauvegarde et <function>pg_stop_backup</> ; un |
|---|
| 739 |
délai de quelques minutes ne posera pas de problème. Vous devez néanmoins |
|---|
| 740 |
vous assurer que ces opérations sont effectuées dans la bonne séquence et |
|---|
| 741 |
ne se recouvrent pas. |
|---|
| 742 |
</para> |
|---|
| 743 |
|
|---|
| 744 |
<para> |
|---|
| 745 |
Assurez-vous que votre sauvegarde inclut tous les fichiers du répertoire |
|---|
| 746 |
du groupe de bases de données (c'est-à-dire |
|---|
| 747 |
<filename>/usr/local/pgsql/data</>). Si vous utilisez des tablespaces |
|---|
| 748 |
qui ne se trouvent pas dans ce répertoire, faites attention à bien les |
|---|
| 749 |
inclure (et assurez-vous que votre sauvegarde archive les liens |
|---|
| 750 |
symboliques comme des liens, sinon la restauration posera problème pour |
|---|
| 751 |
les tablespaces). |
|---|
| 752 |
</para> |
|---|
| 753 |
|
|---|
| 754 |
<para> |
|---|
| 755 |
Néanmoins, vous devriez omettre de sauvegarder les fichiers du |
|---|
| 756 |
sous-répertoire <filename>pg_xlog/</> contenu dans le répertoire du |
|---|
| 757 |
groupe. Cette petite complication est intéressante parce qu'elle réduit le |
|---|
| 758 |
risque d'erreurs lors de la restauration. Ceci est facile à arranger si |
|---|
| 759 |
<filename>pg_xlog/</> est un lien symbolique pointant quelque part à |
|---|
| 760 |
l'extérieur du répertoire du groupe, ce qui est une configuration commune |
|---|
| 761 |
pour des raisons de performance. |
|---|
| 762 |
</para> |
|---|
| 763 |
|
|---|
| 764 |
<para> |
|---|
| 765 |
Pour utiliser cette sauvegarde, vous aurez besoin de conserver les |
|---|
| 766 |
fichiers segments WAL générés pendant ou après le lancement de la |
|---|
| 767 |
sauvegarde. Pour vous aider dans ce travail, la fonction |
|---|
| 768 |
<function>pg_stop_backup</> crée un <firstterm>fichier historique de la |
|---|
| 769 |
sauvegarde</> qui est immédiatement stocké dans l'aire des archives WAL. |
|---|
| 770 |
Ce fichier est nommé d'après le nom du premier fichier segment WAL dont |
|---|
| 771 |
vous avez besoin pour utiliser la sauvegarde. Par exemple, si le fichier |
|---|
| 772 |
WAL du début est <literal>0000000100001234000055CD</>, le fichier |
|---|
| 773 |
historique sera nommé quelque chose comme |
|---|
| 774 |
<literal>0000000100001234000055CD.007C9330.backup</> (le deuxième nombre |
|---|
| 775 |
dans le nom de ce fichier contient la position exacte à l'intérieur du fichier |
|---|
| 776 |
WAL et peut être habituellement ignorée). Une fois que vous avez archivé de |
|---|
| 777 |
façon sûre la sauvegarde du système de fichiers et les segments WAL utilisés |
|---|
| 778 |
pendant la sauvegarde (comme spécifié dans le fichier d'historique des |
|---|
| 779 |
sauvegardes), tous les segments WAL archivés avec des noms numériquement plus |
|---|
| 780 |
petits ne sont plus nécessaires pour la récupération de la sauvegarde du |
|---|
| 781 |
système de fichiers et pourraient être supprimés. Néanmoins, vous devriez |
|---|
| 782 |
penser à conserver plusieurs ensembles de sauvegarde pour être absolument |
|---|
| 783 |
certain de pouvoir récupérer vos données. Gardez en tête que seuls les fichiers |
|---|
| 784 |
WAL complets sont archivés, donc il y aura un délai entre l'exécution de |
|---|
| 785 |
<function>pg_stop_backup</> et l'archivage de tous les fichiers de segment |
|---|
| 786 |
WAL pour rendre la sauvegarde du système de fichiers cohérente. |
|---|
| 787 |
</para> |
|---|
| 788 |
|
|---|
| 789 |
<para> |
|---|
| 790 |
Le fichier d'historique de la sauvegarde est un simple fichier texte. Il |
|---|
| 791 |
contient le label que vous avez donné à <function>pg_start_backup</>, ainsi |
|---|
| 792 |
que l'heure de début et de fin de la sauvegarde. Si vous utilisez le label |
|---|
| 793 |
pour identifier où le fichier de sauvegarde associé est conservé, alors le |
|---|
| 794 |
fichier historique archivé est suffisant pour vous dire quel fichier de |
|---|
| 795 |
sauvegarde restaurer, si vous en avez besoin. |
|---|
| 796 |
</para> |
|---|
| 797 |
|
|---|
| 798 |
<para> |
|---|
| 799 |
Comme vous devez conserver tous les fichiers WAL archivés depuis votre |
|---|
| 800 |
dernière sauvegarde de base, l'intervalle entre les sauvegardes de base |
|---|
| 801 |
devrait habituellement être choisie suivant la quantité de stockage que |
|---|
| 802 |
vous voulez consommer en fichiers archives WAL. Vous devriez aussi |
|---|
| 803 |
considérer combien de temps vous êtes prêt à dépenser pendant la |
|---|
| 804 |
récupération, si celle-ci est nécessaire — le système devra rejouer |
|---|
| 805 |
tous les segments WAL et ceci peut prendre beaucoup de temps si la |
|---|
| 806 |
dernière sauvegarde de base est ancienne. |
|---|
| 807 |
</para> |
|---|
| 808 |
|
|---|
| 809 |
<para> |
|---|
| 810 |
Il est aussi important de noter que la fonction |
|---|
| 811 |
<function>pg_start_backup</> crée un fichier nommé |
|---|
| 812 |
<filename>backup_label</> dans le répertoire du groupe de bases de données |
|---|
| 813 |
qui est ensuite supprimé de nouveau par <function>pg_stop_backup</>. Ce |
|---|
| 814 |
fichier sera bien sûr archivé comme faisant parti du fichier de |
|---|
| 815 |
sauvegarde. Le fichier label de la sauvegarde inclut la chaîne label que |
|---|
| 816 |
vous avez donné à <function>pg_start_backup</>, ainsi que l'heure à |
|---|
| 817 |
laquelle <function>pg_start_backup</> a été exécuté et le nom du fichier |
|---|
| 818 |
WAL du début. En cas de confusion, il sera du coup possible de regarder |
|---|
| 819 |
dans le fichier sauvegarde et de déterminer exactement de quelle session |
|---|
| 820 |
de sauvegarde provient ce fichier. |
|---|
| 821 |
</para> |
|---|
| 822 |
|
|---|
| 823 |
<para> |
|---|
| 824 |
Il est aussi possible de faire une sauvegarde alors que le postmaster est |
|---|
| 825 |
arrêté. Dans ce cas, vous ne pouvez évidemment pas utiliser |
|---|
| 826 |
<function>pg_start_backup</> ou <function>pg_stop_backup</> et vous serez |
|---|
| 827 |
donc contraint à garder trace vous-même des fichiers de sauvegarde et de |
|---|
| 828 |
jusqu'où vont les fichiers WAL associés. Il est généralement mieux de |
|---|
| 829 |
suivre la procédure de sauvegarde à chaud ci-dessus. |
|---|
| 830 |
</para> |
|---|
| 831 |
</sect2> |
|---|
| 832 |
|
|---|
| 833 |
<sect2 id="backup-pitr-recovery"> |
|---|
| 834 |
<title>Récupérer à partir d'une sauvegarde à chaud</title> |
|---|
| 835 |
|
|---|
| 836 |
<para> |
|---|
| 837 |
OK, le pire est arrivé et vous avez besoin de récupérer votre sauvegarde. |
|---|
| 838 |
Voici la procédure : |
|---|
| 839 |
<orderedlist> |
|---|
| 840 |
<listitem> |
|---|
| 841 |
<para> |
|---|
| 842 |
Arrêtez le postmaster s'il est en cours d'exécution. |
|---|
| 843 |
</para> |
|---|
| 844 |
</listitem> |
|---|
| 845 |
<listitem> |
|---|
| 846 |
<para> |
|---|
| 847 |
Si vous avez de la place pour le faire, copiez le répertoire entier des |
|---|
| 848 |
données du groupe et tout tablespace dans un emplacement temporaire |
|---|
| 849 |
au cas où vous en auriez besoin plus tard. Notez que cette précaution |
|---|
| 850 |
demandera que vous ayez assez de place libre sur votre système pour |
|---|
| 851 |
contenir deux copies de votre base de données existante. Si vous n'avez |
|---|
| 852 |
pas assez de place, vous devez au moins copier le contenu du |
|---|
| 853 |
sous-répertoire <filename>pg_xlog</> du répertoire des données car il |
|---|
| 854 |
pourrait contenir des journaux qui n'ont pas été archivés avant l'arrêt |
|---|
| 855 |
du serveur. |
|---|
| 856 |
</para> |
|---|
| 857 |
</listitem> |
|---|
| 858 |
<listitem> |
|---|
| 859 |
<para> |
|---|
| 860 |
Effacez tous les fichier et sous-répertoires existants sous le |
|---|
| 861 |
répertoire des données du groupe et sous les répertoires racines des |
|---|
| 862 |
tablespaces que vous utilisez. |
|---|
| 863 |
</para> |
|---|
| 864 |
</listitem> |
|---|
| 865 |
<listitem> |
|---|
| 866 |
<para> |
|---|
| 867 |
Restaurez les fichiers de la base de données à partir de votre |
|---|
| 868 |
sauvegarde. Faites attention à ce qu'ils soient restaurés avec le bon |
|---|
| 869 |
propriétaire (l'utilisateur système de la base de données, et non pas |
|---|
| 870 |
root !) et avec les bons droits. Si vous utilisez les espaces |
|---|
| 871 |
logiques, vous vérifirez que les liens symboliques dans |
|---|
| 872 |
<filename>pg_tblspc/</> ont été correctement restaurés. |
|---|
| 873 |
</para> |
|---|
| 874 |
</listitem> |
|---|
| 875 |
<listitem> |
|---|
| 876 |
<para> |
|---|
| 877 |
Supprimez tout fichier présent dans <filename>pg_xlog/</> ; ils |
|---|
| 878 |
proviennent de la sauvegarde et sont du coup probablement obsolètes. |
|---|
| 879 |
Si vous n'avez pas archivé <filename>pg_xlog/</> du tout, alors |
|---|
| 880 |
re-créez ce répertoire ainsi que le sous-répertoire |
|---|
| 881 |
<filename>pg_xlog/archive_status/</>. |
|---|
| 882 |
</para> |
|---|
| 883 |
</listitem> |
|---|
| 884 |
<listitem> |
|---|
| 885 |
<para> |
|---|
| 886 |
Si vous aviez des fichiers segments WAL non archivés que vous avez |
|---|
| 887 |
sauvegardé dans l'étape 2, copiez-les dans <filename>pg_xlog/</> (il |
|---|
| 888 |
est mieux de les copier, pas de les déplacer, car vous aurez toujours les |
|---|
| 889 |
fichiers non modifiés si un problème survient et que vous devez |
|---|
| 890 |
recommencer). |
|---|
| 891 |
</para> |
|---|
| 892 |
</listitem> |
|---|
| 893 |
<listitem> |
|---|
| 894 |
<para> |
|---|
| 895 |
Créez un fichier de commandes de récupération |
|---|
| 896 |
<filename>recovery.conf</> dans le répertoire des données du groupe |
|---|
| 897 |
(voir <xref linkend="recovery-config-settings">). De plus, vous pourriez |
|---|
| 898 |
vouloir modifier temporairement <filename>pg_hba.conf</> pour empêcher |
|---|
| 899 |
les utilisateurs ordinaires de se connecter tant que vous n'êtes pas |
|---|
| 900 |
certain que la récupération a réussi. |
|---|
| 901 |
</para> |
|---|
| 902 |
</listitem> |
|---|
| 903 |
<listitem> |
|---|
| 904 |
<para> |
|---|
| 905 |
Lancez le postmaster. Le postmaster se trouvera en mode récupération et |
|---|
| 906 |
commencera la lecture des fichiers WAL archivés dont il a besoin. À la |
|---|
| 907 |
fin du processus de récupération, le postmaster renommera |
|---|
| 908 |
<filename>recovery.conf</> en <filename>recovery.done</> (pour empêcher |
|---|
| 909 |
de retourner accidentellement en mode de récupération dans le cas d'un |
|---|
| 910 |
arrêt brutal un peu plus tard), puis commencera les opérations normales |
|---|
| 911 |
de la base de données. |
|---|
| 912 |
</para> |
|---|
| 913 |
</listitem> |
|---|
| 914 |
<listitem> |
|---|
| 915 |
<para> |
|---|
| 916 |
Inspectez le contenu de la base de données pour vous assurer que vous |
|---|
| 917 |
avez récupéré ce que vous vouliez. Sinon, retournez à l'étape 1. Si |
|---|
| 918 |
tout va bien, laissez vos utilisateurs venir en restaurant le fichier |
|---|
| 919 |
<filename>pg_hba.conf</> à son état normal. |
|---|
| 920 |
</para> |
|---|
| 921 |
</listitem> |
|---|
| 922 |
</orderedlist> |
|---|
| 923 |
</para> |
|---|
| 924 |
|
|---|
| 925 |
<para> |
|---|
| 926 |
La partie clé de tout ceci est de configurer le fichier de commandes de |
|---|
| 927 |
récupération. Il décrit comment vous voulez récupérer et à quel point la |
|---|
| 928 |
récupération doit fonctionner. Vous pouvez utiliser |
|---|
| 929 |
<filename>recovery.conf.sample</> (normalement présent dans le |
|---|
| 930 |
répertoire d'installation <filename>share/</>) comme prototype. La seule |
|---|
| 931 |
chose que vous devez absolument spécifier dans |
|---|
| 932 |
<filename>recovery.conf</> est <varname>restore_command</> indiquant à |
|---|
| 933 |
<productname>PostgreSQL</> comment récupérer les fichiers segments WAL |
|---|
| 934 |
archivés. Comme <varname>archive_command</>, ceci est une chaîne contenant |
|---|
| 935 |
le nom de la commande. Elle pourrait contenir <literal>%f</>, qui est |
|---|
| 936 |
remplacé par le nom du journal souhaité, et <literal>%p</>, qui est |
|---|
| 937 |
remplacé par le chemin absolu où copier le journal. Écrivez |
|---|
| 938 |
<literal>%%</> si vous avez besoin d'embarquer un vrai caractère |
|---|
| 939 |
<literal>%</> dans la commande. La commande utile la plus simple est |
|---|
| 940 |
quelque chose comme |
|---|
| 941 |
<programlisting> |
|---|
| 942 |
restore_command = 'cp /mnt/serveur/répertoire_archive/%f %p' |
|---|
| 943 |
</programlisting> |
|---|
| 944 |
qui copiera les segments WAL précédemment archivés à partir du répertoire |
|---|
| 945 |
<filename>/mnt/serveur/répertoire_archive</>. Vous pourriez bien sûr |
|---|
| 946 |
utiliser quelque chose de plus compliqué, peut-être même un script shell |
|---|
| 947 |
qui demandera à l'utilisateur de monter la cassette appropriée. |
|---|
| 948 |
</para> |
|---|
| 949 |
|
|---|
| 950 |
<para> |
|---|
| 951 |
Il est important que la commande renvoie un code de sortie différent de |
|---|
| 952 |
zéro en cas d'échec. La commande <emphasis>se verra demander</> les |
|---|
| 953 |
journaux absents de l'archive ; il doit renvoyer autre chose que |
|---|
| 954 |
zéro dans ce cas. Ceci n'est pas une condition d'erreur. Soyez conscient |
|---|
| 955 |
que le nom de base du chemin <literal>%p</> sera différent de |
|---|
| 956 |
<literal>%f</> ; ne vous attendez pas à ce qu'ils soient |
|---|
| 957 |
interchangeables. |
|---|
| 958 |
</para> |
|---|
| 959 |
|
|---|
| 960 |
<para> |
|---|
| 961 |
Les segments WAL qui n'ont pas pu être trouvés dans l'archive seront |
|---|
| 962 |
recherchés dans <filename>pg_xlog/</> ; cela autorise l'utilisation |
|---|
| 963 |
des segments non archivés. Néanmoins, les segments disponibles à partir de |
|---|
| 964 |
l'archive seront utilisés de préférence par rapport aux fichiers dans |
|---|
| 965 |
<filename>pg_xlog/</>. Le système ne surchargera pas le contenu existant |
|---|
| 966 |
de <filename>pg_xlog/</> lors de la récupération des fichiers archivés. |
|---|
| 967 |
</para> |
|---|
| 968 |
|
|---|
| 969 |
<para> |
|---|
| 970 |
Normalement, la récupération traitera tous les segments WAL disponibles, |
|---|
| 971 |
restaurant du coup la base de données à cet instant (ou aussi proche que |
|---|
| 972 |
nous le pouvons suivant les segments WAL disponibles). Mais, si vous |
|---|
| 973 |
voulez récupérer à un instant particulier (disons, juste avant que |
|---|
| 974 |
l'administrateur junior ait supprimé votre table principale de |
|---|
| 975 |
transaction), spécifiez simplement le point d'arrêt requis dans |
|---|
| 976 |
<filename>recovery.conf</>. Vous pouvez spécifier le point d'arrêt, connu |
|---|
| 977 |
sous le nom de <quote>cible de récupération</>, soit par la date/heure |
|---|
| 978 |
soit par l'ID de la dernière transaction. Au moment où nous écrivons ceci, |
|---|
| 979 |
seule l'option date/heure est tout à fait utilisable car il n'existe pas |
|---|
| 980 |
d'outils pour vous aider à identifier avec une certaine précision l'ID de |
|---|
| 981 |
transaction à utiliser. |
|---|
| 982 |
</para> |
|---|
| 983 |
|
|---|
| 984 |
<note> |
|---|
| 985 |
<para> |
|---|
| 986 |
Le point d'arrêt doit se situer après l'heure de fin de la sauvegarde |
|---|
| 987 |
de base (le moment de <function>pg_stop_backup</>). Vous ne pouvez pas |
|---|
| 988 |
utiliser une sauvegarde de base pour récupérer à un tel instant où la |
|---|
| 989 |
sauvegarde était encore en cours (pour récupérer jusqu'à cet instant, |
|---|
| 990 |
vous devez récupérer votre sauvegarde de base précédente et recommencer |
|---|
| 991 |
à partir de là). |
|---|
| 992 |
</para> |
|---|
| 993 |
</note> |
|---|
| 994 |
|
|---|
| 995 |
<sect3 id="recovery-config-settings" xreflabel="Configuration de la récupération"> |
|---|
| 996 |
<title>Configuration de la récupération</title> |
|---|
| 997 |
|
|---|
| 998 |
<para> |
|---|
| 999 |
Ces configurations peuvent seulement être placées dans le fichier |
|---|
| 1000 |
<filename>recovery.conf</> et s'appliquent seulement pour la durée de la |
|---|
| 1001 |
récupération. Ils doivent être réinitialisés pour toute récupération |
|---|
| 1002 |
ultérieure que vous souhaitez réaliser. Ils ne peuvent pas être modifiés |
|---|
| 1003 |
une fois que la récupération a commencé. |
|---|
| 1004 |
</para> |
|---|
| 1005 |
|
|---|
| 1006 |
<variablelist> |
|---|
| 1007 |
|
|---|
| 1008 |
<varlistentry id="restore-command" xreflabel="restore_command"> |
|---|
| 1009 |
<term><varname>restore_command</varname> (<type>string</type>)</term> |
|---|
| 1010 |
<listitem> |
|---|
| 1011 |
<para> |
|---|
| 1012 |
La commande shell à exécuter pour récupérer un segment archivé de la |
|---|
| 1013 |
série de fichiers WAL. Ce paramètre es |
|---|