root/traduc/branches/bv747/manuel/backup.sgml

Revision 109, 20.6 kB (checked in by gleu, 3 years ago)

Relecture des chapitres 23 à 27 (fin de la partie III).

Line 
1 <!--
2 $Header: /var/lib/cvs/pgsql-fr/sgml/backup.sgml,v 1.7.2.1 2005/03/20 22:34:39 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 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 et les suppositions sous-jacentes à celle-ci.
14  </para>
15
16  <para>
17   Il y a deux approches fondamentalement différentes pour sauvegarder les
18   données de <productname>PostgreSQL</>&nbsp;:
19   <itemizedlist>
20    <listitem><para><acronym>Sauvegarde SQL&nbsp;;</></para></listitem>
21    <listitem><para>Sauvegarde de niveau système de fichiers.</para></listitem>
22   </itemizedlist>
23  </para>
24
25  <sect1 id="backup-dump">
26   <title>Sauvegarde <acronym>SQL</></title>
27
28   <para>
29    Le principe est de générer un fichier texte de commandes SQL (appelé
30    <quote>fichier dump</quote>), qui, si on le renvoie au serveur, recrée une
31    base de données identique à celle sauvegardée.
32    <productname>PostgreSQL</> propose pour cela le programme utilitaire
33    <application>pg_dump</>. L'usage basique est&nbsp;:
34 <synopsis>
35 pg_dump <replaceable class="parameter">base_de_donnees</replaceable> &gt; <replaceable class="parameter">fichier_de_sortie</replaceable>
36 </synopsis>
37    Comme vous le voyez, <application>pg_dump</> écrit son résultat sur la sortie standard.
38    Nous verrons plus loin que cela peut être pratique.
39   </para>
40
41   <para>
42    <application>pg_dump</> est un programme client <productname>PostgreSQL</>
43    classique (mais plutôt intelligent). Ceci veut dire que vous pouvez
44    faire une sauvegarde depuis n'importe quel ordinateur ayant accès à la base.
45    Mais rappelez-vous que <application>pg_dump</> n'a pas de droits spéciaux.
46    En particulier, vous devez avoir accès en lecture à toutes les tables que
47    vous voulez sauvegarder, si bien qu'en pratique vous devez pratiquement
48    toujours être le super-utilisateur de la base.
49   </para>
50
51   <para>
52    Pour préciser quel serveur de bases de données <application>pg_dump</> doit
53    contacter, utilisez les options de ligne de commande <option>-h
54    <replaceable>serveur</></> et <option>-p <replaceable>port</></>.
55    Le serveur par défaut est le serveur local, ou bien celui spécifié par la
56    variable d'environnement <envar>PGHOST</envar>.
57    De la même façon, le port par défaut est indiqué par la variable d'environnement
58    <envar>PGPORT</envar> ou, en son absence, par la valeur par défaut précisée
59    à la compilation. Heureusement, la serveur a normalement la même valeur par
60    défaut à la compilation.
61   </para>
62
63   <para>
64    Comme tout programme client <productname>PostgreSQL</>, <application>pg_dump</>
65    se connecte par défaut avec l'utilisateur de base de données de même nom que
66    l'utilisateur système courant. Pour passer outre, précisez l'option
67    <option>-U</option> ou donnez une valeur à la variable d'environnement
68    <envar>PGUSER</envar>. Rappelez-vous que les connexions de
69    <application>pg_dump</> sont soumises aux mécanismes normaux
70    d'authentification des programmes clients (qui sont décrits dans le <xref
71    linkend="client-authentication">).
72   </para>
73
74   <para>
75    Les sauvegardes créées par <application>pg_dump</> sont cohérentes, ce
76    qui veut dire que les modifications effectuées alors que <application>pg_dump</>
77    est en cours de fonctionnement ne sont pas dans le fichier de résultat.
78    <application>pg_dump</> ne bloque pas les autres opérations sur la base
79    lorsqu'il fonctionne (sauf celles qui ont besoin d'un verrou exclusif, comme
80    <command>VACUUM FULL</command>.)
81   </para>
82
83   <important>
84    <para>
85     Lorsque votre base de données dépend des OID (par exemple en tant que clés
86     étrangères), vous devez indiquer à <application>pg_dump</> de sauvegarder
87     aussi les OID. Pour cela, utilisez l'option <option>-o</option> sur la ligne
88     de commande.
89     Les <quote>gros objets</> ne sont pas non plus sauvegardés par défaut.
90     Consultez la page de référence de la commande <application>pg_dump</> si vous
91     utilisez les <quote>gros objets</>.
92    </para>
93   </important>
94
95   <sect2 id="backup-dump-restore">
96    <title>Restaurer la sauvegarde</title>
97
98    <para>
99     Les fichiers texte créés par <application>pg_dump</> sont prévus pour être
100     lus par le programme <application>psql</application>. La syntaxe générale
101     d'une commande de restauration est
102 <synopsis>
103 psql <replaceable class="parameter">base_de_donnees</replaceable> &lt; <replaceable class="parameter">fichier_d_entree</replaceable>
104 </synopsis>
105     où <replaceable class="parameter">fichier_d_entree</replaceable> est ce que
106     vous avez précisé comme <replaceable class="parameter">fichier_de_sortie</replaceable>
107     à la commande <command>pg_dump</>. La base de données
108     <replaceable class="parameter">base_de_donnees</replaceable> n'est pas créée par cette
109     commande. Vous devez la créer vous-même à partir de <literal>template0</>
110     avant d'exécuter <application>psql</> (par exemple avec <literal>createdb -T
111     template0 <replaceable class="parameter">base_de_donnees</></literal>).
112     <application>psql</> propose des options similaires à celles de
113     <application>pg_dump</> pour contrôler l'emplacement du serveur de bases de
114     données et le nom d'utilisateur. Voyez sa page de référence pour plus
115     d'informations.
116     </para>
117
118    <para>
119     Si les objets de la base de données originale appartenaient à plusieurs
120     utilisateurs, alors le fichier de sauvegarde ordonne à <application>psql</>
121     de se connecter comme chacun de ces utilisateurs tour à tour et crée 
122     les objets correspondants.
123     Ainsi, le propriétaire initial est maintenu. Cela signifie
124     aussi, cependant, que tous ces utilisateurs doivent déjà exister et que
125     vous devez avoir le droit de vous connecter comme chacun d'entre eux.
126     Il peut être nécessaire pour cela de relâcher temporairement les règles
127     d'identification des clients.
128    </para>
129
130    <para>
131     Il est recommandé de lancer <command>ANALYZE</> sur
132     chacune des bases de données restaurées, afin que l'optimiseur de requêtes
133     dispose de statistiques utiles. Vous pouvez aussi lancer la commande
134     <command>vacuumdb -a -z</> pour lancer <command>ANALYZE</> sur toutes les
135     bases de données.
136    </para>
137
138    <para>
139     La capacité de <application>pg_dump</> et <application>psql</> à écrire
140     et à lire dans des tubes permet de sauvegarder une base de données
141     directement d'un serveur sur un autre. Par exemple&nbsp;:
142 <programlisting>
143 pg_dump -h <replaceable>serveur1</> <replaceable>base_de_donnees</> | psql -h <replaceable>serveur2</> <replaceable>base_de_donnees</>
144 </programlisting>
145    </para>
146
147    <important>
148     <para>
149      Les fichiers de sauvegarde produits par <application>pg_dump</> sont
150      relatifs à <literal>template0</>. Cela signifie que chaque langage,
151      procédure, etc. ajoutés à <literal>template1</> seront aussi sauvegardés
152      par <application>pg_dump</>. En conséquence, si vous utilisez une base
153      <literal>template1</> modifiée, vous devez créer la base vide à partir de
154      <literal>template0</>, comme dans l'exemple précédent.
155     </para>
156    </important>
157
158    <tip>
159     <para>
160     La vitesse de restauration peut être améliorée en augmentant le paramètre
161     <varname>sort_mem</varname> (voir la <xref
162     linkend="runtime-config-resource-memory">).
163     </para>
164    </tip>
165
166   </sect2>
167
168   <sect2 id="backup-dump-all">
169    <title>Utilisation de <command>pg_dumpall</></title>
170
171    <para>
172     Le mécanisme précédent est peu pratique pour sauvegarder un serveur de bases
173     de données complet. <application>pg_dumpall</> est prévu pour cela.
174     <application>pg_dumpall</> sauvegarde toutes les bases de données d'un groupe
175     de bases de données <productname>PostgreSQL</> (appelé cluster) et préserve
176     les données communes au groupe de bases comme les utilisateurs et les
177     groupes. La syntaxe d'appel est simplement
178 <synopsis>
179 pg_dumpall &gt; <replaceable>fichier_de_sortie</>
180 </synopsis>
181     Le fichier de sauvegarde résultant peut être restauré avec <application>psql</>&nbsp;:
182 <synopsis>
183 psql template1 &lt; <replaceable class="parameter">fichier_d_entree</replaceable>
184 </synopsis>
185     (Vous pouvez utiliser n'importe quelle base de données pour vous
186     connecter mais si vous êtes en train de recharger un serveur vide,
187     <literal>template1</> est la seule base de données disponible.)
188     Il faut obligatoirement être le super-utilisateur de la base pour restaurer
189     une sauvegarde faite avec <application>pg_dumpall</>, pour pouvoir restaurer
190     les informations sur les utilisateurs et les groupes.
191    </para>
192   </sect2>
193
194   <sect2 id="backup-dump-large">
195    <title>Grosses bases de données</title>
196
197    <para>
198     Comme <productname>PostgreSQL</productname> permet que des tables soient plus
199     grandes que la taille maximale d'un fichier sur votre système de fichiers,
200     sauvegarder une telle table en fichier peut poser des problèmes.
201     Comme <application>pg_dump</> peut écrire sur la sortie standard, vous pouvez
202     utiliser des outils standard d'Unix pour contourner ce problème éventuel.
203    </para>
204
205    <formalpara>
206     <title>Compresser le fichier de sauvegarde</title>
207     <para>
208      Vous pouvez utiliser votre programme de compression habituel. Par exemple
209      <application>gzip</application>.
210
211 <programlisting>
212 pg_dump <replaceable class="parameter">base_de_donnees</replaceable> | gzip &gt; <replaceable class="parameter">nom_fichier</replaceable>.gz
213 </programlisting>
214
215      Pour restaurer&nbsp;:
216
217 <programlisting>
218 createdb <replaceable class="parameter">base_de_donnees</replaceable>
219 gunzip -c <replaceable class="parameter">nom_fichier</replaceable>.gz | psql <replaceable class="parameter">base_de_donnees</replaceable>
220 </programlisting>
221
222      ou
223
224 <programlisting>
225 cat <replaceable class="parameter">nom_fichier</replaceable>.gz | gunzip | psql <replaceable class="parameter">base_de_donnees</replaceable>
226 </programlisting>
227     </para>
228    </formalpara>
229
230    <formalpara>
231     <title>Couper le fichier avec <command>split</></title>
232     <para>
233      La commande <command>split</command> vous permet de découper le fichier en
234      morceaux d'une taille acceptable pour le système de fichiers sous-jacent.
235      Par exemple, pour faire des morceaux de 1&nbsp;Mo&nbsp;:
236  
237 <programlisting>
238 pg_dump <replaceable class="parameter">base_de_donnees</replaceable> | split -b 1m - <replaceable class="parameter">nom_fichier</replaceable>
239 </programlisting>
240
241      Pour restaurer&nbsp;:
242
243 <programlisting>
244 createdb <replaceable class="parameter">base_de_donnees</replaceable>
245 cat <replaceable class="parameter">nom_fichier</replaceable>* | psql <replaceable class="parameter">base_de_donnees</replaceable>
246 </programlisting>
247     </para>
248    </formalpara>
249
250    <formalpara>
251     <title>Utilisation du format de sauvegarde spécial</title>
252     <para>
253      Si <productname>PostgreSQL</productname> est installé sur un système où la
254      bibliothèque de compression <application>zlib</> est disponible, ce format
255      de sauvegarde spécial peut être utilisé. Pour les grandes bases de données,
256      cela produira un fichier de sauvegarde d'une taille comparable à celle de
257      <command>gzip</command>, avec l'avantage supplémentaire de permettre de
258      restaurer des tables sélectivement. La commande qui suit sauvegarde une
259      base de données en utilisant le format de sauvegarde spécial&nbsp;:
260  
261 <programlisting>
262 pg_dump -Fc <replaceable class="parameter">base_de_donnees</replaceable> > <replaceable class="parameter">nom_fichier</replaceable>
263 </programlisting>
264
265      Voyez les pages de référence de <application>pg_dump</> et <application>pg_restore</> pour plus de détails.
266     </para>
267    </formalpara>
268
269   </sect2>
270
271   <sect2 id="backup-dump-caveats">
272    <title>Limitations</title>
273
274    <para>
275     <application>pg_dump</> (et du coup
276     <application>pg_dumpall</>) a un certain nombre de limitations dûes à la
277     difficulté de reconstruire certaines informations du catalogue système.
278    </para>
279
280    <para>
281     Notamment, l'ordre dans lequel <application>pg_dump</> écrit les objets
282     n'est pas très sophistiqué. Cela peut créer des problèmes, par exemple
283     quand des fonctions sont utilisées pour préciser les valeurs par défaut
284     de colonnes. La seule solution est alors de réordonner le fichier de
285     sauvegarde à la main. Si vous avez créé des références circulaires dans
286     votre modèle de données, alors vous aurez encore plus de travail.
287    </para>
288
289    <para>
290     Pour des raisons de compatibilité avec les versions précédentes, <application>pg_dump</>
291     ne sauvegarde pas les gros objets par défaut. <indexterm><primary>gros
292     objets</primary><secondary>backup</secondary></indexterm> Pour
293     les sauvegarder, vous devez utiliser soit le format de sauvegarde
294     spécial soit le format TAR, et passer l'option <option>-b</> à
295     <application>pg_dump</>. Voyez la page de référence pour plus de détails.
296     Le répertoire <filename>contrib/pg_dumplo</> des fichiers sources de <productname>PostgreSQL</>
297     contient aussi un programme qui peut sauvegarder les gros objets.
298   </para>
299
300    <para>
301     Merci de vous familiariser avec la page de référence de
302     <citerefentry><refentrytitle>pg_dump</></>.
303    </para>
304   </sect2>
305  </sect1>
306
307  <sect1 id="backup-file">
308   <title>Sauvegarde de niveau système de fichiers</title>
309
310   <para>
311    Une autre stratégie de sauvegarde est de copier les fichiers
312    utilisés par <productname>PostgreSQL</> pour enregistrer les données.
313    Dans la <xref linkend="creating-cluster">, l'emplacement de ces
314    fichiers sont donnés mais vous les avez probablement déjà trouvés si vous
315    vous intéressez à cette méthode. Vous pouvez utiliser n'importe quelle
316    méthode de sauvegarde, par exemple&nbsp;:
317  
318 <programlisting>
319 tar -cf sauvegarde.tar /usr/local/pgsql/data
320 </programlisting>
321   </para>
322
323   <para>
324    Cependant, il y a deux restrictions qui rendent cette méthode inutilisable
325    ou en tout cas inférieure à la méthode <application>pg_dump</>.
326  
327    <orderedlist>
328     <listitem>
329      <para>
330       Le serveur de base de données <emphasis>doit</> être arrêté pour obtenir
331       une sauvegarde utilisable. Toutes les demi-mesures, comme supprimer
332       toutes les connections, ne fonctionnent pas, car il y a toujours des
333       données dans des tampons en mémoire.
334       Pour cette raison, il n'est pas conseillé de se reposer sur des systèmes
335       de fichiers qui affirment permettre des <quote>photographies cohérentes
336       (snapshot)</quote>.
337       Vous trouverez des informations sur la façon d'arrêter le serveur
338       <productname>PostgreSQL</> dans la <xref linkend="postmaster-shutdown">.
339     </para>
340
341      <para>
342       Il va sans dire que vous devez aussi éteindre le serveur avant de
343       restaurer les données.
344       </para>
345     </listitem>
346
347     <listitem>
348      <para>
349       Si vous vous êtes aventurés dans les détails de l'organisation des
350       fichiers de données, vous pouvez être tentés de ne sauvegarder et
351       de ne restaurer que certaines tables ou bases de données particulières.
352       Ceci ne fonctionnera <emphasis>pas</> parce que les informations
353       contenues dans ces fichiers ne sont qu'à moitié vraies. L'autre moitié
354       est dans les fichiers journaux de validation
355       <filename>pg_clog/*</filename>, qui
356       contiennent l'état de la validation de chaque transaction. Un fichier de
357       table n'est utilisable qu'avec cette information. Bien entendu, il est
358       impossible de ne restaurer qu'une table et les données <filename>pg_clog</filename>
359       associées car cela rendrait toutes les autres tables du serveur
360       inutilisables.
361      </para>
362     </listitem>
363    </orderedlist>
364   </para>
365
366   <para>
367    Une autre approche de sauvegarde d'un système de fichiers est de réaliser une
368    <quote>copie cohérente</quote> du répertoire data, si le système de fichiers
369    dispose de cette fonctionnalité. Une telle copie sauvegardera les fichiers de
370    la base de données dans un état où le serveur n'était pas correctement
371    arrêté&nbsp;; donc, avant de se retrouver dans un état normal après avoir
372    lancé le serveur sur ce répertoire sauvegardé, le serveur pensera qu'il s'est
373    arrêté brutalement et voudra rejouer les traces WAL. Ceci n'est pas un problème
374    mais vous devez en être conscient.
375   </para>
376
377   <para>
378    Notez aussi qu'une sauvegarde des fichiers de données ne sera pas forcément
379    moins grosse qu'une sauvegarde SQL. Au contraire, elle sera très certainement
380    plus  grande (<application>pg_dump</application> ne sauvegarde pas le
381    contenu des index, mais la commande pour les recréer).
382   </para>
383
384  </sect1>
385
386  <sect1 id="migration">
387   <title>Migration entre les différentes versions</title>
388
389   <indexterm zone="migration">
390    <primary>mise à jour</primary>
391   </indexterm>
392
393   <indexterm zone="migration">
394    <primary>version</primary>
395    <secondary>compatibilité</secondary>
396   </indexterm>
397
398   <para>
399    En règle générale, le format interne des données est modifié entre les
400    différentes versions de <productname>PostgreSQL</> (quand le nombre après le
401    premier point change). Ceci ne s'applique pas entre les différentes sorties
402    mineures ayant le même numéro de version majeur (quand le nombre après le
403    deuxième point change)&nbsp;; elles ont toujours un format de stockage
404    compatible.
405    Par exemple, les versions 7.0.1, 7.1.2 et 7.2 ne sont pas compatibles, alors
406    que les versions 7.1.1 et 7.1.2 le sont. Lorsque vous migrez entre des
407    versions compatibles, vous pouvez simplement réutiliser les anciens fichiers
408    de données avec les nouveaux exécutables. Sinon, vous devez <quote>sauvegarder</>
409    et <quote>restaurer</> vos données sur le nouveau serveur avec <application>pg_dump</>
410    (Des vérifications sont faites pour vous éviter de faire des mauvaises
411    manipulations, si bien que rien de dangereux ne peut arriver si vous vous
412    trompez.). La procédure d'installation précise n'est pas le sujet de cette
413    section. Les détails se trouvent dans le <xref linkend="installation">.
414    </para>
415
416   <para>
417    Vous minimiserez la durée d'indisponibilité en installant le nouveau serveur
418    dans un répertoire différent et en lançant l'ancien et le nouveau serveur en
419    parallèle sur des ports différents, puis en utilisant des commandes comme
420  
421 <programlisting>
422 pg_dumpall -p 5432 | psql -d template1 -p 6543
423 </programlisting>
424
425    pour transférer les données. Ou utilisez un fichier intermédiaire si vous
426    voulez. Vous pouvez alors éteindre le nouveau serveur et démarrer le nouveau
427    sur le port que l'ancien utilisait. Vous devez vous assurer que la base de
428    données n'est pas modifiée après que vous ayez lancé
429    <application>pg_dumpall</>, sans quoi ces modifications seraient évidemment
430    perdues. Référez vous au <xref linkend="client-authentication"> pour savoir
431    comment interdire l'accès. En pratique, vous voudrez certainement tester
432    votre application sur le nouveau serveur avant de basculer définitivement.
433   </para>
434
435   <para>
436    Si vous ne pouvez pas ou ne voulez pas lancer les deux serveurs en
437    parallèle, vous pouvez faire l'étape de sauvegarde avant d'installer la
438    nouvelle version, éteindre le serveur, déplacer l'ancienne version à un autre
439    endroit, installer la nouvelle, la démarrer et enfin restaurer les données. Par
440    exemple&nbsp;:
441    
442 <programlisting>
443 pg_dumpall > sauvegarde.sql
444 pg_ctl stop
445 mv /usr/local/pgsql /usr/local/pgsql.old
446 cd ~/postgresql-&version;
447 gmake install
448 initdb -D /usr/local/pgsql/data
449 postmaster -D /usr/local/pgsql/data
450 psql template1 < sauvegarde.sql
451 </programlisting>
452
453    Vous trouverez les méthodes pour arrêter et démarrer les serveurs, ainsi que
454    d'autres détails dans le <xref linkend="runtime">.
455    Les instructions d'installation vous donneront des conseils sur les endroits
456    stratégiques pour réaliser ces opérations.
457   </para>
458
459   <note>
460    <para>
461     Quand vous <quote>déplacez l'ancienne version à un autre endroit</quote>,
462     l'ancienne installation n'est plus tout à fait utilisable. Certaines parties
463     de l'installation contiennent des informations sur l'endroit où d'autres
464     parties sont installées. Ce n'est généralement pas un gros problème, mais si
465     vous prévoyez d'utiliser deux installations en parallèle pendant un certain
466     temps, vous devriez leur donner des répertoires d'installation différents
467     lors de la compilation.
468    </para>
469   </note>
470  </sect1>
471 </chapter>
472
473 <!-- Keep this comment at the end of the file
474 Local variables:
475 mode:sgml
476 sgml-omittag:nil
477 sgml-shorttag:t
478 sgml-minimize-attributes:nil
479 sgml-always-quote-attributes:t
480 sgml-indent-step:1
481 sgml-indent-tabs-mode:nil
482 sgml-indent-data:t
483 sgml-parent-document:nil
484 sgml-default-dtd-file:"./reference.ced"
485 sgml-exposed-tags:nil
486 sgml-local-catalogs:("/usr/share/sgml/catalog")
487 sgml-local-ecat-files:nil
488 End:
489 -->
490
Note: See TracBrowser for help on using the browser.