📄 backup.sgml
字号:
<!--$Header: /cvsroot/pgsql/doc/src/sgml/backup.sgml,v 2.30.2.1 2003/11/04 09:45:29 petere Exp $--><chapter id="backup"> <title>Backup and Restore</title> <indexterm zone="backup"><primary>backup</></> <para> As everything that contains valuable data, <productname>PostgreSQL</> databases should be backed up regularly. While the procedure is essentially simple, it is important to have a basic understanding of the underlying techniques and assumptions. </para> <para> There are two fundamentally different approaches to backing up <productname>PostgreSQL</> data: <itemizedlist> <listitem><para><acronym>SQL</> dump</para></listitem> <listitem><para>File system level backup</para></listitem> </itemizedlist> </para> <sect1 id="backup-dump"> <title><acronym>SQL</> Dump</title> <para> The idea behind the SQL-dump method is to generate a text file with SQL commands that, when fed back to the server, will recreate the database in the same state as it was at the time of the dump. <productname>PostgreSQL</> provides the utility program <application>pg_dump</> for this purpose. The basic usage of this command is:<synopsis>pg_dump <replaceable class="parameter">dbname</replaceable> > <replaceable class="parameter">outfile</replaceable></synopsis> As you see, <application>pg_dump</> writes its results to the standard output. We will see below how this can be useful. </para> <para> <application>pg_dump</> is a regular <productname>PostgreSQL</> client application (albeit a particularly clever one). This means that you can do this backup procedure from any remote host that has access to the database. But remember that <application>pg_dump</> does not operate with special permissions. In particular, you must have read access to all tables that you want to back up, so in practice you almost always have to be a database superuser. </para> <para> To specify which database server <application>pg_dump</> should contact, use the command line options <option>-h <replaceable>host</></> and <option>-p <replaceable>port</></>. The default host is the local host or whatever your <envar>PGHOST</envar> environment variable specifies. Similarly, the default port is indicated by the <envar>PGPORT</envar> environment variable or, failing that, by the compiled-in default. (Conveniently, the server will normally have the same compiled-in default.) </para> <para> As any other <productname>PostgreSQL</> client application, <application>pg_dump</> will by default connect with the database user name that is equal to the current operating system user name. To override this, either specify the <option>-U</option> option or set the environment variable <envar>PGUSER</envar>. Remember that <application>pg_dump</> connections are subject to the normal client authentication mechanisms (which are described in <xref linkend="client-authentication">). </para> <para> Dumps created by <application>pg_dump</> are internally consistent, that is, updates to the database while <application>pg_dump</> is running will not be in the dump. <application>pg_dump</> does not block other operations on the database while it is working. (Exceptions are those operations that need to operate with an exclusive lock, such as <command>VACUUM FULL</command>.) </para> <important> <para> When your database schema relies on OIDs (for instance as foreign keys) you must instruct <application>pg_dump</> to dump the OIDs as well. To do this, use the <option>-o</option> command line option. <quote>Large objects</> are not dumped by default, either. See <application>pg_dump</>'s command reference page if you use large objects. </para> </important> <sect2 id="backup-dump-restore"> <title>Restoring the dump</title> <para> The text files created by <application>pg_dump</> are intended to be read in by the <application>psql</application> program. The general command form to restore a dump is<synopsis>psql <replaceable class="parameter">dbname</replaceable> < <replaceable class="parameter">infile</replaceable></synopsis> where <replaceable class="parameter">infile</replaceable> is what you used as <replaceable class="parameter">outfile</replaceable> for the <command>pg_dump</> command. The database <replaceable class="parameter">dbname</replaceable> will not be created by this command, you must create it yourself from <literal>template0</> before executing <application>psql</> (e.g., with <literal>createdb -T template0 <replaceable class="parameter">dbname</></literal>). <application>psql</> supports similar options to <application>pg_dump</> for controlling the database server location and the user name. See its reference page for more information. </para> <para> If the objects in the original database were owned by different users, then the dump will instruct <application>psql</> to connect as each affected user in turn and then create the relevant objects. This way the original ownership is preserved. This also means, however, that all these users must already exist, and furthermore that you must be allowed to connect as each of them. It might therefore be necessary to temporarily relax the client authentication settings. </para> <para> Once restored, it is wise to run <command>ANALYZE</> on each database so the optimizer has useful statistics. You can also run <command>vacuumdb -a -z</> to <command>ANALYZE</> all databases. </para> <para> The ability of <application>pg_dump</> and <application>psql</> to write to or read from pipes makes it possible to dump a database directly from one server to another; for example:<programlisting>pg_dump -h <replaceable>host1</> <replaceable>dbname</> | psql -h <replaceable>host2</> <replaceable>dbname</></programlisting> </para> <important> <para> The dumps produced by <application>pg_dump</> are relative to <literal>template0</>. This means that any languages, procedures, etc. added to <literal>template1</> will also be dumped by <application>pg_dump</>. As a result, when restoring, if you are using a customized <literal>template1</>, you must create the empty database from <literal>template0</>, as in the example above. </para> </important> <tip> <para> Restore performance can be improved by increasing the configuration parameter <varname>sort_mem</varname> (see <xref linkend="runtime-config-resource-memory">). </para> </tip> </sect2> <sect2 id="backup-dump-all"> <title>Using <command>pg_dumpall</></title> <para> The above mechanism is cumbersome and inappropriate when backing up an entire database cluster. For this reason the <application>pg_dumpall</> program is provided. <application>pg_dumpall</> backs up each database in a given cluster, and also preserves cluster-wide data such as users and groups. The call sequence for <application>pg_dumpall</> is simply<synopsis>pg_dumpall > <replaceable>outfile</></synopsis> The resulting dump can be restored with <application>psql</>:<synopsis>psql template1 < <replaceable class="parameter">infile</replaceable></synopsis> (Actually, you can specify any existing database name to start from, but if you are reloading in an empty cluster then <literal>template1</> is the only available choice.) It is always necessary to have database superuser access when restoring a <application>pg_dumpall</> dump, as that is required to restore the user and group information. </para> </sect2> <sect2 id="backup-dump-large"> <title>Large Databases</title> <para> Since <productname>PostgreSQL</productname> allows tables larger than the maximum file size on your system, it can be problematic to dump such a table to a file, since the resulting file will likely be larger than the maximum size allowed by your system. As <application>pg_dump</> can write to the standard output, you can just use standard Unix tools to work around this possible problem. </para> <formalpara> <title>Use compressed dumps.</title> <para> You can use your favorite compression program, for example <application>gzip</application>.<programlisting>pg_dump <replaceable class="parameter">dbname</replaceable> | gzip > <replaceable class="parameter">filename</replaceable>.gz</programlisting> Reload with<programlisting>createdb <replaceable class="parameter">dbname</replaceable>gunzip -c <replaceable class="parameter">filename</replaceable>.gz | psql <replaceable class="parameter">dbname</replaceable></programlisting> or<programlisting>cat <replaceable class="parameter">filename</replaceable>.gz | gunzip | psql <replaceable class="parameter">dbname</replaceable></programlisting> </para> </formalpara> <formalpara> <title>Use <command>split</>.</title> <para> The <command>split</command> command allows you to split the output into pieces that are acceptable in size to the underlying file system. For example, to make chunks of 1 megabyte:<programlisting>pg_dump <replaceable class="parameter">dbname</replaceable> | split -b 1m - <replaceable class="parameter">filename</replaceable></programlisting> Reload with<programlisting>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -