]> granicus.if.org Git - postgresql/blob - doc/src/sgml/backup.sgml
Add support for forcing a switch to a new xlog file; cause such a switch
[postgresql] / doc / src / sgml / backup.sgml
1 <!-- $PostgreSQL: pgsql/doc/src/sgml/backup.sgml,v 2.82 2006/08/06 03:53:43 tgl Exp $ -->
2
3 <chapter id="backup">
4  <title>Backup and Restore</title>
5
6  <indexterm zone="backup"><primary>backup</></>
7
8  <para>
9   As with everything that contains valuable data, <productname>PostgreSQL</>
10   databases should be backed up regularly. While the procedure is
11   essentially simple, it is important to have a basic understanding of
12   the underlying techniques and assumptions.
13  </para>
14
15  <para>
16   There are three fundamentally different approaches to backing up
17   <productname>PostgreSQL</> data:
18   <itemizedlist>
19    <listitem><para><acronym>SQL</> dump</para></listitem>
20    <listitem><para>File system level backup</para></listitem>
21    <listitem><para>Continuous Archiving</para></listitem>
22   </itemizedlist>
23   Each has its own strengths and weaknesses.
24  </para>
25
26  <sect1 id="backup-dump">
27   <title><acronym>SQL</> Dump</title>
28
29   <para>
30    The idea behind the SQL-dump method is to generate a text file with SQL
31    commands that, when fed back to the server, will recreate the
32    database in the same state as it was at the time of the dump.
33    <productname>PostgreSQL</> provides the utility program
34    <xref linkend="app-pgdump"> for this purpose. The basic usage of this
35    command is:
36 <synopsis>
37 pg_dump <replaceable class="parameter">dbname</replaceable> &gt; <replaceable class="parameter">outfile</replaceable>
38 </synopsis>
39    As you see, <application>pg_dump</> writes its results to the
40    standard output. We will see below how this can be useful.
41   </para>
42
43   <para>
44    <application>pg_dump</> is a regular <productname>PostgreSQL</>
45    client application (albeit a particularly clever one). This means
46    that you can do this backup procedure from any remote host that has
47    access to the database. But remember that <application>pg_dump</>
48    does not operate with special permissions. In particular, it must
49    have read access to all tables that you want to back up, so in
50    practice you almost always have to run it as a database superuser.
51   </para>
52
53   <para>
54    To specify which database server <application>pg_dump</> should
55    contact, use the command line options <option>-h
56    <replaceable>host</></> and <option>-p <replaceable>port</></>. The
57    default host is the local host or whatever your
58    <envar>PGHOST</envar> environment variable specifies. Similarly,
59    the default port is indicated by the <envar>PGPORT</envar>
60    environment variable or, failing that, by the compiled-in default.
61    (Conveniently, the server will normally have the same compiled-in
62    default.)
63   </para>
64
65   <para>
66    As any other <productname>PostgreSQL</> client application,
67    <application>pg_dump</> will by default connect with the database
68    user name that is equal to the current operating system user name. To override
69    this, either specify the <option>-U</option> option or set the
70    environment variable <envar>PGUSER</envar>. Remember that
71    <application>pg_dump</> connections are subject to the normal
72    client authentication mechanisms (which are described in <xref
73    linkend="client-authentication">).
74   </para>
75
76   <para>
77    Dumps created by <application>pg_dump</> are internally consistent,
78    that is, updates to the database while <application>pg_dump</> is
79    running will not be in the dump. <application>pg_dump</> does not
80    block other operations on the database while it is working.
81    (Exceptions are those operations that need to operate with an
82    exclusive lock, such as <command>VACUUM FULL</command>.)
83   </para>
84
85   <important>
86    <para>
87     When your database schema relies on OIDs (for instance as foreign
88     keys) you must instruct <application>pg_dump</> to dump the OIDs
89     as well. To do this, use the <option>-o</option> command line
90     option.
91    </para>
92   </important>
93
94   <sect2 id="backup-dump-restore">
95    <title>Restoring the dump</title>
96
97    <para>
98     The text files created by <application>pg_dump</> are intended to
99     be read in by the <application>psql</application> program. The
100     general command form to restore a dump is
101 <synopsis>
102 psql <replaceable class="parameter">dbname</replaceable> &lt; <replaceable class="parameter">infile</replaceable>
103 </synopsis>
104     where <replaceable class="parameter">infile</replaceable> is what
105     you used as <replaceable class="parameter">outfile</replaceable>
106     for the <application>pg_dump</> command. The database <replaceable
107     class="parameter">dbname</replaceable> will not be created by this
108     command, you must create it yourself from <literal>template0</> before executing
109     <application>psql</> (e.g., with <literal>createdb -T template0
110     <replaceable class="parameter">dbname</></literal>).
111     <application>psql</> supports options similar to <application>pg_dump</> 
112     for controlling the database server location and the user name. See
113     <xref linkend="app-psql">'s reference page for more information.
114    </para>
115
116    <para>
117     Not only must the target database already exist before starting to
118     run the restore, but so must all the users who own objects in the
119     dumped database or were granted permissions on the objects.  If they
120     do not, then the restore will fail to recreate the objects with the
121     original ownership and/or permissions.  (Sometimes this is what you want,
122     but usually it is not.)
123    </para>
124
125    <para>
126     Once restored, it is wise to run <xref linkend="sql-analyze"
127     endterm="sql-analyze-title"> on each database so the optimizer has
128     useful statistics. An easy way to do this is to run
129     <command>vacuumdb -a -z</> to
130     <command>VACUUM ANALYZE</> all databases; this is equivalent to
131     running <command>VACUUM ANALYZE</command> manually.
132    </para>
133
134    <para>
135     The ability of <application>pg_dump</> and <application>psql</> to
136     write to or read from pipes makes it possible to dump a database
137     directly from one server to another; for example:
138 <programlisting>
139 pg_dump -h <replaceable>host1</> <replaceable>dbname</> | psql -h <replaceable>host2</> <replaceable>dbname</>
140 </programlisting>
141    </para>
142
143    <important>
144     <para>
145      The dumps produced by <application>pg_dump</> are relative to
146      <literal>template0</>. This means that any languages, procedures,
147      etc. added to <literal>template1</> will also be dumped by
148      <application>pg_dump</>. As a result, when restoring, if you are
149      using a customized <literal>template1</>, you must create the
150      empty database from <literal>template0</>, as in the example
151      above.
152     </para>
153    </important>
154
155    <para>
156     For advice on how to load large amounts of data into
157     <productname>PostgreSQL</productname> efficiently, refer to <xref
158     linkend="populate">.
159    </para>
160   </sect2>
161
162   <sect2 id="backup-dump-all">
163    <title>Using <application>pg_dumpall</></title>
164
165    <para>
166     The above mechanism is cumbersome and inappropriate when backing
167     up an entire database cluster. For this reason the <xref
168     linkend="app-pg-dumpall"> program is provided.
169     <application>pg_dumpall</> backs up each database in a given
170     cluster, and also preserves cluster-wide data such as users and
171     groups. The basic usage of this command is:
172 <synopsis>
173 pg_dumpall &gt; <replaceable>outfile</>
174 </synopsis>
175     The resulting dump can be restored with <application>psql</>:
176 <synopsis>
177 psql -f <replaceable class="parameter">infile</replaceable> postgres
178 </synopsis>
179     (Actually, you can specify any existing database name to start from,
180     but if you are reloading in an empty cluster then <literal>postgres</>
181     should generally be used.)  It is always necessary to have
182     database superuser access when restoring a <application>pg_dumpall</>
183     dump, as that is required to restore the user and group information.
184    </para>
185   </sect2>
186
187   <sect2 id="backup-dump-large">
188    <title>Handling large databases</title>
189
190    <para>
191     Since <productname>PostgreSQL</productname> allows tables larger
192     than the maximum file size on your system, it can be problematic
193     to dump such a table to a file, since the resulting file will likely
194     be larger than the maximum size allowed by your system. Since
195     <application>pg_dump</> can write to the standard output, you can
196     just use standard Unix tools to work around this possible problem.
197    </para>
198
199    <formalpara>
200     <title>Use compressed dumps.</title>
201     <para>
202      You can use your favorite compression program, for example
203      <application>gzip</application>.
204
205 <programlisting>
206 pg_dump <replaceable class="parameter">dbname</replaceable> | gzip &gt; <replaceable class="parameter">filename</replaceable>.gz
207 </programlisting>
208
209      Reload with
210
211 <programlisting>
212 createdb <replaceable class="parameter">dbname</replaceable>
213 gunzip -c <replaceable class="parameter">filename</replaceable>.gz | psql <replaceable class="parameter">dbname</replaceable>
214 </programlisting>
215
216      or
217
218 <programlisting>
219 cat <replaceable class="parameter">filename</replaceable>.gz | gunzip | psql <replaceable class="parameter">dbname</replaceable>
220 </programlisting>
221     </para>
222    </formalpara>
223
224    <formalpara>
225     <title>Use <command>split</>.</title>
226     <para>
227      The <command>split</command> command
228      allows you to split the output into pieces that are
229      acceptable in size to the underlying file system. For example, to
230      make chunks of 1 megabyte:
231
232 <programlisting>
233 pg_dump <replaceable class="parameter">dbname</replaceable> | split -b 1m - <replaceable class="parameter">filename</replaceable>
234 </programlisting>
235
236      Reload with
237
238 <programlisting>
239 createdb <replaceable class="parameter">dbname</replaceable>
240 cat <replaceable class="parameter">filename</replaceable>* | psql <replaceable class="parameter">dbname</replaceable>
241 </programlisting>
242     </para>
243    </formalpara>
244
245    <formalpara>
246     <title>Use the custom dump format.</title>
247     <para>
248      If <productname>PostgreSQL</productname> was built on a system with the
249      <application>zlib</> compression library installed, the custom dump
250      format will compress data as it writes it to the output file. This will
251      produce dump file sizes similar to using <command>gzip</command>, but it
252      has the added advantage that tables can be restored selectively. The
253      following command dumps a database using the custom dump format:
254
255 <programlisting>
256 pg_dump -Fc <replaceable class="parameter">dbname</replaceable> &gt; <replaceable class="parameter">filename</replaceable>
257 </programlisting>
258
259      A custom-format dump is not a script for <application>psql</>, but
260      instead must be restored with <application>pg_restore</>.
261      See the <xref linkend="app-pgdump"> and <xref
262      linkend="app-pgrestore"> reference pages for details.
263     </para>
264    </formalpara>
265
266   </sect2>
267  </sect1>
268
269  <sect1 id="backup-file">
270   <title>File system level backup</title>
271
272   <para>
273    An alternative backup strategy is to directly copy the files that
274    <productname>PostgreSQL</> uses to store the data in the database. In
275    <xref linkend="creating-cluster"> it is explained where these files
276    are located, but you have probably found them already if you are
277    interested in this method. You can use whatever method you prefer
278    for doing usual file system backups, for example
279
280 <programlisting>
281 tar -cf backup.tar /usr/local/pgsql/data
282 </programlisting>
283   </para>
284
285   <para>
286    There are two restrictions, however, which make this method
287    impractical, or at least inferior to the <application>pg_dump</>
288    method:
289
290    <orderedlist>
291     <listitem>
292      <para>
293       The database server <emphasis>must</> be shut down in order to
294       get a usable backup. Half-way measures such as disallowing all
295       connections will <emphasis>not</emphasis> work
296       (mainly because <command>tar</command> and similar tools do not take an
297       atomic snapshot of the state of the file system at a point in
298       time). Information about stopping the server can be found in
299       <xref linkend="server-shutdown">.  Needless to say that you
300       also need to shut down the server before restoring the data.
301      </para>
302     </listitem>
303
304     <listitem>
305      <para>
306       If you have dug into the details of the file system layout of the
307       database, you may be tempted to try to back up or restore only certain
308       individual tables or databases from their respective files or
309       directories. This will <emphasis>not</> work because the
310       information contained in these files contains only half the
311       truth. The other half is in the commit log files
312       <filename>pg_clog/*</filename>, which contain the commit status of
313       all transactions. A table file is only usable with this
314       information. Of course it is also impossible to restore only a
315       table and the associated <filename>pg_clog</filename> data
316       because that would render all other tables in the database
317       cluster useless.  So file system backups only work for complete
318       restoration of an entire database cluster.
319      </para>
320     </listitem>
321    </orderedlist>
322   </para>
323
324   <para>
325    An alternative file-system backup approach is to make a
326    <quote>consistent snapshot</quote> of the data directory, if the
327    file system supports that functionality (and you are willing to
328    trust that it is implemented correctly).  The typical procedure is
329    to make a <quote>frozen snapshot</> of the volume containing the
330    database, then copy the whole data directory (not just parts, see
331    above) from the snapshot to a backup device, then release the frozen
332    snapshot.  This will work even while the database server is running.
333    However, a backup created in this way saves
334    the database files in a state where the database server was not
335    properly shut down; therefore, when you start the database server
336    on the backed-up data, it will think the server had crashed
337    and replay the WAL log.  This is not a problem, just be aware of
338    it (and be sure to include the WAL files in your backup).
339   </para>
340
341   <para>
342    If your database is spread across multiple file systems, there may not 
343    be any way to obtain exactly-simultaneous frozen snapshots of all 
344    the volumes.  For example, if your data files and WAL log are on different
345    disks, or if tablespaces are on different file systems, it might
346    not be possible to use snapshot backup because the snapshots must be
347    simultaneous.
348    Read your file system documentation very carefully before trusting
349    to the consistent-snapshot technique in such situations.  The safest
350    approach is to shut down the database server for long enough to
351    establish all the frozen snapshots.
352   </para>
353
354   <para>
355    Another option is to use <application>rsync</> to perform a file
356    system backup.  This is done by first running <application>rsync</>
357    while the database server is running, then shutting down the database
358    server just long enough to do a second <application>rsync</>.  The
359    second <application>rsync</> will be much quicker than the first,
360    because it has relatively little data to transfer, and the end result
361    will be consistent because the server was down.  This method
362    allows a file system backup to be performed with minimal downtime.
363   </para>
364
365   <para>
366    Note that a file system backup will not necessarily be
367    smaller than an SQL dump. On the contrary, it will most likely be
368    larger. (<application>pg_dump</application> does not need to dump
369    the contents of indexes for example, just the commands to recreate
370    them.)
371   </para>
372  </sect1>
373
374  <sect1 id="continuous-archiving">
375   <title>Continuous Archiving and Point-In-Time Recovery (PITR)</title>
376
377   <indexterm zone="backup">
378    <primary>continuous archiving</primary>
379   </indexterm>
380
381   <indexterm zone="backup">
382    <primary>point-in-time recovery</primary>
383   </indexterm>
384
385   <indexterm zone="backup">
386    <primary>PITR</primary>
387   </indexterm>
388
389   <para>
390    At all times, <productname>PostgreSQL</> maintains a
391    <firstterm>write ahead log</> (WAL) in the <filename>pg_xlog/</>
392    subdirectory of the cluster's data directory. The log describes
393    every change made to the database's data files.  This log exists
394    primarily for crash-safety purposes: if the system crashes, the
395    database can be restored to consistency by <quote>replaying</> the
396    log entries made since the last checkpoint.  However, the existence
397    of the log makes it possible to use a third strategy for backing up
398    databases: we can combine a file-system-level backup with backup of
399    the WAL files.  If recovery is needed, we restore the backup and
400    then replay from the backed-up WAL files to bring the backup up to
401    current time.  This approach is more complex to administer than
402    either of the previous approaches, but it has some significant
403    benefits:
404   <itemizedlist>
405    <listitem>
406     <para>
407      We do not need a perfectly consistent backup as the starting point.
408      Any internal inconsistency in the backup will be corrected by log
409      replay (this is not significantly different from what happens during
410      crash recovery).  So we don't need file system snapshot capability,
411      just <application>tar</> or a similar archiving tool.
412     </para>
413    </listitem>
414    <listitem>
415     <para>
416      Since we can string together an indefinitely long sequence of WAL files
417      for replay, continuous backup can be achieved simply by continuing to archive
418      the WAL files.  This is particularly valuable for large databases, where
419      it may not be convenient to take a full backup frequently.
420     </para>
421    </listitem>
422    <listitem>
423     <para>
424      There is nothing that says we have to replay the WAL entries all the
425      way to the end.  We could stop the replay at any point and have a
426      consistent snapshot of the database as it was at that time.  Thus,
427      this technique supports <firstterm>point-in-time recovery</>: it is
428      possible to restore the database to its state at any time since your base
429      backup was taken.
430     </para>
431    </listitem>
432    <listitem>
433     <para>
434      If we continuously feed the series of WAL files to another
435      machine that has been loaded with the same base backup file, we
436      have a <quote>hot standby</> system: at any point we can bring up
437      the second machine and it will have a nearly-current copy of the
438      database.
439     </para>
440    </listitem>
441   </itemizedlist>
442   </para>
443
444   <para>
445    As with the plain file-system-backup technique, this method can only
446    support restoration of an entire database cluster, not a subset.
447    Also, it requires a lot of archival storage: the base backup may be bulky,
448    and a busy system will generate many megabytes of WAL traffic that
449    have to be archived.  Still, it is the preferred backup technique in
450    many situations where high reliability is needed.
451   </para>
452
453   <para>
454    To recover successfully using continuous archiving (also called "online
455    backup" by many database vendors), you need a continuous
456    sequence of archived WAL files that extends back at least as far as the
457    start time of your backup.  So to get started, you should set up and test
458    your procedure for archiving WAL files <emphasis>before</> you take your
459    first base backup.  Accordingly, we first discuss the mechanics of
460    archiving WAL files.
461   </para>
462
463   <sect2 id="backup-archiving-wal">
464    <title>Setting up WAL archiving</title>
465
466    <para>
467     In an abstract sense, a running <productname>PostgreSQL</> system
468     produces an indefinitely long sequence of WAL records.  The system
469     physically divides this sequence into WAL <firstterm>segment
470     files</>, which are normally 16MB apiece (although the size can be
471     altered when building <productname>PostgreSQL</>).  The segment
472     files are given numeric names that reflect their position in the
473     abstract WAL sequence.  When not using WAL archiving, the system
474     normally creates just a few segment files and then
475     <quote>recycles</> them by renaming no-longer-needed segment files
476     to higher segment numbers.  It's assumed that a segment file whose
477     contents precede the checkpoint-before-last is no longer of
478     interest and can be recycled.
479    </para>
480
481    <para>
482     When archiving WAL data, we want to capture the contents of each segment
483     file once it is filled, and save that data somewhere before the segment
484     file is recycled for reuse.  Depending on the application and the
485     available hardware, there could be many different ways of <quote>saving
486     the data somewhere</>: we could copy the segment files to an NFS-mounted
487     directory on another machine, write them onto a tape drive (ensuring that
488     you have a way of restoring the file with its original file name), or batch
489     them together and burn them onto CDs, or something else entirely.  To
490     provide the database administrator with as much flexibility as possible,
491     <productname>PostgreSQL</> tries not to make any assumptions about how 
492     the archiving will be done.  Instead, <productname>PostgreSQL</> lets
493     the administrator specify a shell command to be executed to copy a
494     completed segment file to wherever it needs to go.  The command could be
495     as simple as a <application>cp</>, or it could invoke a complex shell
496     script &mdash; it's all up to you.
497    </para>
498
499    <para>
500     The shell command to use is specified by the <xref
501     linkend="guc-archive-command"> configuration parameter, which in practice
502     will always be placed in the <filename>postgresql.conf</filename> file.
503     In this string,
504     any <literal>%p</> is replaced by the absolute path of the file to
505     archive, while any <literal>%f</> is replaced by the file name only.
506     Write <literal>%%</> if you need to embed an actual <literal>%</>
507     character in the command.  The simplest useful command is something
508     like
509 <programlisting>
510 archive_command = 'cp -i %p /mnt/server/archivedir/%f &lt;/dev/null'
511 </programlisting>
512     which will copy archivable WAL segments to the directory
513     <filename>/mnt/server/archivedir</>.  (This is an example, not a 
514     recommendation, and may not work on all platforms.)
515    </para>
516
517    <para>
518     The archive command will be executed under the ownership of the same
519     user that the <productname>PostgreSQL</> server is running as.  Since
520     the series of WAL files being archived contains effectively everything
521     in your database, you will want to be sure that the archived data is
522     protected from prying eyes; for example, archive into a directory that
523     does not have group or world read access.
524    </para>
525
526    <para>
527     It is important that the archive command return zero exit status if and
528     only if it succeeded.  Upon getting a zero result,
529     <productname>PostgreSQL</> will assume that the WAL segment file has been
530     successfully archived, and will remove or recycle it.
531     However, a nonzero status tells
532     <productname>PostgreSQL</> that the file was not archived; it will try
533     again periodically until it succeeds.
534    </para>
535
536    <para>
537     The archive command should generally be designed to refuse to overwrite
538     any pre-existing archive file.  This is an important safety feature to
539     preserve the integrity of your archive in case of administrator error
540     (such as sending the output of two different servers to the same archive
541     directory).
542     It is advisable to test your proposed archive command to ensure that it
543     indeed does not overwrite an existing file, <emphasis>and that it returns
544     nonzero status in this case</>.  We have found that <literal>cp -i</> does
545     this correctly on some platforms but not others.  If the chosen command
546     does not itself handle this case correctly, you should add a command
547     to test for pre-existence of the archive file.  For example, something
548     like
549 <programlisting>
550 archive_command = 'test ! -f .../%f &amp;&amp; cp %p .../%f'
551 </programlisting>
552     works correctly on most Unix variants.
553    </para>
554
555    <para>
556     While designing your archiving setup, consider what will happen if
557     the archive command fails repeatedly because some aspect requires 
558     operator intervention or the archive runs out of space. For example, this
559     could occur if you write to tape without an autochanger; when the tape 
560     fills, nothing further can be archived until the tape is swapped.
561     You should ensure that any error condition or request to a human operator
562     is reported appropriately so that the situation can be 
563     resolved relatively quickly. The <filename>pg_xlog/</> directory will
564     continue to fill with WAL segment files until the situation is resolved.
565    </para>
566
567    <para>
568     The speed of the archiving command is not important, so long as it can keep up
569     with the average rate at which your server generates WAL data.  Normal
570     operation continues even if the archiving process falls a little behind.
571     If archiving falls significantly behind, this will increase the amount of
572     data that would be lost in the event of a disaster. It will also mean that
573     the <filename>pg_xlog/</> directory will contain large numbers of
574     not-yet-archived segment files, which could eventually exceed available
575     disk space. You are advised to monitor the archiving process to ensure that
576     it is working as you intend.
577    </para>
578
579    <para>
580     If you are concerned about being able to recover right up to the
581     current instant, you may want to take additional steps to ensure that
582     the current, partially-filled WAL segment is also copied someplace.
583     This is particularly important if your server generates only little WAL
584     traffic (or has slack periods where it does so), since it could take a
585     long time before a WAL segment file is completely filled and ready to
586     archive.  One possible way to handle this is to set up a
587     <application>cron</> job that periodically (once a minute, perhaps)
588     identifies the current WAL segment file and saves it someplace safe.
589     Then the combination of the archived WAL segments and the saved current
590     segment will be enough to ensure you can always restore to within a
591     minute of current time.  This behavior is not presently built into
592     <productname>PostgreSQL</> because we did not want to complicate the
593     definition of the <xref linkend="guc-archive-command"> by requiring it
594     to keep track of successively archived, but different, copies of the
595     same WAL file.  The <xref linkend="guc-archive-command"> is only
596     invoked on completed WAL segments. Except in the case of retrying a
597     failure, it will be called only once for any given file name.
598    </para>
599
600    <para>
601     Another way to limit your exposure to data loss is to call
602     <function>pg_switch_xlog()</> periodically, such as once a minute.
603     This function forces the current WAL segment file to be completed
604     and made available to the archiving command.  This approach does
605     not work well for extremely short update intervals, however, since
606     copying a new 16MB segment file every few seconds is expensive.
607    </para>
608
609    <para>
610     In writing your archive command, you should assume that the file names to
611     be archived may be up to 64 characters long and may contain any
612     combination of ASCII letters, digits, and dots.  It is not necessary to
613     remember the original full path (<literal>%p</>) but it is necessary to
614     remember the file name (<literal>%f</>).
615    </para>
616
617    <para>
618     Note that although WAL archiving will allow you to restore any
619     modifications made to the data in your <productname>PostgreSQL</> database
620     it will not restore changes made to configuration files (that is,
621     <filename>postgresql.conf</>, <filename>pg_hba.conf</> and
622     <filename>pg_ident.conf</>), since those are edited manually rather
623     than through SQL operations.
624     You may wish to keep the configuration files in a location that will
625     be backed up by your regular file system backup procedures.  See
626     <xref linkend="runtime-config-file-locations"> for how to relocate the
627     configuration files.
628    </para>
629   </sect2>
630
631   <sect2 id="backup-base-backup">
632    <title>Making a Base Backup</title>
633
634    <para>
635     The procedure for making a base backup is relatively simple:
636   <orderedlist>
637    <listitem>
638     <para>
639      Ensure that WAL archiving is enabled and working.
640     </para>
641    </listitem>
642    <listitem>
643     <para>
644      Connect to the database as a superuser, and issue the command
645 <programlisting>
646 SELECT pg_start_backup('label');
647 </programlisting>
648      where <literal>label</> is any string you want to use to uniquely
649      identify this backup operation.  (One good practice is to use the
650      full path where you intend to put the backup dump file.)
651      <function>pg_start_backup</> creates a <firstterm>backup label</> file,
652      called <filename>backup_label</>, in the cluster directory with
653      information about your backup.
654     </para>
655
656     <para>
657      It does not matter which database within the cluster you connect to to 
658      issue this command.  You can ignore the result returned by the function;
659      but if it reports an error, deal with that before proceeding.
660     </para>
661    </listitem>
662    <listitem>
663     <para>
664      Perform the backup, using any convenient file-system-backup tool
665      such as <application>tar</> or <application>cpio</>.  It is neither
666      necessary nor desirable to stop normal operation of the database
667      while you do this.
668     </para>
669    </listitem>
670    <listitem>
671     <para>
672      Again connect to the database as a superuser, and issue the command
673 <programlisting>
674 SELECT pg_stop_backup();
675 </programlisting>
676      This should return successfully.
677     </para>
678    </listitem>
679    <listitem>
680     <para>
681      Once the WAL segment files used during the backup are archived as part
682      of normal database activity, you are done.  The file identified by
683      <function>pg_stop_backup</>'s result is the last segment that needs
684      to be archived to complete the backup.
685     </para>
686    </listitem>
687   </orderedlist>
688    </para>
689
690    <para>
691     Some backup tools that you might wish to use emit warnings or errors
692     if the files they are trying to copy change while the copy proceeds.
693     This situation is normal, and not an error, when taking a base backup of
694     an active database; so you need to ensure that you can distinguish
695     complaints of this sort from real errors.  For example, some versions
696     of <application>rsync</> return a separate exit code for <quote>vanished
697     source files</>, and you can write a driver script to accept this exit
698     code as a non-error case.  Also,
699     some versions of GNU <application>tar</> consider it an error if a file
700     is changed while <application>tar</> is copying it.  There does not seem
701     to be any very convenient way to distinguish this error from other types
702     of errors, other than manual inspection of <application>tar</>'s messages.
703     GNU <application>tar</> is therefore not the best tool for making base
704     backups.
705    </para>
706
707    <para>
708     It is not necessary to be very concerned about the amount of time elapsed
709     between <function>pg_start_backup</> and the start of the actual backup,
710     nor between the end of the backup and <function>pg_stop_backup</>; a
711     few minutes' delay won't hurt anything.  You
712     must however be quite sure that these operations are carried out in
713     sequence and do not overlap.
714    </para>
715
716    <para>
717     Be certain that your backup dump includes all of the files underneath
718     the database cluster directory (e.g., <filename>/usr/local/pgsql/data</>).
719     If you are using tablespaces that do not reside underneath this directory,
720     be careful to include them as well (and be sure that your backup dump
721     archives symbolic links as links, otherwise the restore will mess up
722     your tablespaces).
723    </para>
724
725    <para>
726     You may, however, omit from the backup dump the files within the
727     <filename>pg_xlog/</> subdirectory of the cluster directory.  This
728     slight complication is worthwhile because it reduces the risk
729     of mistakes when restoring.  This is easy to arrange if
730     <filename>pg_xlog/</> is a symbolic link pointing to someplace outside
731     the cluster directory, which is a common setup anyway for performance
732     reasons.
733    </para>
734
735    <para>
736     To make use of this backup, you will need to keep around all the WAL
737     segment files generated during and after the file system backup.
738     To aid you in doing this, the <function>pg_stop_backup</> function
739     creates a <firstterm>backup history file</> that is immediately
740     stored into the WAL archive area. This file is named after the first
741     WAL segment file that you need to have to make use of the backup.
742     For example, if the starting WAL file is
743     <literal>0000000100001234000055CD</> the backup history file will be
744     named something like
745     <literal>0000000100001234000055CD.007C9330.backup</>. (The second
746     number in the file name stands for an exact position within the WAL
747     file, and can ordinarily be ignored.) Once you have safely archived
748     the file system backup and the WAL segment files used during the
749     backup (as specified in the backup history file), all archived WAL
750     segments with names numerically less are no longer needed to recover
751     the file system backup and may be deleted. However, you should
752     consider keeping several backup sets to be absolutely certain that
753     you can recover your data.
754    </para>
755
756    <para>
757     The backup history file is just a small text file. It contains the
758     label string you gave to <function>pg_start_backup</>, as well as
759     the starting and ending times and WAL segments of the backup.
760     If you used the label to identify where the associated dump file is kept, 
761     then the archived history file is enough to tell you which dump file to
762     restore, should you need to do so.
763    </para>
764
765    <para>
766     Since you have to keep around all the archived WAL files back to your
767     last base backup, the interval between base backups should usually be
768     chosen based on how much storage you want to expend on archived WAL
769     files.  You should also consider how long you are prepared to spend
770     recovering, if recovery should be necessary &mdash; the system will have to
771     replay all those WAL segments, and that could take awhile if it has
772     been a long time since the last base backup.
773    </para>
774
775    <para>
776     It's also worth noting that the <function>pg_start_backup</> function
777     makes a file named <filename>backup_label</> in the database cluster
778     directory, which is then removed again by <function>pg_stop_backup</>.
779     This file will of course be archived as a part of your backup dump file.
780     The backup label file includes the label string you gave to
781     <function>pg_start_backup</>, as well as the time at which
782     <function>pg_start_backup</> was run, and the name of the starting WAL
783     file.  In case of confusion it will
784     therefore be possible to look inside a backup dump file and determine
785     exactly which backup session the dump file came from.
786    </para>
787
788    <para>
789     It is also possible to make a backup dump while the server is
790     stopped.  In this case, you obviously cannot use
791     <function>pg_start_backup</> or <function>pg_stop_backup</>, and
792     you will therefore be left to your own devices to keep track of which
793     backup dump is which and how far back the associated WAL files go.
794     It is generally better to follow the continuous archiving procedure above.
795    </para>
796   </sect2>
797
798   <sect2 id="backup-pitr-recovery">
799    <title>Recovering using a Continuous Archive Backup</title>
800
801    <para>
802     Okay, the worst has happened and you need to recover from your backup.
803     Here is the procedure:
804   <orderedlist>
805    <listitem>
806     <para>
807      Stop the server, if it's running.
808     </para>
809    </listitem>
810    <listitem>
811     <para>
812      If you have the space to do so,
813      copy the whole cluster data directory and any tablespaces to a temporary 
814      location in case you need them later. Note that this precaution will
815      require that you have enough free space on your system to hold two
816      copies of your existing database. If you do not have enough space, 
817      you need at the least to copy the contents of the <filename>pg_xlog</>
818      subdirectory of the cluster data directory, as it may contain logs which
819      were not archived before the system went down.
820     </para>
821    </listitem>
822    <listitem>
823     <para>
824      Clean out all existing files and subdirectories under the cluster data
825      directory and under the root directories of any tablespaces you are using.
826     </para>
827    </listitem>
828    <listitem>
829     <para>
830      Restore the database files from your backup dump.  Be careful that they
831      are restored with the right ownership (the database system user, not
832      root!) and with the right permissions.  If you are using tablespaces,
833      you may want to verify that the symbolic links in <filename>pg_tblspc/</>
834      were correctly restored.
835     </para>
836    </listitem>
837    <listitem>
838     <para>
839      Remove any files present in <filename>pg_xlog/</>; these came from the
840      backup dump and are therefore probably obsolete rather than current.
841      If you didn't archive <filename>pg_xlog/</> at all, then re-create it,
842      and be sure to re-create the subdirectory
843     <filename>pg_xlog/archive_status/</> as well.
844     </para>
845    </listitem>
846    <listitem>
847     <para>
848      If you had unarchived WAL segment files that you saved in step 2,
849      copy them into <filename>pg_xlog/</>.  (It is best to copy them,
850      not move them, so that you still have the unmodified files if a
851      problem occurs and you have to start over.)
852     </para>
853    </listitem>
854    <listitem>
855     <para>
856      Create a recovery command file <filename>recovery.conf</> in the cluster
857      data directory (see <xref linkend="recovery-config-settings">). You may 
858      also want to temporarily modify <filename>pg_hba.conf</> to prevent 
859      ordinary users from connecting until you are sure the recovery has worked.
860     </para>
861    </listitem>
862    <listitem>
863     <para>
864      Start the server.  The server will go into recovery mode and
865      proceed to read through the archived WAL files it needs.  Upon completion
866      of the recovery process, the server will rename
867      <filename>recovery.conf</> to <filename>recovery.done</> (to prevent
868      accidentally re-entering recovery mode in case of a crash later) and then
869      commence normal database operations.
870     </para>
871    </listitem>
872    <listitem>
873     <para>
874      Inspect the contents of the database to ensure you have recovered to
875      where you want to be.  If not, return to step 1.  If all is well,
876      let in your users by restoring <filename>pg_hba.conf</> to normal.
877     </para>
878    </listitem>
879   </orderedlist>
880    </para>
881
882    <para>
883     The key part of all this is to set up a recovery command file that
884     describes how you want to recover and how far the recovery should
885     run.  You can use <filename>recovery.conf.sample</> (normally
886     installed in the installation <filename>share/</> directory) as a
887     prototype.  The one thing that you absolutely must specify in
888     <filename>recovery.conf</> is the <varname>restore_command</>,
889     which tells <productname>PostgreSQL</> how to get back archived
890     WAL file segments.  Like the <varname>archive_command</>, this is
891     a shell command string.  It may contain <literal>%f</>, which is
892     replaced by the name of the desired log file, and <literal>%p</>,
893     which is replaced by the absolute path to copy the log file to.
894     Write <literal>%%</> if you need to embed an actual <literal>%</>
895     character in the command.  The simplest useful command is
896     something like
897 <programlisting>
898 restore_command = 'cp /mnt/server/archivedir/%f %p'
899 </programlisting>
900     which will copy previously archived WAL segments from the directory
901     <filename>/mnt/server/archivedir</>.  You could of course use something
902     much more complicated, perhaps even a shell script that requests the
903     operator to mount an appropriate tape.
904    </para>
905
906    <para>
907     It is important that the command return nonzero exit status on failure.
908     The command <emphasis>will</> be asked for log files that are not present
909     in the archive; it must return nonzero when so asked.  This is not an
910     error condition.  Be aware also that the base name of the <literal>%p</>
911     path will be different from <literal>%f</>; do not expect them to be
912     interchangeable.
913    </para>
914
915    <para>
916     WAL segments that cannot be found in the archive will be sought in
917     <filename>pg_xlog/</>; this allows use of recent un-archived segments.
918     However segments that are available from the archive will be used in
919     preference to files in <filename>pg_xlog/</>.  The system will not
920     overwrite the existing contents of <filename>pg_xlog/</> when retrieving
921     archived files.
922    </para>
923
924    <para>
925     Normally, recovery will proceed through all available WAL segments,
926     thereby restoring the database to the current point in time (or as
927     close as we can get given the available WAL segments).  But if you want
928     to recover to some previous point in time (say, right before the junior
929     DBA dropped your main transaction table), just specify the required
930     stopping point in <filename>recovery.conf</>.  You can specify the stop
931     point, known as the <quote>recovery target</>, either by date/time or
932     by completion of a specific transaction ID.  As of this writing only
933     the date/time option is very usable, since there are no tools to help
934     you identify with any accuracy which transaction ID to use.
935    </para>
936
937    <note>
938      <para>
939       The stop point must be after the ending time of the base backup (the
940       time of <function>pg_stop_backup</>).  You cannot use a base backup
941       to recover to a time when that backup was still going on.  (To
942       recover to such a time, you must go back to your previous base backup
943       and roll forward from there.)
944      </para>
945     </note>
946
947     <sect3 id="recovery-config-settings" xreflabel="Recovery Settings">
948      <title>Recovery Settings</title>
949
950      <para>
951       These settings can only be made in the <filename>recovery.conf</>
952       file, and apply only for the duration of the recovery. They must be
953       reset for any subsequent recovery you wish to perform. They cannot be
954       changed once recovery has begun.
955      </para>
956
957      <variablelist>
958
959      <varlistentry id="restore-command" xreflabel="restore_command">
960       <term><varname>restore_command</varname> (<type>string</type>)</term>
961       <listitem>
962        <para>
963         The shell command to execute to retrieve an archived segment of
964         the WAL file series. This parameter is required.
965         Any <literal>%f</> in the string is
966         replaced by the name of the file to retrieve from the archive,
967         and any <literal>%p</> is replaced by the absolute path to copy
968         it to on the server.
969         Write <literal>%%</> to embed an actual <literal>%</> character
970         in the command. 
971        </para>
972        <para>
973         It is important for the command to return a zero exit status if and
974         only if it succeeds.  The command <emphasis>will</> be asked for file
975         names that are not present in the archive; it must return nonzero
976         when so asked.  Examples:
977 <programlisting>
978 restore_command = 'cp /mnt/server/archivedir/%f "%p"'
979 restore_command = 'copy /mnt/server/archivedir/%f "%p"'  # Windows
980 </programlisting>
981        </para>
982       </listitem>
983      </varlistentry>
984
985      <varlistentry id="recovery-target-time" xreflabel="recovery_target_time">
986       <term><varname>recovery_target_time</varname> 
987            (<type>timestamp</type>)
988       </term>
989       <listitem>
990        <para>
991         This parameter specifies the time stamp up to which recovery
992         will proceed.
993         At most one of <varname>recovery_target_time</> and
994         <xref linkend="recovery-target-xid"> can be specified.
995         The default is to recover to the end of the WAL log.
996         The precise stopping point is also influenced by 
997         <xref linkend="recovery-target-inclusive">.
998        </para>
999       </listitem>
1000      </varlistentry>
1001
1002      <varlistentry id="recovery-target-xid" xreflabel="recovery_target_xid">
1003       <term><varname>recovery_target_xid</varname> (<type>string</type>)</term>
1004       <listitem>
1005        <para>
1006         This parameter specifies the transaction ID up to which recovery
1007         will proceed. Keep in mind 
1008         that while transaction IDs are assigned sequentially at transaction 
1009         start, transactions can complete in a different numeric order.
1010         The transactions that will be recovered are those that committed
1011         before (and optionally including) the specified one.
1012         At most one of <varname>recovery_target_xid</> and
1013         <xref linkend="recovery-target-time"> can be specified.
1014         The default is to recover to the end of the WAL log.
1015         The precise stopping point is also influenced by 
1016         <xref linkend="recovery-target-inclusive">.
1017        </para>
1018       </listitem>
1019      </varlistentry>
1020
1021      <varlistentry id="recovery-target-inclusive" 
1022                    xreflabel="recovery_target_inclusive">
1023       <term><varname>recovery_target_inclusive</varname> 
1024         (<type>boolean</type>)
1025       </term>
1026       <listitem>
1027        <para>
1028         Specifies whether we stop just after the specified recovery target
1029         (<literal>true</literal>), or just before the recovery target 
1030         (<literal>false</literal>).
1031         Applies to both <xref linkend="recovery-target-time">
1032         and <xref linkend="recovery-target-xid">, whichever one is
1033         specified for this recovery.  This indicates whether transactions
1034         having exactly the target commit time or ID, respectively, will
1035         be included in the recovery.  Default is <literal>true</>.
1036        </para>
1037       </listitem>
1038      </varlistentry>
1039
1040      <varlistentry id="recovery-target-timeline" 
1041                    xreflabel="recovery_target_timeline">
1042       <term><varname>recovery_target_timeline</varname> 
1043         (<type>string</type>)
1044       </term>
1045       <listitem>
1046        <para>
1047         Specifies recovering into a particular timeline.  The default is
1048         to recover along the same timeline that was current when the
1049         base backup was taken.  You would only need to set this parameter
1050         in complex re-recovery situations, where you need to return to
1051         a state that itself was reached after a point-in-time recovery.
1052         See <xref linkend="backup-timelines"> for discussion.
1053        </para>
1054       </listitem>
1055      </varlistentry>
1056
1057    </variablelist>
1058
1059    </sect3>
1060
1061   </sect2>
1062
1063   <sect2 id="backup-timelines">
1064    <title>Timelines</title>
1065
1066   <indexterm zone="backup">
1067    <primary>timelines</primary>
1068   </indexterm>
1069
1070    <para>
1071     The ability to restore the database to a previous point in time creates
1072     some complexities that are akin to science-fiction stories about time
1073     travel and parallel universes.  In the original history of the database,
1074     perhaps you dropped a critical table at 5:15PM on Tuesday evening.
1075     Unfazed, you get out your backup, restore to the point-in-time 5:14PM
1076     Tuesday evening, and are up and running.  In <emphasis>this</> history of
1077     the database universe, you never dropped the table at all.  But suppose
1078     you later realize this wasn't such a great idea after all, and would like
1079     to return to some later point in the original history.  You won't be able
1080     to if, while your database was up-and-running, it overwrote some of the
1081     sequence of WAL segment files that led up to the time you now wish you
1082     could get back to.  So you really want to distinguish the series of
1083     WAL records generated after you've done a point-in-time recovery from
1084     those that were generated in the original database history.
1085    </para>
1086
1087    <para>
1088     To deal with these problems, <productname>PostgreSQL</> has a notion
1089     of <firstterm>timelines</>.  Each time you recover to a point-in-time
1090     earlier than the end of the WAL sequence, a new timeline is created
1091     to identify the series of WAL records generated after that recovery.
1092     (If recovery proceeds all the way to the end of WAL, however, we do not
1093     start a new timeline: we just extend the existing one.)  The timeline
1094     ID number is part of WAL segment file names, and so a new timeline does
1095     not overwrite the WAL data generated by previous timelines.  It is
1096     in fact possible to archive many different timelines.  While that might
1097     seem like a useless feature, it's often a lifesaver.  Consider the
1098     situation where you aren't quite sure what point-in-time to recover to,
1099     and so have to do several point-in-time recoveries by trial and error
1100     until you find the best place to branch off from the old history.  Without
1101     timelines this process would soon generate an unmanageable mess.  With
1102     timelines, you can recover to <emphasis>any</> prior state, including
1103     states in timeline branches that you later abandoned.
1104    </para>
1105
1106    <para>
1107     Each time a new timeline is created, <productname>PostgreSQL</> creates
1108     a <quote>timeline history</> file that shows which timeline it branched
1109     off from and when.  These history files are necessary to allow the system
1110     to pick the right WAL segment files when recovering from an archive that
1111     contains multiple timelines.  Therefore, they are archived into the WAL
1112     archive area just like WAL segment files.  The history files are just
1113     small text files, so it's cheap and appropriate to keep them around
1114     indefinitely (unlike the segment files which are large).  You can, if
1115     you like, add comments to a history file to make your own notes about
1116     how and why this particular timeline came to be.  Such comments will be
1117     especially valuable when you have a thicket of different timelines as
1118     a result of experimentation.
1119    </para>
1120
1121    <para>
1122     The default behavior of recovery is to recover along the same timeline
1123     that was current when the base backup was taken.  If you want to recover
1124     into some child timeline (that is, you want to return to some state that
1125     was itself generated after a recovery attempt), you need to specify the
1126     target timeline ID in <filename>recovery.conf</>.  You cannot recover into
1127     timelines that branched off earlier than the base backup.
1128    </para>
1129   </sect2>
1130
1131   <sect2 id="continuous-archiving-caveats">
1132    <title>Caveats</title>
1133
1134    <para>
1135     At this writing, there are several limitations of the continuous archiving
1136     technique.  These will probably be fixed in future releases:
1137
1138   <itemizedlist>
1139    <listitem>
1140     <para>
1141      Operations on hash indexes are
1142      not presently WAL-logged, so replay will not update these indexes.
1143      The recommended workaround is to manually <command>REINDEX</> each
1144      such index after completing a recovery operation.
1145     </para>
1146    </listitem>
1147
1148    <listitem>
1149     <para>
1150      If a <command>CREATE DATABASE</> command is executed while a base
1151      backup is being taken, and then the template database that the
1152      <command>CREATE DATABASE</> copied is modified while the base backup
1153      is still in progress, it is possible that recovery will cause those
1154      modifications to be propagated into the created database as well.
1155      This is of course undesirable.  To avoid this risk, it is best not to
1156      modify any template databases while taking a base backup.
1157     </para>
1158    </listitem>
1159
1160    <listitem>
1161     <para>
1162      <command>CREATE TABLESPACE</> commands are WAL-logged with the literal
1163      absolute path, and will therefore be replayed as tablespace creations
1164      with the same absolute path.  This might be undesirable if the log is
1165      being replayed on a different machine.  It can be dangerous even if
1166      the log is being replayed on the same machine, but into a new data
1167      directory: the replay will still overwrite the contents of the original
1168      tablespace.  To avoid potential gotchas of this sort, the best practice
1169      is to take a new base backup after creating or dropping tablespaces.
1170     </para>
1171    </listitem>
1172   </itemizedlist>
1173    </para>
1174
1175    <para>
1176     It should also be noted that the default <acronym>WAL</acronym>
1177     format is fairly bulky since it includes many disk page snapshots.
1178     These page snapshots are designed to support crash recovery,
1179     since we may need to fix partially-written disk pages.  Depending
1180     on your system hardware and software, the risk of partial writes may
1181     be small enough to ignore, in which case you can significantly reduce
1182     the total volume of archived logs by turning off page snapshots 
1183     using the <xref linkend="guc-full-page-writes"> parameter.
1184     (Read the notes and warnings in 
1185     <xref linkend="wal"> before you do so.)
1186     Turning off page snapshots does not prevent use of the logs for PITR
1187     operations.
1188     An area for future development is to compress archived WAL data by
1189     removing unnecessary page copies even when <varname>full_page_writes</>
1190     is on.  In the meantime, administrators
1191     may wish to reduce the number of page snapshots included in WAL by
1192     increasing the checkpoint interval parameters as much as feasible.
1193    </para>
1194   </sect2>
1195  </sect1>
1196
1197  <sect1 id="migration">
1198   <title>Migration Between Releases</title>
1199
1200   <indexterm zone="migration">
1201    <primary>upgrading</primary>
1202   </indexterm>
1203
1204   <indexterm zone="migration">
1205    <primary>version</primary>
1206    <secondary>compatibility</secondary>
1207   </indexterm>
1208
1209   <para>
1210    This section discusses how to migrate your database data from one
1211    <productname>PostgreSQL</> release to a newer one.
1212    The software installation procedure <foreignphrase>per se</> is not the
1213    subject of this section; those details are in <xref linkend="installation">.
1214   </para>
1215
1216   <para>
1217    As a general rule, the internal data storage format is subject to
1218    change between major releases of <productname>PostgreSQL</> (where
1219    the number after the first dot changes). This does not apply to
1220    different minor releases under the same major release (where the
1221    number after the second dot changes); these always have compatible
1222    storage formats. For example, releases 7.2.1, 7.3.2, and 7.4 are
1223    not compatible, whereas 7.2.1 and 7.2.2 are. When you update
1224    between compatible versions, you can simply replace the executables
1225    and reuse the data directory on disk. Otherwise you need to back
1226    up your data and restore it on the new server.  This has to be done
1227    using <application>pg_dump</>; file system level backup methods
1228    obviously won't work. There are checks in place that prevent you
1229    from using a data directory with an incompatible version of
1230    <productname>PostgreSQL</productname>, so no great harm can be done by
1231    trying to start the wrong server version on a data directory.
1232   </para>
1233
1234   <para>
1235    It is recommended that you use the <application>pg_dump</> and
1236    <application>pg_dumpall</> programs from the newer version of
1237    <productname>PostgreSQL</>, to take advantage of any enhancements
1238    that may have been made in these programs.  Current releases of the
1239    dump programs can read data from any server version back to 7.0.
1240   </para>
1241
1242   <para>
1243    The least downtime can be achieved by installing the new server in
1244    a different directory and running both the old and the new servers
1245    in parallel, on different ports. Then you can use something like
1246
1247 <programlisting>
1248 pg_dumpall -p 5432 | psql -d postgres -p 6543
1249 </programlisting>
1250
1251    to transfer your data.  Or use an intermediate file if you want.
1252    Then you can shut down the old server and start the new server at
1253    the port the old one was running at. You should make sure that the
1254    old database is not updated after you run <application>pg_dumpall</>,
1255    otherwise you will obviously lose that data. See <xref
1256    linkend="client-authentication"> for information on how to prohibit
1257    access.
1258   </para>
1259
1260   <para>
1261    In practice you probably want to test your client
1262    applications on the new setup before switching over completely.
1263    This is another reason for setting up concurrent installations
1264    of old and new versions.
1265   </para>
1266
1267   <para>
1268    If you cannot or do not want to run two servers in parallel you can
1269    do the backup step before installing the new version, bring down
1270    the server, move the old version out of the way, install the new
1271    version, start the new server, restore the data. For example:
1272
1273 <programlisting>
1274 pg_dumpall &gt; backup
1275 pg_ctl stop
1276 mv /usr/local/pgsql /usr/local/pgsql.old
1277 cd ~/postgresql-&version;
1278 gmake install
1279 initdb -D /usr/local/pgsql/data
1280 postgres -D /usr/local/pgsql/data
1281 psql -f backup postgres
1282 </programlisting>
1283
1284    See <xref linkend="runtime"> about ways to start and stop the
1285    server and other details. The installation instructions will advise
1286    you of strategic places to perform these steps.
1287   </para>
1288
1289   <note>
1290    <para>
1291     When you <quote>move the old installation out of the way</quote>
1292     it may no longer be perfectly usable. Some of the executable programs
1293     contain absolute paths to various installed programs and data files.
1294     This is usually not a big problem but if you plan on using two
1295     installations in parallel for a while you should assign them
1296     different installation directories at build time.  (This problem
1297     is rectified in <productname>PostgreSQL</> 8.0 and later, but you
1298     need to be wary of moving older installations.)
1299    </para>
1300   </note>
1301  </sect1>
1302 </chapter>
1303
1304 <!-- Keep this comment at the end of the file
1305 Local variables:
1306 mode:sgml
1307 sgml-omittag:nil
1308 sgml-shorttag:t
1309 sgml-minimize-attributes:nil
1310 sgml-always-quote-attributes:t
1311 sgml-indent-step:1
1312 sgml-indent-tabs-mode:nil
1313 sgml-indent-data:t
1314 sgml-parent-document:nil
1315 sgml-default-dtd-file:"./reference.ced"
1316 sgml-exposed-tags:nil
1317 sgml-local-catalogs:("/usr/share/sgml/catalog")
1318 sgml-local-ecat-files:nil
1319 End:
1320 -->